【问题标题】:how to create custom gauges with Spring Boot and Micrometer?如何使用 Spring Boot 和 Micrometer 创建自定义仪表?
【发布时间】:2019-07-29 20:17:04
【问题描述】:

我编写了一个 Spring Boot 应用程序,我想通过 Micrometer 向 Prometheus 公开自定义指标。这是一个代码 sn-p,我在其中递增一个计数器(有效)并尝试设置几个仪表(无效):

@Scheduled(cron = "*/2 * * * * *") // run every 2 seconds
private void logTemperature() throws UnknownHostException {

    // get measurement
    SensorReader sensorReader = new SensorReader();
    SensorReading sensorReading = sensorReader.getSensorReading();

    Metrics.counter("measurements").increment();
    Metrics.gauge("fahrenheit", sensorReading.getFahrenheit());
    Metrics.gauge("humidity", sensorReading.getHumidity());

    // do stuff with measurement
    // ...

}

完整的源代码在这里:https://github.com/alexwoolford/htu21d_logger/tree/master/htu21d-logger-spring

sensorReading 对象中的fahrenheit 字段是float。仪表存在于输出中,但值为NaN(即不是数字):

# HELP measurements_total  
# TYPE measurements_total counter
measurements_total 82.0
...
# HELP humidity  
# TYPE humidity gauge
humidity NaN
...
# HELP fahrenheit  
# TYPE fahrenheit gauge
fahrenheit NaN
...

我看过类似的帖子,例如Micrometer/Prometheus How do I keep a gauge value from becoming NaN?Micrometer - Prometheus Gauge displays NaN,但我无法从这些答案中具体弄清楚我需要做什么。

我还尝试创建一个变量并使用 lambda 更新它,例如

Metrics.gauge("humidity", humidity, humidity -> sensorReading.getHumidity());

...然后这个指标完全消失了(甚至没有NaN)。

这个问题与其他问题略有不同,因为我没有使用缓存,而是尝试使用全局注册表,这大概是最简单的选择。

【问题讨论】:

    标签: spring-boot prometheus micrometer


    【解决方案1】:

    您正在使用的对象正在被垃圾回收,因为 note 会保留对这些值的引用。仪表默认使用弱引用。

    如果您将其设置为使用强引用,则应避免使用NaNs。不幸的是,全局注册表助手不会公开仪表生成器,因此您需要稍微不同地创建仪表。

    Gauge.builder("humidity", humidity, humidity -> sensorReading.getHumidity()).strongReference(true).register(Metrics.globalRegistry);
    

    作为旁注,我建议不要使用@Scheduled 方法,除非传感器读数本来就很慢。如果SensorReader 是线程安全的,您可以删除@Scheduled 并直接使用SensorReader

    SensorReader sensorReader = new SensorReader();
    
    Gauge.builder("humidity", sensorReader, sensorReader -> 
      sensorReader.getSensorReading().getHumidity())
      .strongReference(true)
      .register(Metrics.globalRegistry);
    Gauge.builder("fahrenheit", sensorReader, sensorReader -> 
      sensorReader.getSensorReading().getFahrenheit())
      .strongReference(true)
      .register(Metrics.globalRegistry);
    
    

    这样,您只需查找传感器读数就是 Prometheus 抓取指标的速率。

    【讨论】:

    • 太棒了,@checketts。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多