Микрометр / Прометей: как измерить продолжительность обработки? - PullRequest
0 голосов
/ 20 января 2020

Я хочу измерить, сколько времени занимает обработка некоторых данных: мое приложение считывает эти данные из определенного источника с фиксированной скоростью. Перед каждым кругом я храню Instant.now(). Я читаю данные, добавляя эту временную метку к каждой записи. Данные сохраняются, преобразуются, и непосредственно перед отправкой через WebSockets я хочу измерить продолжительность между now() и этой начальной отметкой времени.

Я пытался

long millis = Duration.between(dataEntry.getReceivedTimestamp(), Instant.now()).toMillis();
LOG.info(millis + "ms");
registry.timer("processingDuration").record(millis, TimeUnit.MILLISECONDS);

, но визуализация этого позволяет мне использовать только processingDuration_seconds_count, _max и _sum. count и sum увеличиваются со временем (конечно), max является постоянным большую часть времени. Итак, как мне увидеть более высокие и более низкие плато нагрузки? Я попытался, по крайней мере, irate(processingDuration_seconds_sum[10m]) увидеть скачки, но поскольку irate() использует только две точки данных, я все еще не могу легко определить более длительные периоды высокой нагрузки. Плюс: значение составляет около 0,6 на графике, в то время как зарегистрированное мс составляет около 5-10, поэтому я теряю фактическое значение здесь.

Поэтому я попытался использовать вместо него Gauge - что Предполагается, что допускаются как увеличивающиеся, так и уменьшающиеся значения:

registry.gauge("processingDurationGauge", millis);

Я думал, что это будет go вверх и вниз в пределах диапазона регистрируемых мс, но оно постоянно 92.

Как я измеряю в течение времени данных?

Ответы [ 2 ]

1 голос
/ 21 января 2020

Использование таймера и record - правильное решение.

long millis = Duration.between(dataEntry.getReceivedTimestamp(), Instant.now()).toMillis();
LOG.info(millis + "ms");
registry.timer("processingDuration").record(millis, TimeUnit.MILLISECONDS);

Предполагая, что вы очищаете каждые 30 секунд, вы можете использовать _sum и _count для получения средней записанной продолжительности:

increase(processingDuration_seconds_sum[1m])/increase(processingDuration_seconds_count[1m])

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

((increase(processingDuration_seconds_sum[1m])/
increase(processingDuration_seconds_count[1m]))*1.50) >
increase(processingDuration_seconds_sum[24h])/
increase(processingDuration_seconds_count[24h])

Это вернуло бы только значения, где среднее значение за 1 м больше, чем 1,5 раза в день в среднем. (Я не проверял этот запрос, но он должен понять).

0 голосов
/ 20 января 2020

Проблема была, long не является поточно-ориентированным, см. этот ответ . Делая это как задокументировано работает как положено:

private final AtomicLong processingDuration;

// ...

// in constructor:
processingDuration = meterRegistry.gauge("processingDuration", new AtomicLong(0L));

// ...

// before finishing the data entries' handling:
long millis = Duration.between(dataEntry.getReceivedTimestamp(), Instant.now()).toMillis();
LOG.info(millis + "ms");
processingDuration.set(millis);
...