Отслеживая метрики с помощью StatsD (через etsy) и Graphite, графитовый граф, кажется, не отображает все данные - PullRequest
21 голосов
/ 18 августа 2011

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

Итак, исходя из этой догадки, мы инвестировали обновления.журнал углерода и обнаружил, что действие произошло сегодня более 4 тысяч раз (с использованием grep и wc), но в соответствии с интегральным результатом графика он вернул только 220ish.

Что может быть причиной этого?Данные передаются в statsd с использованием библиотеки statsd php и вызова statsd::increment('metric');, и, как указано выше, журнал подтверждает, что более 4000 обновлений этого ключа произошло сегодня.

Мы используем:

графит 0.9.6 с statsD (etsy)

Ответы [ 2 ]

60 голосов
/ 18 августа 2011

После некоторых исследований документации и разговоров с другими я нашел проблему - и решение.

То, как разработан формат файла «шепот», предполагает, что вы (или ваше приложение) будете публиковать обновления не быстрее, чем минимальный интервал в вашем файле storage-schemas.conf. Этот файл используется для настройки степени хранения данных при разных разрешениях временного интервала.

Мой storage-schemas.conf файл был установлен с минимальным временем хранения 1 минута. Демон StatsD по умолчанию (от etsy) предназначен для обновления до carbon (графитового демона) каждые 10 секунд. Причина в том, что проблема заключается в том, что за 60-секундный период StatsD сообщает 6 раз, каждая запись перезаписывает последнюю (в этом 60-секундном интервале, потому что вы обновляете быстрее, чем раз в минуту). Это приводит к действительно странным результатам на вашем графике, потому что последние 10 секунд в минуту могут быть полностью мертвыми и сообщать 0 для активности в течение этого периода, что приводит к полному обнулению всех данных, которые вы записали за эту минуту.

Чтобы это исправить, мне пришлось перенастроить файл storage-schemas.conf для хранения данных с максимальным разрешением 10 секунд, чтобы каждое обновление из StatsD сохранялось в базе данных шепотом без перезаписи.

Etsy опубликовала конфигурацию storage-schemas.conf, которую они использовали для установки углерода, которая выглядит следующим образом:

[stats]
priority = 110
pattern = ^stats\..*
retentions = 10:2160,60:10080,600:262974

Это имеет минимальное время хранения 10 секунд и сохраняет их на 6 часов. Однако из-за моей следующей проблемы я значительно продлил сроки хранения.

Когда я позволил этим данным собираться в течение нескольких дней, я заметил, что они все еще выглядят непонятно (и находились в процессе отчетности). Это было связано с 2 проблемами.

  1. StatsD (более старые версии) сообщал только о среднем количестве событий в секунду за каждый 10-секундный отчетный период. Это означает, что если вы увеличивали ключ 100 раз в 1 секунду и 0 раз в течение следующих 9 секунд, в конце 10-й секунды statsD сообщит 10 графиту вместо 100. (100/10 = 10). При этом не удалось сообщить общее количество событий за 10-секундный период (очевидно).

    Более новые версии statsD решают эту проблему, поскольку они представили корзину stats_counts, которая регистрирует общее количество событий на показатель для каждого 10-секундного периода (таким образом, вместо отчета 10 в предыдущем примере, он сообщает 100).

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

  2. Поскольку графит хранит данные, он перемещает данные из высокоточного хранения в более низкую точность хранения. Это означает, что на примере etsy storage-schemas.conf после 6 часов с точностью 10 секунд данные были перемещены с точностью до 60 секунд (1 минута). Чтобы переместить 6 точек данных с точностью от 10 с до 60 с, графит делает среднее из 6 точек данных. Таким образом, потребуется взять общее значение 6 самых старых точек данных и разделить его на 6. Это дает среднее количество событий за 10 секунд за этот 60-секундный период (а не общее количество событий, что нас волнует о конкретно).

    Вот как устроен графит, и в некоторых случаях это может быть полезно, но в нашем случае это не то, что мы хотели. Чтобы «исправить» эту проблему, я увеличил время удержания точности 10 секунд до 60 дней. По истечении 60 дней я сохраняю точные и 10-минутные значения точности, но они, по сути, существуют без всякой причины, так как эти данные не так полезны для нас.

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

17 голосов
/ 17 декабря 2011

После публикации моего комментария выше я обнаружил, что в Graphite 0.9.9 есть (новый?) Файл конфигурации storage-aggregation.conf, в котором можно управлять методом агрегации для каждого шаблона. Доступны следующие варианты: среднее, сумма, минимум, максимум и последний.

http://readthedocs.org/docs/graphite/en/latest/config-carbon.html#storage-aggregation-conf

...