Как обновить датчик MicroMeter в соответствии с метками - PullRequest
1 голос
/ 11 февраля 2020

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

1 голос
/ 12 февраля 2020

Поскольку все ваши датчики ссылаются на один и тот же 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);
    }

}
...