Прометей Счетчик Несоответствие - PullRequest
0 голосов
/ 20 марта 2019

Я использую простой клиент Prometheus Java в веб-сервисе, чтобы отслеживать, сколько событий приводит к тому или иному состоянию.

Я могу проверить в журналах, что счетчик вызываетсяи увеличивается внутренне, но кажется, что данные часто не попадают в конечную точку / metrics.

Например, только сейчас, после увеличения счетчика в 3 раза для того же состояния с интервалом в несколько минут каждый, журнал будет распечатывать «Текущее значение = 0, Новое значение = 1»три раза.Первые два раза не показывали никаких данных в конечной точке / metrics, и после 3-го приращения оно наконец показало значение 1, что означает, что я потерял запись первых 2 событий.

Код IНиже приведено следующее, кроме некоторых изменений имени:

private static final Counter myCounter = Counter.build()
        .name("myMetric")
        .help("My metric")
        .labelNames("status").register();
...

private static void incrementCounter(String status) {
    Counter.Child counter = myCounter.labels(status);
    Logger.info("Before Incrementing counter for status= " + status + ". Current value=" + counter.get());
    counter.inc();
    Logger.info("After Incrementing counter for status= " + status + ". New value=" + counter.get());
}

Я в недоумении, почему Прометей, похоже, не в состоянии последовательно отслеживать эти счетчики.Кто-нибудь может увидеть, что не так или лучше записать эти метрики счетчика?

1 Ответ

0 голосов
/ 28 мая 2019

Единственная причина, по которой я могу догадаться, это одновременные incrementCounter звонки.Метод io.prometheus.client.SimpleCollector#labels не является поточно-ориентированным (несмотря на то, что поле children имеет тип ConcurrentMap), поэтому при каждом вызове можно получить разные значения io.prometheus.client.Counter.Child.

Что касается получения метрик через http- каждый вызов конечной точки /metrics приводит к вызову метода io.prometheus.client.Counter#collect, который возвращает значение только одного дочернего элемента.

Я бы посоветовал вам использовать свою собственную карту параллелизма для хранения счетчиков:

private static final ConcurrentMap<String, Counter.Child> counters = new ConcurrentHashMap<>();   

// ...

private static void incrementCounter(String status) {
  Counter.Child counter = counters.computeIfAbsent(status, myCounter::labels) ;
  // ...
}
...