千分尺 - 自定义量规公制不起作用

问题描述 投票:0回答: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();
     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 方法,但似乎不起作用。

任何人都可以帮助我理解我在这里做错了什么吗?

spring-boot prometheus micrometer gauge spring-micrometer
1个回答
0
投票

您误解了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(...);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.