Почему при чтении измерения микрометра иногда возвращается значение NaN? - PullRequest
2 голосов
/ 04 июля 2019

Я пытаюсь программно прочитать метры следующим образом:

Получить реестр:

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), поэтому я не могу изменить его конструкцию.

Ответы [ 2 ]

3 голосов
/ 05 июля 2019

Это связано с использованием микрометром «слабых эталонов» в манометрах. Поскольку датчик не содержит строгой ссылки на объект, при сборке мусора значение становится равным NaN.

Если вы управляли созданием датчика, вы бы хотели сохранить ссылку самостоятельно или позвонить по номеру strongReference(true).

Если вы столкнулись со встроенными датчиками Spring Boot, я полагаю, что вы столкнулись с ошибкой. Что очень странно, так как связующий элемент ProcessorMetrics, который создает этот датчик, содержит собственную ссылку (хотя и может иметь значение null).

Работаете ли вы в другой среде JVM или среде выполнения, когда видите NaN?

2 голосов
/ 12 июля 2019

В этом случае, поскольку вы используете «встроенную» метрику, вы можете переопределить io.micrometer.core.instrument.binder.MeterBinder#bindTo, переопределить system.cpu.usage с помощью пользовательской реализации MeterBinder и определить 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, который определяет его на данный момент.

Bean-компонент на ProcessorMetrics определен в org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration, вам также нужно где-то определить свой компонент.(или пометьте @Component)

Если вы не хотите полагаться на какую-то предопределенную метрику с помощью микрометра, например, для захвата какого-то нестандартного размера списка, это то, что вы можете сделать.

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

Для добавления значений сделайте следующее

registry.gauge("CustomListSizeGuage", getMyCustomGuageTagsFor("myListName"), strongRefGauge, g -> g.get("myListName")).put("myListName", list.size());
...