You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2018/06/21 17:32:29 UTC

cassandra git commit: Add a virtual table to expose active client connections

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 <cl...@apple.com>
Authored: Thu Jun 21 11:36:30 2018 -0500
Committer: Aleksey Yeshchenko <al...@apple.com>
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: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org