我正在计算应用程序中的延迟(以毫秒为单位)并用仪表进行记录,但值在第一次后没有更新。 (我知道计时器指标类型也可用于延迟,但我想要一路上的单个值,而不仅仅是计时器类型提供的总和/最大/计数之类的聚合)
这是计算和记录指标的代码
public void myFunction() {
long e2eStartTime = System.nanoTime();
....
....
....
long e2eEndTime = System.nanoTime();
long e2eTimeTaken = e2eEndTime - e2eStartTime;
long e2eTimeTakenMillis = TimeUnit.NANOSECONDS.toMillis(e2eTimeTaken);
List<Tag> metricTags = getMetricTags();
Metrics.gauge("e2e_latency", metricTags, e2eTimeTakenMillis);
}
我已在端点上启用指标:
actuator/prometheus
因此,当这个函数第一次调用时,延迟为 8 毫秒,当我调用上述端点时,我可以看到指标为 8,但是当这个函数第二次调用时,延迟为 5 毫秒,但端点仍然显示仅8个。
我正在使用以下版本的 gradle
implementation 'io.micrometer:micrometer-registry-prometheus:1.12.1'
我也尝试过使用像下面的代码这样的构建器
AtomicLong latency = new AtomicLong(-1);
public void myFunction() {
long e2eStartTime = System.nanoTime();
....
....
....
long e2eEndTime = System.nanoTime();
long e2eTimeTaken = e2eEndTime - e2eStartTime;
long e2eTimeTakenMillis = TimeUnit.NANOSECONDS.toMillis(e2eTimeTaken);
List<Tag> metricTags = getMetricTags();
Gauge.builder("e2e_latency", latency, AtomicLong::get).tags(metricTags).register(Metrics.globalRegistry);
latency.set(e2eTimeTakenMillis);
}
使用构建器,我可以获得更新的值,但所有指标都会更新为当前值。
示例: 第一次调用函数时,延迟为 8 毫秒,标签为国家=“美国”,
e2e_latency{country="US",} 8.0
第二次调用函数且延迟为 3 毫秒且标签为国家/地区=“US”时,我可以看到指标已更新
e2e_latency{country="US",} 3.0
但是现在假设标签不同,那么其他标签的所有指标也会发生变化。 第三次调用函数时,延迟为 5 毫秒,标签为(国家=“IT”),所有指标均设置为 5
e2e_latency{country="US",} 5.0
e2e_latency{country="IT",} 5.0
这里我期望country=“US”应该保持其最后的值,即3。
我也尝试过使用 .strongReference 方法,但似乎不起作用。
任何人都可以帮助我理解我在这里做错了什么吗?
您误解了Gauge的用法,您应该先阅读文档:https://docs.micrometer.io/micrometer/reference/concepts/gauges.html
然后你可以这样做:
class Demo {
final AtomicLong lastValue = new AtomicLong();
Demo(MeterRegistry registry) {
registry.gauge("demo", () -> lastValue);
}
void doSomething() {
lastValue.set(...);
}
}