3

我正在尝试以编程方式读取仪表,如下所示:

获取注册表:

MeterRegistry registry = Metrics.globalRegistry.getRegistries().iterator().next();

读取测量:

    double systemCpuUsage = registry.get("system.cpu.usage").gauge().measure().iterator().next().getValue();

问题是有时我会得到NaN.

我在文档中读到了这一点:为什么我的仪表报告 NaN 或消失?

但我不确定我该怎么做。另外,我正在阅读 Spring Boot 执行器的“内置”仪表(由 暴露management.metrics.enable.process.cpu.usage=true),因此我无法更改它的结构。

4

3 回答 3

4

这是由于千分尺在仪表中使用“弱参考”。由于量表没有对对象进行强引用,因此当对象被垃圾回收时,值变为NaN.

如果您确实控制了仪表的创建,您可能希望自己存储参考,或调用strongReference(true)仪表。

如果您遇到内置的 Spring Boot 仪表,我相信您遇到了错误。这很奇怪,因为ProcessorMetrics创建该仪表的仪表活页夹拥有自己的参考(尽管它可以为空)。

当您看到NaN?

于 2019-07-05T17:22:17.023 回答
2

在这种情况下,由于您使用的是“内置”指标,因此您可以 使用自定义 MeterBinder 实现覆盖io.micrometer.core.instrument.binder.MeterBinder#bindTo、重新定义,并将 system.cpu.usage 定义为(以及您使用的其他指标)system.cpu.usage

Gauge.builder("system.cpu.usage", operatingSystemBean, x -> invoke(systemCpuUsage))
.strongReference(true)//Add strong reference
.tags(tags)
.description("The recent cpu usage for the whole system")
.register(registry);

参考io.micrometer.core.instrument.binder.system.ProcessorMetrics到目前为止定义它的例子。

ProcessorMetrics 上的 bean 定义在 中org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration,您也需要在某个地方定义您的 bean。(或标记@Component)

如果您不想依赖于千分尺的某些预定义度量,例如捕获一些自定义列表大小,这就是您可以做的。

private static Map<String, Long> strongRefGauge = new ConcurrentHashMap<>();

要添加值,请执行以下操作

registry.gauge("CustomListSizeGuage", getMyCustomGuageTagsFor("myListName"), strongRefGauge, g -> g.get("myListName")).put("myListName", list.size());
于 2019-07-12T04:35:29.737 回答
1

只是想提另一个可能导致千分尺报告NaN的原因。当值函数本身抛出异常时,它实际上是一种默认行为: https ://github.com/micrometer-metrics/micrometer/blob/1.8.x/micrometer-core/src/main/java/io/micrometer /core/instrument/internal/DefaultGauge.java#L57

此异常直接在仪表本身中捕获,并且可能会记录在 WARN 或可能只是 DEBUG lvl 中,不确定,由于某种原因在我们的应用程序中无法正常工作。

所以只是另一个值得检查的可能原因:)

于 2022-02-25T14:12:14.417 回答