如何根据标签更新MicroMeter测量值

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_status{product_id=1} 3
product_status{product_id=2} 3

所有指针都已更新

期望输出结果:

product_status{product_id=1} 2
product_status{product_id=2} 3

只有带有给定 product_id 标签的表盘才会更新。



我该如何实现这个?

1个回答

14

由于您所有的仪表都引用了相同的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);
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接