当前位置: 首页 > 知识库问答 >
问题:

如何使用spring boot和千分尺创建自定义量规?

章丰茂
2023-03-14

我写了一个spring boot应用程序,我想把自定义的度量暴露给普罗米修斯与千分尺。下面是一个代码片段,我正在递增一个计数器(这起作用),并尝试设置几个量规(这不起作用):

@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/htu21dlogger/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
...

我见过类似的帖子,例如千分尺/普罗米修斯,我如何保持一个仪表值不变成NaN?千分尺-普罗米修斯测量仪显示的是NaN,但我不知道,具体来说,我需要从这些答案中做些什么。

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

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

...而这种语言完全消失了(甚至连一个nan)。

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

共有1个答案

楚涵润
2023-03-14

您正在使用的对象将被垃圾收集,因为noting保留了这些值的引用。默认情况下,仪表使用弱引用。

如果将其设置为使用强引用,则应避免使用nans。不幸的是,全局注册表帮助程序没有公开规范构建器,因此您需要以不同的方式创建规范。

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

作为附带说明,我建议不要使用@schedule方法,除非传感器读数本身就很慢。如果sensorreader是线程安全的,则可以删除@schedule并直接使用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);

这样你就只需要查看传感器的读数,即普罗米修斯的速度。

 类似资料:
  • 我对千分尺的理解仍然相当小,所以我将首先介绍我真正想要实现的目标。 目的 鉴于我在数据库表中有记录,每条记录都包含一个“creation_date”。 给定客户端调用 API 来获取这些记录 我想记录记录记录的访问次数,按其创建日期分组(仅月和年) 示例结果 在过去的6小时内,访问了2021年1月创建的10条记录 在过去的12小时内,访问了2021年2月创建的15条记录 在上周一和上周二之间,访问

  • 我是测微计新手。我想记录诸如用户注册、用户登录等事件。我可以用测微计和Spring靴来完成这项工作,并在普罗米修斯/格拉法纳中显示数据吗?

  • 我对Spring很陌生,正在尝试将我的应用程序连接到麋鹿。该应用程序运行的是Spring boot 1.5.5,因此我使用的是微米遗产。我的pom看起来像这样: 每当我尝试启动我的应用程序时,我都会收到以下错误: 根本原因似乎是类io.micrometer.core.instrument.config.validate.Validated它似乎没有像它应该的那样出现在包中。对此有什么想法吗?

  • 假设我有一个应用程序,其中REST API更新产品的价格。 我想使用微米计来公开新价格作为指标。我无法理解微米计留档应该如何完成。 唯一对我有效的DoubleFunction是在我的ProductService中创建一个新方法来返回它的价格。这似乎是我想公开作为指标的每一条数据的开销。 我这里缺少什么?为什么不足以更新Gauge?

  • 是否有任何方法可以测量实用程序如何使用线程池?我已经浏览了代码,但还没有看到任何直接的选项。

  • 我有一个Spring Boot应用程序,我现在正在迁移到Micrometer。 我想实现的是,随着时间的推移计算特定对象的调用。 让我们假设我有一个创建某些品牌的汽车的功能。然后我想测量一下我在过去一分钟内创造了多少辆福特,斯柯达,大众等。特别是,如果在 之间没有创建斯柯达,则指标应返回 0。 文档声明我不应该使用计数器,因为在运行应用程序时,创建的汽车数量可能会无限增长。计时器也不太合适,因为我