Repository: cassandra Updated Branches: refs/heads/trunk 53c71949d -> 46a5514c2
Add a virtual table to expose active client connections patch by Chris Lohfink; reviewed by Aleksey Yeschenko for CASSANDRA-14458 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/46a5514c Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/46a5514c Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/46a5514c Branch: refs/heads/trunk Commit: 46a5514c2aa7f377e8dc4cfd0d701b940f3137c7 Parents: 53c7194 Author: Chris Lohfink <[email protected]> Authored: Thu Jun 21 11:36:30 2018 -0500 Committer: Aleksey Yeshchenko <[email protected]> Committed: Thu Jun 21 18:30:50 2018 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/db/virtual/ClientsTable.java | 86 ++++++++++++++++++++ .../db/virtual/SystemViewsKeyspace.java | 2 +- .../apache/cassandra/metrics/ClientMetrics.java | 10 +++ .../cassandra/transport/ConnectedClient.java | 4 +- 5 files changed, 100 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/46a5514c/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 598eaff..ce945df 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.0 + * Add a virtual table to expose active client connections (CASSANDRA-14458) * Clean up and refactor client metrics (CASSANDRA-14524) * Nodetool import row cache invalidation races with adding sstables to tracker (CASSANDRA-14529) * Fix assertions in LWTs after TableMetadata was made immutable (CASSANDRA-14356) http://git-wip-us.apache.org/repos/asf/cassandra/blob/46a5514c/src/java/org/apache/cassandra/db/virtual/ClientsTable.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/virtual/ClientsTable.java b/src/java/org/apache/cassandra/db/virtual/ClientsTable.java new file mode 100644 index 0000000..98d1a28 --- /dev/null +++ b/src/java/org/apache/cassandra/db/virtual/ClientsTable.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.cassandra.db.virtual; + +import java.net.InetSocketAddress; + +import org.apache.cassandra.db.marshal.*; +import org.apache.cassandra.metrics.ClientMetrics; +import org.apache.cassandra.schema.TableMetadata; +import org.apache.cassandra.transport.ConnectedClient; + +final class ClientsTable extends AbstractVirtualTable +{ + private static final String ADDRESS = "address"; + private static final String PORT = "port"; + private static final String HOSTNAME = "hostname"; + private static final String USERNAME = "username"; + private static final String CONNECTION_STAGE = "connection_stage"; + private static final String PROTOCOL_VERSION = "protocol_version"; + private static final String DRIVER_NAME = "driver_name"; + private static final String DRIVER_VERSION = "driver_version"; + private static final String REQUEST_COUNT = "request_count"; + private static final String SSL_ENABLED = "ssl_enabled"; + private static final String SSL_PROTOCOL = "ssl_protocol"; + private static final String SSL_CIPHER_SUITE = "ssl_cipher_suite"; + + ClientsTable(String keyspace) + { + super(TableMetadata.builder(keyspace, "clients") + .comment("currently connected clients") + .kind(TableMetadata.Kind.VIRTUAL) + .addPartitionKeyColumn(ADDRESS, InetAddressType.instance) + .addClusteringColumn(PORT, Int32Type.instance) + .addRegularColumn(HOSTNAME, UTF8Type.instance) + .addRegularColumn(USERNAME, UTF8Type.instance) + .addRegularColumn(CONNECTION_STAGE, UTF8Type.instance) + .addRegularColumn(PROTOCOL_VERSION, Int32Type.instance) + .addRegularColumn(DRIVER_NAME, UTF8Type.instance) + .addRegularColumn(DRIVER_VERSION, UTF8Type.instance) + .addRegularColumn(REQUEST_COUNT, LongType.instance) + .addRegularColumn(SSL_ENABLED, BooleanType.instance) + .addRegularColumn(SSL_PROTOCOL, UTF8Type.instance) + .addRegularColumn(SSL_CIPHER_SUITE, UTF8Type.instance) + .build()); + } + + @Override + public DataSet data() + { + SimpleDataSet result = new SimpleDataSet(metadata()); + + for (ConnectedClient client : ClientMetrics.instance.allConnectedClients()) + { + InetSocketAddress remoteAddress = client.remoteAddress(); + + result.row(remoteAddress.getAddress(), remoteAddress.getPort()) + .column(HOSTNAME, remoteAddress.getHostName()) + .column(USERNAME, client.username().orElse(null)) + .column(CONNECTION_STAGE, client.stage().toString().toLowerCase()) + .column(PROTOCOL_VERSION, client.protocolVersion()) + .column(DRIVER_NAME, client.driverName().orElse(null)) + .column(DRIVER_VERSION, client.driverVersion().orElse(null)) + .column(REQUEST_COUNT, client.requestCount()) + .column(SSL_ENABLED, client.sslEnabled()) + .column(SSL_PROTOCOL, client.sslProtocol().orElse(null)) + .column(SSL_CIPHER_SUITE, client.sslCipherSuite().orElse(null)); + } + + return result; + } +} http://git-wip-us.apache.org/repos/asf/cassandra/blob/46a5514c/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java b/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java index 5d33a63..53c01a4 100644 --- a/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java +++ b/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java @@ -27,6 +27,6 @@ public final class SystemViewsKeyspace extends VirtualKeyspace private SystemViewsKeyspace() { - super(NAME, ImmutableList.of(new SSTableTasksTable(NAME))); + super(NAME, ImmutableList.of(new SSTableTasksTable(NAME), new ClientsTable(NAME))); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/46a5514c/src/java/org/apache/cassandra/metrics/ClientMetrics.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/metrics/ClientMetrics.java b/src/java/org/apache/cassandra/metrics/ClientMetrics.java index 5e7720a..a80033a 100644 --- a/src/java/org/apache/cassandra/metrics/ClientMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ClientMetrics.java @@ -54,6 +54,16 @@ public final class ClientMetrics authFailure.mark(); } + public List<ConnectedClient> allConnectedClients() + { + List<ConnectedClient> clients = new ArrayList<>(); + + for (Server server : servers) + clients.addAll(server.getConnectedClients()); + + return clients; + } + public synchronized void init(Collection<Server> servers) { if (initialized) http://git-wip-us.apache.org/repos/asf/cassandra/blob/46a5514c/src/java/org/apache/cassandra/transport/ConnectedClient.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/transport/ConnectedClient.java b/src/java/org/apache/cassandra/transport/ConnectedClient.java index 0776bf8..ca100f2 100644 --- a/src/java/org/apache/cassandra/transport/ConnectedClient.java +++ b/src/java/org/apache/cassandra/transport/ConnectedClient.java @@ -93,7 +93,7 @@ public final class ConnectedClient return Optional.ofNullable(state().getRawKeyspace()); } - public boolean isEncrypted() + public boolean sslEnabled() { return null != sslHandler(); } @@ -136,7 +136,7 @@ public final class ConnectedClient .put(DRIVER_VERSION, driverVersion().orElse(UNDEFINED)) .put(REQUESTS, String.valueOf(requestCount())) .put(KEYSPACE, keyspace().orElse("")) - .put(SSL, Boolean.toString(isEncrypted())) + .put(SSL, Boolean.toString(sslEnabled())) .put(CIPHER, sslCipherSuite().orElse(UNDEFINED)) .put(PROTOCOL, sslProtocol().orElse(UNDEFINED)) .build(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
