From b4667284c0b383b2599f41993eab9f664b218f07 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 27 Dec 2024 07:49:52 +0800 Subject: [PATCH] [BugFix] Fix HistogramMetric output in json format (backport #54361) (#54425) Co-authored-by: shuming.li --- .../com/starrocks/metric/HistogramMetric.java | 4 ++ .../starrocks/metric/JsonMetricVisitor.java | 23 ++++++++ .../metric/SimpleCoreMetricVisitor.java | 5 ++ .../com/starrocks/metric/MetricsTest.java | 56 +++++++++++++++++++ 4 files changed, 88 insertions(+) diff --git a/fe/fe-core/src/main/java/com/starrocks/metric/HistogramMetric.java b/fe/fe-core/src/main/java/com/starrocks/metric/HistogramMetric.java index c15d9ad552792..b33525861ba93 100644 --- a/fe/fe-core/src/main/java/com/starrocks/metric/HistogramMetric.java +++ b/fe/fe-core/src/main/java/com/starrocks/metric/HistogramMetric.java @@ -52,6 +52,10 @@ public String getTagName() { return Joiner.on(", ").join(labelStrings); } + public List getLabels() { + return labels; + } + /** * Get the histogram name with tags in the format of "name_tag1=value1, tag2=value2" */ diff --git a/fe/fe-core/src/main/java/com/starrocks/metric/JsonMetricVisitor.java b/fe/fe-core/src/main/java/com/starrocks/metric/JsonMetricVisitor.java index 269d5c009f79e..45d79bae0605e 100644 --- a/fe/fe-core/src/main/java/com/starrocks/metric/JsonMetricVisitor.java +++ b/fe/fe-core/src/main/java/com/starrocks/metric/JsonMetricVisitor.java @@ -41,6 +41,7 @@ import com.starrocks.server.GlobalStateMgr; import com.starrocks.server.NodeMgr; import com.starrocks.system.SystemInfoService; +import org.apache.commons.collections.ListUtils; import java.util.Arrays; import java.util.Collections; @@ -151,11 +152,33 @@ public void visit(@SuppressWarnings("rawtypes") Metric metric) { @Override public void visitHistogram(HistogramMetric histogram) { + final String fullName = prefix + "_" + histogram.getName().replace("\\.", "_"); + Snapshot snapshot = histogram.getSnapshot(); + List labels = histogram.getLabels(); + buildMetric(fullName, MILLISECONDS, String.valueOf(snapshot.get75thPercentile()), + ListUtils.union(labels, Collections.singletonList(new MetricLabel(QUANTILE, "0.75")))); + buildMetric(fullName, MILLISECONDS, String.valueOf(snapshot.get95thPercentile()), + ListUtils.union(labels, Collections.singletonList(new MetricLabel(QUANTILE, "0.95")))); + buildMetric(fullName, MILLISECONDS, String.valueOf(snapshot.get98thPercentile()), + ListUtils.union(labels, Collections.singletonList(new MetricLabel(QUANTILE, "0.98")))); + buildMetric(fullName, MILLISECONDS, String.valueOf(snapshot.get99thPercentile()), + ListUtils.union(labels, Collections.singletonList(new MetricLabel(QUANTILE, "0.99")))); + buildMetric(fullName, MILLISECONDS, String.valueOf(snapshot.get999thPercentile()), + ListUtils.union(labels, Collections.singletonList(new MetricLabel(QUANTILE, "0.999")))); + buildMetric(fullName + "_sum", MILLISECONDS, + String.valueOf(histogram.getCount() * snapshot.getMean()), labels); + buildMetric(fullName + "_count", NOUNIT, + String.valueOf(histogram.getCount()), labels); } @Override public void visitHistogram(String name, Histogram histogram) { + // skip HistogramMetric since it needs extra processing + if (histogram instanceof HistogramMetric) { + visitHistogram((HistogramMetric) histogram); + return; + } final String fullName = prefix + "_" + name.replace("\\.", "_"); Snapshot snapshot = histogram.getSnapshot(); diff --git a/fe/fe-core/src/main/java/com/starrocks/metric/SimpleCoreMetricVisitor.java b/fe/fe-core/src/main/java/com/starrocks/metric/SimpleCoreMetricVisitor.java index 281167e7c01e6..e6d7229b16c59 100644 --- a/fe/fe-core/src/main/java/com/starrocks/metric/SimpleCoreMetricVisitor.java +++ b/fe/fe-core/src/main/java/com/starrocks/metric/SimpleCoreMetricVisitor.java @@ -136,6 +136,11 @@ public void visitHistogram(HistogramMetric histogram) { @Override public void visitHistogram(String name, Histogram histogram) { + // skip HistogramMetric since it needs extra processing + if (histogram instanceof HistogramMetric) { + visitHistogram((HistogramMetric) histogram); + return; + } if (!CORE_METRICS.containsKey(name)) { return; } diff --git a/fe/fe-core/src/test/java/com/starrocks/metric/MetricsTest.java b/fe/fe-core/src/test/java/com/starrocks/metric/MetricsTest.java index 127a560fc50d1..85424973d715a 100644 --- a/fe/fe-core/src/test/java/com/starrocks/metric/MetricsTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/metric/MetricsTest.java @@ -162,4 +162,60 @@ public void testPrometheusHistogramMetrics() { Assert.assertTrue(output.contains(metricName)); } } + + @Test + public void testJsonHistogramMetrics1() { + JsonMetricVisitor visitor = new JsonMetricVisitor("sr"); + HistogramMetric histogramMetric = new HistogramMetric("duration"); + histogramMetric.addLabel(new MetricLabel("k1", "v1")); + histogramMetric.addLabel(new MetricLabel("k2", "v2")); + visitor.visitHistogram(histogramMetric); + String output = visitor.build(); + List metricNames = Arrays.asList( + "{\"tags\":{\"metric\":\"sr_duration\",\"k1\":\"v1\",\"k2\":\"v2\",\"quantile\":\"0.75\"}," + + "\"unit\":\"milliseconds\",\"value\":0.0},\n", + "{\"tags\":{\"metric\":\"sr_duration\",\"k1\":\"v1\",\"k2\":\"v2\",\"quantile\":\"0.95\"}," + + "\"unit\":\"milliseconds\",\"value\":0.0},\n", + "{\"tags\":{\"metric\":\"sr_duration\",\"k1\":\"v1\",\"k2\":\"v2\",\"quantile\":\"0.98\"}," + + "\"unit\":\"milliseconds\",\"value\":0.0},\n", + "{\"tags\":{\"metric\":\"sr_duration\",\"k1\":\"v1\",\"k2\":\"v2\",\"quantile\":\"0.99\"}," + + "\"unit\":\"milliseconds\",\"value\":0.0},\n", + "{\"tags\":{\"metric\":\"sr_duration\",\"k1\":\"v1\",\"k2\":\"v2\",\"quantile\":\"0.999\"}," + + "\"unit\":\"milliseconds\",\"value\":0.0},\n", + "{\"tags\":{\"metric\":\"sr_duration_sum\",\"k1\":\"v1\",\"k2\":\"v2\"},\"unit\":\"milliseconds\",\"value\":0" + + ".0},\n", + "{\"tags\":{\"metric\":\"sr_duration_count\",\"k1\":\"v1\",\"k2\":\"v2\"},\"unit\":\"nounit\",\"value\":0}" + ); + for (String metricName : metricNames) { + Assert.assertTrue(output.contains(metricName)); + } + } + + @Test + public void testJsonHistogramMetrics2() { + JsonMetricVisitor visitor = new JsonMetricVisitor("sr"); + HistogramMetric histogramMetric = new HistogramMetric("duration"); + histogramMetric.addLabel(new MetricLabel("k1", "v1")); + histogramMetric.addLabel(new MetricLabel("k2", "v2")); + visitor.visitHistogram("", histogramMetric); + String output = visitor.build(); + List metricNames = Arrays.asList( + "{\"tags\":{\"metric\":\"sr_duration\",\"k1\":\"v1\",\"k2\":\"v2\",\"quantile\":\"0.75\"}," + + "\"unit\":\"milliseconds\",\"value\":0.0},\n", + "{\"tags\":{\"metric\":\"sr_duration\",\"k1\":\"v1\",\"k2\":\"v2\",\"quantile\":\"0.95\"}," + + "\"unit\":\"milliseconds\",\"value\":0.0},\n", + "{\"tags\":{\"metric\":\"sr_duration\",\"k1\":\"v1\",\"k2\":\"v2\",\"quantile\":\"0.98\"}," + + "\"unit\":\"milliseconds\",\"value\":0.0},\n", + "{\"tags\":{\"metric\":\"sr_duration\",\"k1\":\"v1\",\"k2\":\"v2\",\"quantile\":\"0.99\"}," + + "\"unit\":\"milliseconds\",\"value\":0.0},\n", + "{\"tags\":{\"metric\":\"sr_duration\",\"k1\":\"v1\",\"k2\":\"v2\",\"quantile\":\"0.999\"}," + + "\"unit\":\"milliseconds\",\"value\":0.0},\n", + "{\"tags\":{\"metric\":\"sr_duration_sum\",\"k1\":\"v1\",\"k2\":\"v2\"},\"unit\":\"milliseconds\",\"value\":0" + + ".0},\n", + "{\"tags\":{\"metric\":\"sr_duration_count\",\"k1\":\"v1\",\"k2\":\"v2\"},\"unit\":\"nounit\",\"value\":0}" + ); + for (String metricName : metricNames) { + Assert.assertTrue(output.contains(metricName)); + } + } }