如何根据标签更新 MicroMeter 量规

Posted

技术标签:

【中文标题】如何根据标签更新 MicroMeter 量规【英文标题】:How to update MicroMeter gauge according to labels 【发布时间】:2020-05-27 00:26:10 【问题描述】:

我在 Spring Boot 2 应用程序中使用 MicroMeter 仪表来跟踪对象的状态。在状态更改时,将调用 statusArrived() 方法。此功能应更新与该对象相关的仪表。

这是我当前的实现:

public class PrometheusStatusLogger 

    private int currentStatus;

    public void statusArrived(String id, int value) 
        currentStatus = value;
        Tags tags = Tags.of("product_id", id);

        Gauge.builder("product_status",this::returnStatus)
          .tags(tags)
          .strongReference(true)
          .register(Metrics.globalRegistry);
    

    private int returnStatus()
        return currentStatus;
        

这很好用,但问题是当调用此方法时,所有仪表值都会更新。我只想更新带有给定product_id 的仪表。

输入

statusArrived(1, 2);
statusArrived(2, 3);

电流输出

product_statusproduct_id=1 3
product_statusproduct_id=2 3

所有仪表都已更新

期望的输出

product_statusproduct_id=1 2
product_statusproduct_id=2 3

仅更新带有给定 product_id 标签的仪表。

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

由于您的所有仪表都引用相同的currentStatus,因此当新值进入时,所有仪表的源都会更改。而是使用地图通过 id 跟踪所有当前状态:

public class PrometheusStatusLogger 

    private Map<String, Integer> currentStatuses =  new HashMap<>();

    public void statusArrived(String id, int value) 
        if(!currentStatuses.containsKey(id)) 
            Tags tags = Tags.of("product_id", id);
            Gauge.builder("product_status",currentStatuses, map -> map.get(id))
                    .tags(tags)
                    .register(Metrics.globalRegistry);
        
        currentStatuses.put(id, value);
    


【讨论】:

以上是关于如何根据标签更新 MicroMeter 量规的主要内容,如果未能解决你的问题,请参考以下文章

Micrometer Counter vs Distribution总结

千分尺 - 在度量名称中添加默认前缀

如何配置 spring-micrometer 标签

如何使用 SLA 和标签注册 Micrometer Timer?

以 Micrometer 为单位的 Counter 指标的动态标签值

MicroMeter:删除/禁用某个标签