我正在尝试以编程方式读取仪表,如下所示:
获取注册表:
MeterRegistry registry = Metrics.globalRegistry.getRegistries().iterator().next();
读取测量值:
double systemCpuUsage = registry.get("system.cpu.usage").gauge().measure().iterator().next().getValue();
问题是有时我得到 NaN
。
我在文档中读到过:Why is my Gauge reporting NaN or disappearing?
但我不确定我该怎么做。此外,我正在阅读 Spring Boot 执行器的“内置”仪表(由 management.metrics.enable.process.cpu.usage=true
公开),因此我无法更改其结构。
最佳答案
这是由于 Micrometer 在仪表中使用了“弱引用”。由于仪表不持有对对象的强引用,当对象被垃圾回收时,该值变为 NaN
。
如果您确实控制了仪表的创建,您会希望自己存储一个引用,或者在仪表上调用 strongReference(true)
。
如果您遇到内置的 Spring Boot 仪表,我相信您遇到了错误。这很奇怪,因为创建该仪表的 ProcessorMetrics
仪表绑定(bind)器拥有自己的引用(尽管它可以为 null)。
当您看到 NaN
时,您是否在不同的 JVM 或运行时环境中运行?
关于java - 为什么读取千分尺测量值有时会返回 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56889240/