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