首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据标签更新MicroMeter量规

如何根据标签更新MicroMeter量规
EN

Stack Overflow用户
提问于 2020-02-11 14:48:06
回答 1查看 6K关注 0票数 9

我在Spring 2应用程序中使用MicroMeter度量来跟踪对象的状态。在状态更改时,调用statusArrived()方法。此函数应更新与该对象相关的量规。

以下是我目前的实现:

代码语言:javascript
复制
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的量规进行更新。

输入

代码语言:javascript
复制
statusArrived(1, 2);
statusArrived(2, 3);

电流输出

代码语言:javascript
复制
product_status{product_id=1} 3
product_status{product_id=2} 3

所有量规都会更新。

期望输出

代码语言:javascript
复制
product_status{product_id=1} 2
product_status{product_id=2} 3

只更新带有给定product_id标记的量规。

我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-12 16:16:04

由于您的所有量规都引用相同的currentStatus,当新值传入时,所有量规的源都会更改。相反,使用一个映射来按id跟踪所有当前状态:

代码语言:javascript
复制
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);
    }

}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60171522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档