ekaterinadimitrova2 commented on a change in pull request #1421:
URL: https://github.com/apache/cassandra/pull/1421#discussion_r792092228



##########
File path: src/java/org/apache/cassandra/db/virtual/CQLMetricsTable.java
##########
@@ -0,0 +1,87 @@
+/*
+ * 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 com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.db.marshal.DoubleType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.metrics.CQLMetrics;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.cql3.QueryProcessor;
+
+// Virtual table for CQL metrics
+public class CQLMetricsTable extends AbstractVirtualTable
+{
+    public static final String TABLE_NAME = "cql_metrics";
+    public static final String PREPARED_STATEMENTS_COUNT_COL = 
"prepared_statements_count";
+    public static final String PREPARED_STATEMENTS_EVICTED_COL = 
"prepared_statements_evicted";
+    public static final String PREPARED_STATEMENTS_EXECUTED_COL = 
"prepared_statements_executed";
+    public static final String PREPARED_STATEMENTS_RATIO_COL = 
"prepared_statements_ratio";
+    public static final String REGULAR_STATEMENTS_EXECUTED_COL = 
"regular_statements_executed";
+    public static final String NAME_COL = "name";
+    public static final String VALUE_ROW = "value";
+
+    private final CQLMetrics cqlMetrics;
+
+    // Default constructor references query processor metrics
+    CQLMetricsTable(String keyspace)
+    {
+        this(keyspace, QueryProcessor.metrics);
+    }
+
+    // For dependency injection
+    @VisibleForTesting
+    CQLMetricsTable(String keyspace, CQLMetrics cqlMetrics)
+    {
+        // create virtual table with this name
+        super(TableMetadata.builder(keyspace, TABLE_NAME)
+                           .kind(TableMetadata.Kind.VIRTUAL)
+                           .partitioner(new 
LocalPartitioner(UTF8Type.instance))
+                           .addPartitionKeyColumn(NAME_COL, UTF8Type.instance)
+                           .addRegularColumn(PREPARED_STATEMENTS_COUNT_COL, 
DoubleType.instance)
+                           .addRegularColumn(PREPARED_STATEMENTS_EVICTED_COL, 
DoubleType.instance)
+                           .addRegularColumn(PREPARED_STATEMENTS_EXECUTED_COL, 
DoubleType.instance)
+                           .addRegularColumn(PREPARED_STATEMENTS_RATIO_COL, 
DoubleType.instance)
+                           .addRegularColumn(REGULAR_STATEMENTS_EXECUTED_COL, 
DoubleType.instance)
+                           .build());
+        this.cqlMetrics = cqlMetrics;
+    }
+
+    @Override
+    public DataSet data()
+    {
+        // populate metrics in the virtual table
+        SimpleDataSet result = new SimpleDataSet(metadata());
+        addRow(result, VALUE_ROW, cqlMetrics);
+
+        return result;
+    }
+
+    private void addRow(SimpleDataSet dataSet, String name, CQLMetrics 
cqlMetrics)
+    {
+        dataSet.row(name)
+               .column(PREPARED_STATEMENTS_COUNT_COL, 
Double.valueOf(cqlMetrics.preparedStatementsCount.getValue()))

Review comment:
       We just talked with @yifan-c and we agree that the current version is a 
better and more consistent one actually. Normally we list on the left what we 
provide value for but indeed metrics are on top as he pointed an example. 

##########
File path: src/java/org/apache/cassandra/db/virtual/CQLMetricsTable.java
##########
@@ -0,0 +1,87 @@
+/*
+ * 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 com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.db.marshal.DoubleType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.metrics.CQLMetrics;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.cql3.QueryProcessor;
+
+// Virtual table for CQL metrics
+public class CQLMetricsTable extends AbstractVirtualTable
+{
+    public static final String TABLE_NAME = "cql_metrics";
+    public static final String PREPARED_STATEMENTS_COUNT_COL = 
"prepared_statements_count";
+    public static final String PREPARED_STATEMENTS_EVICTED_COL = 
"prepared_statements_evicted";
+    public static final String PREPARED_STATEMENTS_EXECUTED_COL = 
"prepared_statements_executed";
+    public static final String PREPARED_STATEMENTS_RATIO_COL = 
"prepared_statements_ratio";
+    public static final String REGULAR_STATEMENTS_EXECUTED_COL = 
"regular_statements_executed";
+    public static final String NAME_COL = "name";
+    public static final String VALUE_ROW = "value";
+
+    private final CQLMetrics cqlMetrics;

Review comment:
       I see, ok

##########
File path: src/java/org/apache/cassandra/db/virtual/CQLMetricsTable.java
##########
@@ -0,0 +1,87 @@
+/*
+ * 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 com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.db.marshal.DoubleType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.metrics.CQLMetrics;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.cql3.QueryProcessor;
+
+// Virtual table for CQL metrics
+public class CQLMetricsTable extends AbstractVirtualTable
+{
+    public static final String TABLE_NAME = "cql_metrics";
+    public static final String PREPARED_STATEMENTS_COUNT_COL = 
"prepared_statements_count";
+    public static final String PREPARED_STATEMENTS_EVICTED_COL = 
"prepared_statements_evicted";
+    public static final String PREPARED_STATEMENTS_EXECUTED_COL = 
"prepared_statements_executed";
+    public static final String PREPARED_STATEMENTS_RATIO_COL = 
"prepared_statements_ratio";
+    public static final String REGULAR_STATEMENTS_EXECUTED_COL = 
"regular_statements_executed";
+    public static final String NAME_COL = "name";
+    public static final String VALUE_ROW = "value";

Review comment:
       SGTM

##########
File path: test/unit/org/apache/cassandra/db/virtual/CQLMetricsTableTest.java
##########
@@ -0,0 +1,116 @@
+/*
+ * 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.util.concurrent.atomic.AtomicInteger;
+
+import com.google.common.collect.ImmutableList;
+
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Session;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.BeforeClass;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.metrics.CQLMetrics;
+
+public class CQLMetricsTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+
+    @BeforeClass
+    public static void setUpClass()
+    {
+        CQLTester.setUpClass();
+    }
+
+    private void queryAndValidateMetrics(CQLMetrics expectedMetrics) throws 
Throwable
+    {
+        String getMetricsQuery = "SELECT * FROM " + KS_NAME + "." + 
CQLMetricsTable.TABLE_NAME;
+        ResultSet vtsRows = executeNet(getMetricsQuery);
+
+        // validate - number of columns
+        assertEquals(6, vtsRows.getColumnDefinitions().size());
+
+        AtomicInteger rowCount = new AtomicInteger(0);
+        vtsRows.forEach(r -> {
+            assertEquals(expectedMetrics.preparedStatementsCount.getValue(), 
r.getDouble(CQLMetricsTable.PREPARED_STATEMENTS_COUNT_COL), 0);
+            assertEquals(expectedMetrics.preparedStatementsEvicted.getCount(), 
r.getDouble(CQLMetricsTable.PREPARED_STATEMENTS_EVICTED_COL), 0);
+            
assertEquals(expectedMetrics.preparedStatementsExecuted.getCount(), 
r.getDouble(CQLMetricsTable.PREPARED_STATEMENTS_EXECUTED_COL), 0);
+            assertEquals(expectedMetrics.preparedStatementsRatio.getValue(), 
r.getDouble(CQLMetricsTable.PREPARED_STATEMENTS_RATIO_COL), 0.01);
+            assertEquals(expectedMetrics.regularStatementsExecuted.getCount(), 
r.getDouble(CQLMetricsTable.REGULAR_STATEMENTS_EXECUTED_COL), 0);
+            rowCount.getAndIncrement();
+        });
+
+        // validate - number of rows
+        assertEquals(1, rowCount.get());
+    }
+
+    @Test
+    public void testUsingPrepareStmts() throws Throwable
+    {
+        CQLMetricsTable table = new CQLMetricsTable(KS_NAME);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, 
ImmutableList.of(table)));

Review comment:
       I see, yes, sorry for the noise, I missed that during the first pass

##########
File path: src/java/org/apache/cassandra/db/virtual/CQLMetricsTable.java
##########
@@ -0,0 +1,87 @@
+/*
+ * 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 com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.db.marshal.DoubleType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.metrics.CQLMetrics;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.cql3.QueryProcessor;
+
+// Virtual table for CQL metrics

Review comment:
       `I feel comments are like chocolates, like to have as many as we can :-)`
   Wow, how did you know I am a chocoholic :D  Jokes aside, while I agree with 
you and unfortunately, we lack them often, in this case we just repeat things 
that are on the next line - like in this case you see it is Virtual Table and 
the CQL metrics is in the name. I don't mean to be super particular here but I 
know other engineers on the project are serious on that (talking from 
experience from my own reviews where I tended to put a lot of comments 
sometimes :D ) so just saying. 
   Also, in this case these comments are probably not at places that we expect 
to change a lot but according to the Clean Code rules - if we can make the code 
self explanatory that is the best (I think you already have that quite well 
done), better to skip them as in time code changes, comments get pulled away 
from where they were meant to refer to and it becomes confusing. 




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to