Skip to content

Commit

Permalink
[BugFix] Fix HistogramMetric output in json format (backport #54361) (#…
Browse files Browse the repository at this point in the history
…54425)

Co-authored-by: shuming.li <[email protected]>
  • Loading branch information
mergify[bot] and LiShuMing authored Dec 26, 2024
1 parent 2ca2eaf commit b466728
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ public String getTagName() {
return Joiner.on(", ").join(labelStrings);
}

public List<MetricLabel> getLabels() {
return labels;
}

/**
* Get the histogram name with tags in the format of "name_tag1=value1, tag2=value2"
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<MetricLabel> 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();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
56 changes: 56 additions & 0 deletions fe/fe-core/src/test/java/com/starrocks/metric/MetricsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> 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<String> 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));
}
}
}

0 comments on commit b466728

Please sign in to comment.