Как обновить датчик MicroMeter в соответствии с метками

Я использую датчики MicroMeter в приложении Spring Boot 2 для отслеживания состояний объектов. При изменении статуса statusArrived() метод 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 ответ


Поскольку все ваши датчики ссылаются на один и тот же currentStatus , когда приходит новое значение, источник всего датчика изменяется. Вместо этого используйте карту для отслеживания всего текущего статуса по идентификатору:

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);
    }

}

Есть идеи?

10000