java - LoggingMeterRegistry 计数器未显示预期计数

标签 java micrometer

我正在尝试用 micormeter 的 LoggingMeterRegistry 替换 PrometheusMeterRegistry ,以便以特定格式将指标导出为日志事件。在执行单元测试时,我注意到使用 Meter#measure() 检索测量结果后,Counter 仪表没有显示正确的计数。 Here您可以找到一个重现所描述行为的最小示例。测试用例 work5 调用方法 5 次,使用该方法注册并递增计数器。预期计数器值为 5PrometheusMeterRegistry 的实际值也是 5LoggingMeterRegistry 为实际值值为0

  • 我的测试设置或 LoggingMeterRegistry 的使用是否有问题,因此预期有误?
  • 如果没有,那么如何使 LoggingMeterRegistry 正常运行?

最佳答案

由于我需要计数器反射(reflect)计数,就像普罗米修斯计量表注册表对示例项目中所示的用例所做的那样,而且注册表将测量结果推送到其接收器这一事实,我决定创建一个自定义日志记录仪表注册表 CustomLoggingMeterRegistry 扩展了 LoggingMeterRegistry,我可以通过重写 newCounter 方法来控制使用 Counter 的实现。

@Override
protected Counter newCounter(Id id) {
  CountingMode countingMode = getCountingMode();
  switch (countingMode) {
    case CUMULATIVE:
      return new CumulativeCounter(id);
    case STEP:
      return new StepCounter(id, clock, config.step().toMillis());
    default:
      throw new UnsupportedOperationException(String
          .format("Unsupported counting mode '%s'",
              countingMode.name()));
  }

}

StepCounter 只是该问题的一个实例,从技术上讲,任何 StepMeter 都可能出现这种情况,并且需要进行相应处理。

样本project更新了实现草案。

编辑(2023-08-18):

由于上面的实现出现了一些问题,因为其他Meter中使用了Counter进行统计,例如Timer,我放弃了 CustomLoggingMeterRegistry,转而使用 SimplePushMeterRegistry,它是一个委托(delegate)创建新的 Meter 实例的 PushMeterRegistry到实现SimpleMeterRegistry。追求 CustomLoggingMeterRegistry 需要为所有 newXxx(...) 方法提供实现,通过查看可用的实现,这并不像 Counter 的情况那样简单.

样本project更新了实现草案。

关于java - LoggingMeterRegistry 计数器未显示预期计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76866688/

相关文章:

micrometer - 如何使用不同的标签为多个指标名称使用相同的 Counter 对象

spring-boot - 如何根据标签更新千分表

java - 如何停止音乐剪辑?

java - 强制浏览器在单独的窗口中打开我的小程序

java - 如何使用@OneToMany 集合进行分页

java - 尝试在 cmd 中运行我的项目时出错

java - 如何正确从 Dropwizard 指标切换到 Micrometer?

java - 将 'mean' 、 'min' 或 'percentiles' 添加到 Spring Boot 2 指标?

java - Spring-boot micrometer timer() 它是如何工作的?

java - 如何将两个参数传递给查询java