This is an automated email from the ASF dual-hosted git repository.
samt pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 73cd2c56ca Add histogram columns to timer metrics vtable
73cd2c56ca is described below
commit 73cd2c56ca07fc4bd1c77a7a45e1d6e27941fefa
Author: Sam Tunnicliffe <[email protected]>
AuthorDate: Thu Mar 20 16:35:47 2025 +0000
Add histogram columns to timer metrics vtable
Patch by Sam Tunnicliffe; reviewed by Maxim Muzafarov for
CASSANDRA-20466
---
CHANGES.txt | 1 +
.../cassandra/db/virtual/model/TimerMetricRow.java | 51 ++++++++++++++++++++++
.../db/virtual/walker/TimerMetricRowWalker.java | 21 ++++++++-
.../metrics/JmxVirtualTableMetricsTest.java | 8 ++++
4 files changed, 80 insertions(+), 1 deletion(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index 3f622f8976..324af6e281 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
5.1
+ * Add min/max/mean/percentiles to timer metrics vtable (CASSANDRA-20466)
* Add support for time, date, timestamp types in scalar constraint
(CASSANDRA-20274)
* Add regular expression constraint (CASSANDRA-20275)
* Improve constraints autocompletion (CASSANDRA-20341)
diff --git a/src/java/org/apache/cassandra/db/virtual/model/TimerMetricRow.java
b/src/java/org/apache/cassandra/db/virtual/model/TimerMetricRow.java
index 4fd4b81758..ce38bd4e42 100644
--- a/src/java/org/apache/cassandra/db/virtual/model/TimerMetricRow.java
+++ b/src/java/org/apache/cassandra/db/virtual/model/TimerMetricRow.java
@@ -19,6 +19,7 @@
package org.apache.cassandra.db.virtual.model;
import com.codahale.metrics.Metric;
+import com.codahale.metrics.Snapshot;
import com.codahale.metrics.Timer;
import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics;
@@ -30,11 +31,13 @@ public class TimerMetricRow
{
private final String key;
private final Timer value;
+ private final Snapshot snapshot;
public TimerMetricRow(String key, Metric value)
{
this.key = key;
this.value = (Timer) value;
+ this.snapshot = ((Timer) value).getSnapshot();
}
@Column
@@ -78,4 +81,52 @@ public class TimerMetricRow
{
return value.getOneMinuteRate();
}
+
+ @Column
+ public double p75th()
+ {
+ return snapshot.get75thPercentile();
+ }
+
+ @Column
+ public double p95th()
+ {
+ return snapshot.get95thPercentile();
+ }
+
+ @Column
+ public double p98th()
+ {
+ return snapshot.get98thPercentile();
+ }
+
+ @Column
+ public double p99th()
+ {
+ return snapshot.get99thPercentile();
+ }
+
+ @Column
+ public double p999th()
+ {
+ return snapshot.get999thPercentile();
+ }
+
+ @Column
+ public double max()
+ {
+ return snapshot.getMax();
+ }
+
+ @Column
+ public double mean()
+ {
+ return snapshot.getMean();
+ }
+
+ @Column
+ public double min()
+ {
+ return snapshot.getMin();
+ }
}
diff --git
a/src/java/org/apache/cassandra/db/virtual/walker/TimerMetricRowWalker.java
b/src/java/org/apache/cassandra/db/virtual/walker/TimerMetricRowWalker.java
index e4e15ffe67..c1e6a5005f 100644
--- a/src/java/org/apache/cassandra/db/virtual/walker/TimerMetricRowWalker.java
+++ b/src/java/org/apache/cassandra/db/virtual/walker/TimerMetricRowWalker.java
@@ -28,10 +28,21 @@ import org.apache.cassandra.db.virtual.model.TimerMetricRow;
*/
public class TimerMetricRowWalker implements RowWalker<TimerMetricRow>
{
+ // Note: max & min are defined as doubles here despite Timer itself
exposing them as longs,
+ // via its histogram's snapshot. This is because historically,
JMXTimerMBean defined these
+ // fields as doubles and the vtable representation should be consistent
with that.
@Override
public void visitMeta(MetadataVisitor visitor)
{
visitor.accept(Column.Type.PARTITION_KEY, "name", String.class);
+ visitor.accept(Column.Type.REGULAR, "max", Double.TYPE);
+ visitor.accept(Column.Type.REGULAR, "mean", Double.TYPE);
+ visitor.accept(Column.Type.REGULAR, "min", Double.TYPE);
+ visitor.accept(Column.Type.REGULAR, "p75th", Double.TYPE);
+ visitor.accept(Column.Type.REGULAR, "p95th", Double.TYPE);
+ visitor.accept(Column.Type.REGULAR, "p98th", Double.TYPE);
+ visitor.accept(Column.Type.REGULAR, "p999th", Double.TYPE);
+ visitor.accept(Column.Type.REGULAR, "p99th", Double.TYPE);
visitor.accept(Column.Type.REGULAR, "count", Long.TYPE);
visitor.accept(Column.Type.REGULAR, "fifteen_minute_rate",
Double.TYPE);
visitor.accept(Column.Type.REGULAR, "five_minute_rate", Double.TYPE);
@@ -44,6 +55,14 @@ public class TimerMetricRowWalker implements
RowWalker<TimerMetricRow>
public void visitRow(TimerMetricRow row, RowMetadataVisitor visitor)
{
visitor.accept(Column.Type.PARTITION_KEY, "name", String.class,
row::name);
+ visitor.accept(Column.Type.REGULAR, "max", Double.TYPE, row::max);
+ visitor.accept(Column.Type.REGULAR, "mean", Double.TYPE, row::mean);
+ visitor.accept(Column.Type.REGULAR, "min", Double.TYPE, row::min);
+ visitor.accept(Column.Type.REGULAR, "p75th", Double.TYPE, row::p75th);
+ visitor.accept(Column.Type.REGULAR, "p95th", Double.TYPE, row::p95th);
+ visitor.accept(Column.Type.REGULAR, "p98th", Double.TYPE, row::p98th);
+ visitor.accept(Column.Type.REGULAR, "p999th", Double.TYPE,
row::p999th);
+ visitor.accept(Column.Type.REGULAR, "p99th", Double.TYPE, row::p99th);
visitor.accept(Column.Type.REGULAR, "count", Long.TYPE, row::count);
visitor.accept(Column.Type.REGULAR, "fifteen_minute_rate",
Double.TYPE, row::fifteenMinuteRate);
visitor.accept(Column.Type.REGULAR, "five_minute_rate", Double.TYPE,
row::fiveMinuteRate);
@@ -62,7 +81,7 @@ public class TimerMetricRowWalker implements
RowWalker<TimerMetricRow>
case CLUSTERING:
return 0;
case REGULAR:
- return 6;
+ return 14;
default:
throw new IllegalStateException("Unknown column type: " +
type);
}
diff --git
a/test/unit/org/apache/cassandra/metrics/JmxVirtualTableMetricsTest.java
b/test/unit/org/apache/cassandra/metrics/JmxVirtualTableMetricsTest.java
index 6f8c8b9822..6cf433e433 100644
--- a/test/unit/org/apache/cassandra/metrics/JmxVirtualTableMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/JmxVirtualTableMetricsTest.java
@@ -276,6 +276,14 @@ public class JmxVirtualTableMetricsTest extends CQLTester
return CQLTester.row(getFullMetricName(objectName),
bean.getCount(),
+ bean.getMax(),
+ bean.getMean(),
+ bean.getMin(),
+ bean.get75thPercentile(),
+ bean.get95thPercentile(),
+ bean.get98thPercentile(),
+ bean.get999thPercentile(),
+ bean.get99thPercentile(),
bean.getFifteenMinuteRate(),
bean.getFiveMinuteRate(),
bean.getMeanRate(),
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]