Являются ли счетчики поточно-безопасными в микрометрах? - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь опубликовать sh количество событий, которые обрабатывает мое приложение. Вот код, который у меня есть на приемном конце:

public void process(List<String> batch) {
    logger.info ("Processing batch of size " + batch.size())
    metrics.incrementCounter(MetricsType.CONSUMER_TOTAL_PROCESSED, batch.size)
}

Класс Metrics:

public class Metrics {
    private static final Map<MetricsType, Counter> COUNTER_MAP = new ConcurrentHashMap<>();

    public Metrics(
        @Autowired MeterRegistry meterRegistry
    ) {
        COUNTER_MAP.put(
            MetricsType.CONSUMER_TOTAL_PROCESSED,
            Counter.builder("CONSUMER_TOTAL_PROCESSED").register(meterRegistry)
        );

        COUNTER_MAP.put(
            MetricsType.CONSUMER_DUPLICATE_PROCESSED,
            Counter.builder("CONSUMER_DUPLICATE_PROCESSED").register(meterRegistry)
        );
    }

    public void increment(MetricsType metricsType, int size) {
        COUNTER_MAP.get(metricsType).increment(size);
    }
}

Перечисление MetricsType содержит все типы счетчиков.

Метод process может быть вызван 16 потоками в любое время. Проблема, с которой я сталкиваюсь, заключается в том, что регистратор, который печатает счетчик, и общий счетчик, указанный в графане, отключены.

Нужно ли синхронизировать каждый раз, когда я увеличиваю счетчик?


Редактировать - я имею в виду, что отсчет отключен, если есть два журнала с размером 200, тогда графана должна сообщить общий счетчик 400. Я проверяю это, используя временной интервал 2 часа, я извлекаю все размеры из журналов и добавьте их.


Если вы наткнулись на это и увидите разницу между двумя источниками, пожалуйста, проверьте, какое максимальное количество точек данных в Grafana, это было реальной проблемой, почему я думал, что счетчики не могут быть поточно-ориентированными. ,

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Счетчики являются поточно-ориентированными, внутренне они используют некоторую структуру данных атома c для подсчета. Учитывая ваш код, я подозреваю, что то, что печатает регистратор, сильно отличается от того, что вы видите в графане, потому что регистратор печатает размер текущей партии, в то время как счетчик печатает сумму всех размеров партии.

0 голосов
/ 13 марта 2020

Счетчики монотонно увеличиваются. Таким образом, если произошла предыдущая партия, то новая партия добавится к предыдущему итогу.

Какой сервер вы используете? Если вы используете Prometheus, вы можете обернуть ваш запрос в функцию increase, чтобы вы могли визуализировать, насколько увеличивается счетчик.

(Хотя, чтобы ответить на оригинальный вопрос: Да, счетчики являются поточно-ориентированными)

...