(metric) add histogramJsonMetric and nodeInfo (#26172)

Add histogramJsonMetric and nodeInfo to the interface "http://fe_host:http_port/metrics?type=json".
This commit is contained in:
xiangran0327
2023-11-08 14:46:18 +08:00
committed by GitHub
parent 44b51bf0b9
commit fc304c0e7c

View File

@ -17,18 +17,22 @@
package org.apache.doris.metric;
import org.apache.doris.catalog.Env;
import org.apache.doris.monitor.jvm.JvmStats;
import org.apache.doris.monitor.jvm.JvmStats.GarbageCollector;
import org.apache.doris.monitor.jvm.JvmStats.MemoryPool;
import org.apache.doris.monitor.jvm.JvmStats.Threads;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.Snapshot;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class JsonMetricVisitor extends MetricVisitor {
private int ordinal = 0;
private int metricOrdinal = 0;
private int histogramOrdinal = 0;
private boolean closed = false;
// jvm
@ -113,7 +117,7 @@ public class JsonMetricVisitor extends MetricVisitor {
@Override
public void visit(String prefix, @SuppressWarnings("rawtypes") Metric metric) {
if (ordinal++ != 0) {
if (metricOrdinal++ != 0) {
sb.append(",\n");
}
sb.append("{\n\t\"tags\":\n\t{\n");
@ -140,12 +144,88 @@ public class JsonMetricVisitor extends MetricVisitor {
@Override
public void visitHistogram(String prefix, String name, Histogram histogram) {
return;
if (histogramOrdinal++ == 0) {
sb.append(",\n");
}
// part.part.part.k1=v1.k2=v2
List<String> names = new ArrayList<>();
List<String> 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);
Snapshot snapshot = histogram.getSnapshot();
setHistogramJsonMetric(sb, fullName, "\"quantile\":\"0.75\"", tags, snapshot.get75thPercentile());
setHistogramJsonMetric(sb, fullName, "\"quantile\":\"0.95\"", tags, snapshot.get95thPercentile());
setHistogramJsonMetric(sb, fullName, "\"quantile\":\"0.98\"", tags, snapshot.get98thPercentile());
setHistogramJsonMetric(sb, fullName, "\"quantile\":\"0.99\"", tags, snapshot.get99thPercentile());
setHistogramJsonMetric(sb, fullName, "\"quantile\":\"0.999\"", tags, snapshot.get999thPercentile());
setHistogramJsonMetric(sb, fullName.concat("_sum"), null, null,
histogram.getCount() * snapshot.getMean());
setHistogramJsonMetric(sb, fullName.concat("_count"), null, null, histogram.getCount());
}
private void setHistogramJsonMetric(StringBuilder sb, String metric, String quantile,
List<String> tags, double value) {
sb.append("{\n\t\"tags\":\n\t{\n");
sb.append("\t\t\"metric\":\"").append(metric).append("\"");
if (quantile != null) {
sb.append(",\n");
sb.append("\t\t").append(quantile).append("\n");
}
if (tags != null) {
for (String tag : tags) {
sb.append(",\n");
sb.append("\t\t").append(tag).append("\n");
}
}
sb.append("\n\t},\n");
sb.append("\t\"unit\":\"").append("ms").append("\",\n");
sb.append("\t\"value\":").append(value).append("\n}");
sb.append(",\n");
}
@Override
public void getNodeInfo() {
return;
if (Env.getCurrentEnv().isMaster()) {
setNodeInfo(sb, "node_info", "is_master", null, 1, false);
}
setNodeInfo(sb, "node_info", "fe_node_num", "total",
Env.getCurrentEnv().getFrontends(null).size(), false);
setNodeInfo(sb, "node_info", "be_node_num", "total",
Env.getCurrentSystemInfo().getAllBackendIds(false).size(), false);
setNodeInfo(sb, "node_info", "be_node_num", "alive",
Env.getCurrentSystemInfo().getAllBackendIds(true).size(), false);
setNodeInfo(sb, "node_info", "be_node_num", "decommissioned",
Env.getCurrentSystemInfo().getDecommissionedBackendIds().size(), false);
setNodeInfo(sb, "node_info", "be_node_num", "dead",
Env.getCurrentEnv().getBrokerMgr().getAllBrokers().stream().filter(b -> !b.isAlive).count(), true);
}
private void setNodeInfo(StringBuilder sb, String metric, String type,
String status, long value, boolean lastMetric) {
sb.append("{\n\t\"tags\":\n\t{\n");
sb.append("\t\t\"metric\":\"").append(metric).append("\"");
if (type != null) {
sb.append(",\n");
sb.append("\t\t\"type\":\"").append(type).append("\"");
}
if (status != null) {
sb.append(",\n");
sb.append("\t\t\"state\":\"").append(status).append("\"\n");
}
sb.append("\n\t},\n");
sb.append("\t\"unit\":\"").append("nounit").append("\",\n");
sb.append("\t\"value\":").append(value).append("\n}");
if (!lastMetric) {
sb.append(",\n");
}
}
@Override