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

Я изучал графический инструмент Graphite для показа показателей с нескольких серверов, и кажется, что "рекомендуемый" способ - сначала отправить все данные показателей в StatD. StatD объединяет данные и отправляет их графиту (или, скорее, Carbon).

В моем случае я хочу делать простые агрегации, такие как сумма и среднее по метрикам на серверах, и строить график в графите. Графит поставляется с агрегатором углерода, который может это сделать.

StatD даже не обеспечивает агрегацию, о которой я говорю.

Мой вопрос: должен ли я использовать statsd вообще для моего варианта использования? Что мне здесь не хватает?

Ответ 1

  • StatD работает над UDP, что устраняет риск того, что carbon-aggregator.py будет медленно реагировать и вводит латентность в вашем приложении. Другими словами, свободная связь.

  • StatD поддерживает выборку входящих показателей, что полезно, если вы не хотите, чтобы ваш агрегатор принимал 100% всех точек данных для вычисления описательной статистики. Для секций большого объема кода обычно используют 0,5% -1% частоты дискретизации, чтобы не перегружать StatD.

  • У StatsD есть поддержка на стороне клиента.

Ответ 2

TL;DR: вам, вероятно, понадобится statsd (или carbon-c-relay), если вы когда-нибудь захотите посмотреть зависящие от сервера суммы или средние значения.

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

пример statsd: предположим, что ваш графический файл storage-schemas.conf имеет минимальное сохранение в 10 секунд (по умолчанию), и ваше приложение отправляет приблизительно 100 точек данных каждые 10 секунд в services.login.server1.count со значением 1. без statsd, графит будет хранить только последний счет, полученный в каждом 10-секундном ковше. после получения 100-го сообщения другие 99 точек данных были бы выброшены. однако, если вы ставите statsd между вашим приложением и графитом, тогда он суммирует все 100 точек данных вместе, прежде чем отправлять общее количество на графит. так что без statsd ваш график указывает только, произошел ли вход в течение 10-секундного интервала. с statsd, это указывает, сколько логинов произошло в течение этого интервала. (например)

пример агрегата углерода: Предположим, что у вас 200 разных серверов, сообщающих 200 отдельных показателей (services.login.server1.response.time, services.login.server2.response.time и т.д.). на панели операций вы показываете график среднего количества всех серверов, использующих этот графитовый запрос: weightedAverage (services.login.server *.response.time, services.login.server *.response.count, 2). к сожалению, рендеринг этого графика занимает 10 секунд. для решения этой проблемы вы можете добавить правило углеродного агрегатора, чтобы предварительно вычислить среднее значение на всех ваших серверах и сохранить значение в новой метрике. теперь вы можете обновить свою панель инструментов, чтобы просто вытащить одну метрику (например, services.login.response.time). новая метрика проявляется почти мгновенно.

боковые заметки:

  • правила агрегации в storage-aggregation.conf применяются ко всем интервалам хранения в схеме хранения-schemas.conf, за исключением первого (наименьшего) периода хранения для каждой строки хранения. можно использовать углерод-агрегатор для агрегирования точек данных в пределах показателя для этого первого периода хранения. К сожалению, aggregation-rules.conf использует шаблоны "blob", а не шаблоны регулярных выражений. поэтому вам нужно добавить отдельную запись файла aggregation-rules.conf для каждой глубины пути и типа агрегации. преимущество statsd в том, что клиент, отправляющий метрику, может указывать тип агрегации, а не кодировать его в пути к метрике. что дает вам возможность добавлять новую метрику "на лету" независимо от глубины метрического пути. если вы хотите настроить агрегатор углерода, чтобы автоматически создавать статистическую агрегацию при добавлении новой метрики, ваш файл aggregation-rules.conf выглядел бы примерно так:

    <n1>.avg (10)= avg <n1>.avg$
    <n1>.count (10)= sum <n1>.count$
    <n1>.<n2>.avg (10)= avg <n1>.<n2>.avg$
    <n1>.<n2>.count (10)= sum <n1>.<n2>.count$
    <n1>.<n2>.<n3>.avg (10)= avg <n1>.<n2>.<n3>.avg$
    <n1>.<n2>.<n3>.count (10)= sum <n1>.<n2>.<n3>.count$
    ...
    <n1>.<n2>.<n3> ... <n99>.count (10)= sum <n1>.<n2>.<n3> ... <n99>.count$
    

    примечания: конечный "$" не нужен в графике 0.10+ (в настоящее время предварительный выпуск) вот соответствующий патч для github и вот стандартная документация по правилам агрегации

  • функция weightedAverage является новой в графике 0.10, но обычно функция averageSeries дает очень похожее число, пока ваша загрузка равномерно сбалансирована. если у вас есть несколько серверов, которые работают медленнее и обслуживают меньшее количество запросов, или вы просто ориентированы на точность, то вы можете рассчитать средневзвешенное значение с графитом 0.9. вам просто нужно построить более сложный запрос:

    divideSeries(sumSeries(multiplySeries(a.time,a.count), multiplySeries(b.time,b.count)),sumSeries(a.count, b.count))
    
  • Если statsd запускается на клиентском поле, это также снижает нагрузку на сеть. хотя, теоретически, вы могли бы запустить агрегат углерода на стороне клиента. однако, если вы используете одну из клиентских библиотек statsd, вы также можете использовать выборку, чтобы уменьшить нагрузку на процессор вашей прикладной машины (например, создавать пакеты loopback udp). Кроме того, statsd может автоматически выполнять несколько разных агрегатов на одной входной метрике (сумма, среднее значение, мин, макс и т.д.)

  • если вы используете statsd на каждом сервере приложений для агрегирования времени отклика, а затем повторно агрегируете эти значения на графитном сервере с помощью агрегатора углерода, вы получите среднее время отклика, взвешенное сервером приложений, а не запрос. очевидно, это имеет значение только для агрегирования с использованием правила агрегации среднего или верхнего уровня, а не min, max или sum. Кроме того, это имеет значение только для среднего, если ваша нагрузка не сбалансирована. в качестве примера: предположим, что у вас есть кластер из 100 серверов, и вдруг 1 сервер отправляется 99% трафика. следовательно, время ответа на четыре сервера на этом 1 сервере, но остается неизменным на остальных 99 серверах. если вы используете агрегацию на стороне клиента, ваш общий показатель будет расти примерно на 3%. но если вы сделаете всю свою агрегацию в одном агрегаторе углерода на стороне сервера, то ваша общая метрика увеличится примерно на 300%.

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

  • если вы используете cyanite back-end вместо углеродного кеша, тогда цианит сделает внутримерную усреднение для вас в памяти (от версия 0.5.1) или во время чтения (в версии < 0.1.3).

Ответ 3

Если агрегатор углерода предлагает все, что вам нужно, нет причин не использовать его. Он имеет две основные функции агрегации (сумма и среднее), и действительно, они не покрываются StatD. (Я не уверен в истории, но, возможно, агрегатор углерода уже существует, и авторы StatD не хотели дублировать функции?) Получение данных через UDP также поддерживается Carbon, поэтому единственное, что вы пропустили бы, это выборка, что не имеет значения, если вы агрегируете путем усреднения.

StatD поддерживает разные типы показателей, добавляя дополнительные совокупные значения (например, для таймеров: средний, нижний, верхний и верхний X-ый процентили,...). Мне они нравятся, но если они вам не нужны, агрегатор углерода - хороший способ пойти тоже.

Я смотрел исходный код агрегатора углерода и StatsD (и Bucky, реализация StatD в Python) и все они настолько просты, что я бы не стал беспокоиться об использовании ресурсов или производительности для любого выбора.

Ответ 4

Похоже, что агрегатор углерода и statsd поддерживают несвязанный набор функций:

  • statsd поддерживает вычисление и суммирование ставок, но не поддерживает значения усреднения
  • Углеродный агрегатор поддерживает усреднение, но не поддерживает расчет скорости.

Ответ 5

Поскольку графит имеет минимальное разрешение, вы не можете сохранить два разных значения для одного и того же показателя за определенный интервал. StatsD решает эту проблему, предварительно агрегируя их, и вместо того, чтобы сказать "1 пользователь зарегистрирован сейчас" и "1 пользователь зарегистрирован сейчас", он говорит "Зарегистрировано 2 пользователя".

Другая причина - производительность, потому что:

  • Вы отправляете данные в StatD через UDP, который является протоколом огня и забывания, безстоящим, гораздо быстрее
  • Реализация StatD etsy выполняется в NodeJS, что также сильно увеличивает производительность.