diff --git a/fe/fe-core/src/main/java/org/apache/doris/metric/MetricRepo.java b/fe/fe-core/src/main/java/org/apache/doris/metric/MetricRepo.java index 9991c651d2..926174092b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/metric/MetricRepo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/metric/MetricRepo.java @@ -57,7 +57,7 @@ public final class MetricRepo { private static final Logger LOG = LogManager.getLogger(MetricRepo.class); // METRIC_REGISTER is only used for histogram metrics - private static final MetricRegistry METRIC_REGISTER = new MetricRegistry(); + public static final MetricRegistry METRIC_REGISTER = new MetricRegistry(); public static final DorisMetricRegistry DORIS_METRIC_REGISTER = new DorisMetricRegistry(); public static volatile boolean isInit = false; diff --git a/fe/fe-core/src/main/java/org/apache/doris/metric/PrometheusMetricVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/metric/PrometheusMetricVisitor.java index b376af4bc8..48b7132026 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/metric/PrometheusMetricVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/metric/PrometheusMetricVisitor.java @@ -27,6 +27,7 @@ import com.codahale.metrics.Histogram; import com.codahale.metrics.Snapshot; import com.google.common.base.Joiner; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -177,18 +178,37 @@ public class PrometheusMetricVisitor extends MetricVisitor { @Override public void visitHistogram(StringBuilder sb, String prefix, String name, Histogram histogram) { - final String fullName = prefix + name.replaceAll("\\.", "_"); + // part.part.part.k1=v1.k2=v2 + List names = new ArrayList<>(); + List tags = new ArrayList<>(); + for (String part : name.split("\\.")) { + String[] kv = part.split("="); + if (kv.length == 1) { + names.add(kv[0]); + } else if (kv.length == 2) { + tags.add(String.format("%s=\"%s\"", kv[0], kv[1])); + } + } + final String fullName = prefix + String.join("_", names); + final String fullTag = String.join(" ", tags); sb.append(HELP).append(fullName).append(" ").append("\n"); sb.append(TYPE).append(fullName).append(" ").append("summary\n"); Snapshot snapshot = histogram.getSnapshot(); - sb.append(fullName).append("{quantile=\"0.75\"} ").append(snapshot.get75thPercentile()).append("\n"); - sb.append(fullName).append("{quantile=\"0.95\"} ").append(snapshot.get95thPercentile()).append("\n"); - sb.append(fullName).append("{quantile=\"0.98\"} ").append(snapshot.get98thPercentile()).append("\n"); - sb.append(fullName).append("{quantile=\"0.99\"} ").append(snapshot.get99thPercentile()).append("\n"); - sb.append(fullName).append("{quantile=\"0.999\"} ").append(snapshot.get999thPercentile()).append("\n"); - sb.append(fullName).append("_sum ").append(histogram.getCount() * snapshot.getMean()).append("\n"); - sb.append(fullName).append("_count ").append(histogram.getCount()).append("\n"); + sb.append(fullName).append("{quantile=\"0.75\" ").append(fullTag).append("} ") + .append(snapshot.get75thPercentile()).append("\n"); + sb.append(fullName).append("{quantile=\"0.95\" ").append(fullTag).append("} ") + .append(snapshot.get95thPercentile()).append("\n"); + sb.append(fullName).append("{quantile=\"0.98\" ").append(fullTag).append("} ") + .append(snapshot.get98thPercentile()).append("\n"); + sb.append(fullName).append("{quantile=\"0.99\" ").append(fullTag).append("} ") + .append(snapshot.get99thPercentile()).append("\n"); + sb.append(fullName).append("{quantile=\"0.999\" ").append(fullTag).append("} ") + .append(snapshot.get999thPercentile()).append("\n"); + sb.append(fullName).append("_sum {").append(fullTag).append("} ") + .append(histogram.getCount() * snapshot.getMean()).append("\n"); + sb.append(fullName).append("_count {").append(fullTag).append("} ") + .append(histogram.getCount()).append("\n"); return; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/metric/MetricsTest.java b/fe/fe-core/src/test/java/org/apache/doris/metric/MetricsTest.java index 77ba56b79a..b4f0e73ec5 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/metric/MetricsTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/metric/MetricsTest.java @@ -19,11 +19,14 @@ package org.apache.doris.metric; import org.apache.doris.common.FeConstants; +import com.codahale.metrics.Histogram; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import java.util.List; +import java.util.Map; +import java.util.SortedMap; public class MetricsTest { @@ -53,4 +56,16 @@ public class MetricsTest { } } } + + @Test + public void testDBMetrics() { + MetricRepo.DB_HISTO_QUERY_LATENCY.getOrAdd("test_db").update(10L); + StringBuilder sb = new StringBuilder(); + MetricVisitor visitor = new PrometheusMetricVisitor(); + SortedMap histograms = MetricRepo.METRIC_REGISTER.getHistograms(); + for (Map.Entry entry : histograms.entrySet()) { + visitor.visitHistogram(sb, MetricVisitor.FE_PREFIX, entry.getKey(), entry.getValue()); + } + Assert.assertTrue(sb.toString().contains("# TYPE doris_fe_query_latency_ms summary")); + } }