Почему показания микрометра иногда возвращают значение NaN?

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

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

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


person yaseco    schedule 04.07.2019    source источник


Ответы (2)


В этом случае, поскольку вы используете «встроенную» метрику, вы можете переопределить 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, например, который определяет его на данный момент.

Бин в 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());
person Sumeet Mondal    schedule 12.07.2019

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

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

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

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

person checketts    schedule 05.07.2019
comment
По сути, я вижу это при запуске приложения Spring Boot в моей среде IDE (IntelliJ). Это как-то связано с проблемой? - person yaseco; 06.07.2019
comment
Интересно, используете ли вы инструменты разработки Spring Boot, и это вызывает отсоединение. - person checketts; 15.07.2019
comment
Я не знал об этом до этого момента (поэтому ответ «нет») - person yaseco; 15.07.2019
comment
Так что, может быть, эта проблема как-то связана с моей локальной настройкой? Я не вижу этой проблемы на своем рабочем сервере - person yaseco; 15.07.2019