Поиск по сайту:

Как настроить StatsD для сбора произвольной статистики для Graphite в Ubuntu 14.04


Введение

Graphite — это графическая библиотека, которая позволяет визуализировать различные типы данных гибким и мощным способом. Он отображает данные, отправленные ему другими приложениями для сбора статистики.

В предыдущих руководствах мы обсуждали, как установить и настроить collectd для сбора статистики системы и служб.

В этом руководстве мы обсудим, как установить и настроить StatsD. StatsD — это легкий демон сбора статистики, который можно использовать для сбора произвольной статистики.

StatsD сбрасывает статистику в Graphite синхронно с настроенным интервалом записи Graphite. Для этого он объединяет все данные между интервалами сброса и создает отдельные точки для каждой статистики, которые отправляются в Graphite.

Таким образом, StatsD позволяет приложениям обойти действующее ограничение скорости отправки статистики Graphite. Он имеет множество библиотек, написанных на разных языках программирования, что упрощает встраивание отслеживания статистики в ваши приложения.

В этом руководстве мы установим и настроим StatsD. Мы предполагаем, что вы следовали инструкциям по установке из предыдущих руководств и что у вас настроены Graphite и collectd на вашем сервере Ubuntu 14.04.

Установить статистику

Программа StatsD недоступна в стандартных репозиториях Ubuntu. Однако он доступен на GitHub и содержит файлы конфигурации, необходимые для его компиляции в пакет Ubuntu.

Получить компоненты

Прежде чем мы установим настоящую программу, нам нужно получить несколько пакетов из репозиториев. Нам нужен git, чтобы мы могли клонировать репозиторий. Нам также нужен node.js, потому что StatsD — это приложение node.

Нам также нужно несколько пакетов, которые позволят нам собрать пакет Ubuntu. Давайте получим все это сейчас:

sudo apt-get install git nodejs devscripts debhelper

Мы собираемся создать пакет в нашем домашнем каталоге. В частности, мы создадим каталог с именем \build в нашем домашнем каталоге, чтобы завершить этот процесс.

Создайте каталог сейчас:

mkdir ~/build

Теперь мы клонируем проект StatsD в этот каталог. Перейдите в каталог, а затем выполните команду клонирования:

cd ~/build
git clone https://github.com/etsy/statsd.git

Соберите и установите пакет

Перейдите в новый каталог, содержащий наши файлы StatsD:

cd statsd

Теперь мы можем создать пакет StatsD, просто введя эту команду:

dpkg-buildpackage

Файл .deb будет создан в каталоге ~/build. Давайте вернемся в этот каталог.

cd .. 

Прежде чем мы установим пакет, мы хотим остановить нашу службу Carbon. Причина этого в том, что служба StatsD сразу же начнет отправлять информацию, когда она установлена и еще не настроена должным образом.

Остановите службу Carbon на данный момент, введя эту команду:

sudo service carbon-cache stop

Затем мы можем установить пакет в нашу систему:

sudo dpkg -i statsd*.deb

Как мы уже говорили, процесс Statsd запускается автоматически. Давайте пока остановимся и перезапустим наш сервис Carbon. Это позволит нам настроить StatsD, оставив Carbon активным для других наших сервисов:

sudo service statsd stop
sudo service carbon-cache start

Сервис StatsD теперь установлен на нашем сервере! Однако нам все еще нужно настроить все наши компоненты для правильной совместной работы.

Настроить статистику

Первое, что мы должны сделать, это изменить файл конфигурации StatsD.

Откройте файл в текстовом редакторе:

sudo nano /etc/statsd/localConfig.js

Это должно выглядеть так:

<пред>

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

StatsD использует это для организации своих данных по-другому. Однако в более поздних версиях стандартизирована более интуитивно понятная структура. Мы хотим использовать новый формат.

Для этого нам нужно добавить следующие строки:

<пред>

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

Создайте схему хранения для StatsD

Далее нам нужно определить еще несколько схем хранения.

Откройте файл схемы хранилища:

sudo nano /etc/carbon/storage-schemas.conf

Мы собираемся использовать точно такую же политику хранения, которую мы определили для collectd. Единственная разница заключается в названии и соответствующем шаблоне.

StatsD отправляет все свои данные в Graphite с префиксом stats, поэтому мы можем сопоставить этот шаблон. Не забудьте поставить это над спецификацией хранилища по умолчанию:

[statsd]
pattern = ^stats.*
retentions = 10s:1d,1m:7d,10m:1y

Сохраните и закройте файл, когда закончите.

Создание конфигурации агрегации данных

Давайте настроим некоторые спецификации агрегации. StatsD отправляет данные очень специфическим способом, поэтому мы можем легко убедиться, что мы правильно агрегируем данные, сопоставляя правильные шаблоны.

Откройте файл в вашем редакторе:

sudo nano /etc/carbon/storage-aggregation.conf

Нам нужно гибко настроить нашу агрегацию, чтобы точно преобразовать наши значения. Мы возьмем некоторые подсказки из проекта StatsD о том, как лучше всего агрегировать данные.

На данный момент агрегация выглядит так:

<пред>

[Макс]

[сумма]

[по умолчанию_среднее]

Мы хотим сопоставить метрики, оканчивающиеся на .sum или .count, и добавить значения для их агрегирования. У нас уже есть один из них (с разделом sum), но он немного неправильно помечен, поэтому мы его скорректируем.

Мы также хотим взять минимальное и максимальное значения для метрик, оканчивающихся на .lower и .upper соответственно. Эти имена метрик также могут иметь числа после них, так как они могут использоваться для обозначения верхнего значения определенного процента (например, upper_90).

Наконец, мы хотим настроить наши датчики, которые просто измеряют текущее значение чего-то (например, спидометра). Мы хотим настроить их так, чтобы они всегда отправляли последнее значение, которое мы ему дали. В этом случае мы не хотели бы использовать среднее значение или любое другое расчетное значение.

В итоге файл должен выглядеть примерно так:

<пред>

[Макс]

[количество]

[ниже]

[upper]

[сумма]

[датчики]

[по умолчанию_среднее]

Сохраните и закройте его, когда закончите.

Запустите службы

Теперь, когда у вас все настроено, мы можем заняться управлением сервисом.

Во-первых, вам нужно перезапустить Carbon, чтобы применить новые настройки, которые вы только что установили. Лучше полностью остановить службу, подождать несколько секунд, а затем запустить ее, чем просто использовать команду «перезапустить»:

sudo service carbon-cache stop      ## wait a few seconds here
sudo service carbon-cache start

Теперь вы также можете запустить службу StatsD, которая будет подключаться к Carbon:

sudo service statsd start

Как и сам Carbon, StatsD также сообщает о своей собственной статистике. Это означает, что вы можете сразу же увидеть новую информацию, если снова посетите свою страницу Graphite в своем браузере. Обновите страницу, если она уже была запущена:

<пред>

Как видите, у нас есть довольно много различной информации, и все они относятся к самой StatsD:

Давайте немного узнаем о том, как передавать данные StatsD и как мы можем с ними взаимодействовать.

Анатомия показателей данных StatsD

Служба StatsD подключается к службе Graphite с помощью соединения TCP. Это обеспечивает надежную передачу информации.

Однако сам StatsD прослушивает UDP-пакеты. Он собирает все пакеты, отправленные ему за определенный период времени (по умолчанию 10 секунд). Затем он объединяет полученные пакеты и сбрасывает одно значение для каждой метрики в Carbon.

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

Из-за различий между этими программами мы отправляем данные в StatsD немного иначе, чем когда мы отправляем их прямо в Graphite. Если вы помните, мы отправляем данные в Graphite, указывая имя метрики, значение и отметку времени, например:

<пред>

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

Синтаксис выглядит следующим образом:

<пред>

Это отправит пакет UDP на порт, который прослушивает StatsD.

Имейте в виду, что, как и при прямой отправке статистики в Graphite, это не тот способ, которым обычно отправляется статистика. Метод nc предназначен только для демонстрации.

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

Название и значение метрики говорят сами за себя. Давайте рассмотрим возможные типы метрик и их значение для StatsD:

  • c: это указывает на «количество». По сути, он суммирует все значения, которые StatsD получает для метрики в пределах интервала сброса, и отправляет общее значение. Это похоже на метод агрегирования «сумма», который Использование Carbon, поэтому мы посоветовали Carbon использовать этот метод агрегирования при хранении более длительных интервалов такого рода показателей.
  • g: указывает на датчик. Датчик показывает текущее значение чего-либо, подобно спидометру или указателю уровня топлива. В этих ситуациях нас интересует только самое последнее значение. StatsD будет продолжать отправлять Carbon одно и то же значение, пока не получит другое значение. Компания Carbon собирает эти данные, используя «последний» метод, чтобы сохранить смысл информации.
  • s: эта маркировка означает, что переданные значения являются математическим набором. Наборы в математике содержат уникальные значения. Таким образом, мы можем кинуть кучу значений этого типа в StatsD, и он подсчитает, сколько раз он получил уникальные значения. Это может быть полезно для таких задач, как подсчет количества уникальных пользователей (при условии, что у вас есть атрибут уникального идентификатора, связанный с ними).
  • мс: это указывает на то, что значение представляет собой промежуток времени. StatsD принимает значение времени и на самом деле создает довольно много различных фрагментов информации на основе данных. Он передает компании Carbon информацию о средних значениях, процентилях, стандартном отклонении, сумме и т. д. Каждая из них должна быть правильно агрегирована Carbon, поэтому мы добавили довольно много методов агрегации.

Как видите, StatsD многое делает для того, чтобы наши метрики было легче усваивать. Он говорит о статистике таким образом, который имеет смысл для большинства приложений, и он сделает большую часть тяжелой работы с точки зрения преобразования данных в правильный формат, если вы сообщите ему, что представляют данные.

Изучение различных типов данных

Датчики

Давайте отправим некоторые данные в StatsD, чтобы проверить это. Самый простой — манометр. Это установит текущее состояние метрикой, поэтому оно будет передавать только последнее полученное значение:

echo "sample.gauge:14|g" | nc -u -w0 127.0.0.1 8125

Теперь, если через десять секунд (скорость сброса StatsD) мы обновим интерфейс Graphite, мы должны увидеть новую статистику (она будет под stats > gauges > sample иерархия).

Обратите внимание, что на этот раз линия не прерывается. Мы можем обновить график, и для каждого интервала будет значение. Раньше у Graphite были пробелы в данных из-за отсутствия значений определенных показателей в течение определенного периода времени. С датчиком StatsD отправляет последнее доступное значение каждый раз, когда он сбрасывается. Предполагается, что вы просто скажете, когда это значение должно измениться.

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

echo "sample.gauge:10|g" | nc -u -w0 127.0.0.1 8125

Теперь подождите не менее десяти секунд, чтобы StatsD отправил это значение, а затем отправьте:

echo "sample.gauge:18|g" | nc -u -w0 127.0.0.1 8125

Вы увидите график, похожий на этот (мы рассматриваем 8-минутный таймфрейм):

Как видите, это очень похоже на то, как уже работает Graphite, в том смысле, что он записывает только одно значение за каждые десять секунд. Разница в том, что StatsD гарантирует, что для каждого интервала используется последнее известное значение.

Считает

Давайте немного сравним это, настроив метрику количества.

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

Например, мы можем запустить метрику count в StatsD много раз подряд:

echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125

Теперь, предполагая, что все они были отправлены в одном и том же интервале (некоторые значения могли оказаться по обе стороны от границы интервала), мы должны увидеть одно значение счетчика при обновлении интерфейса. Обязательно настройте интерфейс так, чтобы отображались только последние 5–15 минут.

На самом деле создаются две метрики. Метрика count сообщает нам количество вхождений в интервале сброса, а метрика rate делит это число на десять, чтобы получить количество вхождений в секунду. Эти два будут выглядеть так:

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

Наборы

Давайте попробуем набор прямо сейчас.

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

echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:11|s" | nc -u -w0 127.0.0.1 8125

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

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

Таймеры

Таймеры, пожалуй, самая интересная метрика.

StatsD больше всего работает при расчете данных для таймеров. Он отправляет Carbon много разных показателей:

echo "sample.timer:512|ms" | nc -u -w0 127.0.0.1 8125

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

Это может выглядеть примерно так:

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

Кормление StatsD Метрики

Теперь, когда вы понимаете, как устроены пакеты, давайте кратко рассмотрим одну из библиотек StatsD, которую мы можем использовать для отправки данных в нашей программе. Любой язык, поддерживающий отправку UDP-пакетов, может создавать метрики StatsD, но библиотеки могут сделать это особенно простым.

Поскольку Graphite использует Django, давайте останемся в этой среде и проверим библиотеку Python.

Сначала установите pip, менеджер пакетов Python:

sudo apt-get install python-pip

Теперь мы можем сказать ему установить последнюю версию пакета python-statsd, набрав:

sudo pip install python-statsd

Это очень простой клиент StatsD.

Запустите интерактивный сеанс Python для загрузки библиотеки:

python

Теперь мы можем импортировать библиотеку, набрав:

import statsd

Отсюда использование действительно простое. Мы можем создавать объекты, представляющие наши различные показатели, а затем настраивать их по своему усмотрению.

Например, мы можем создать объект датчика, а затем установить его на 15, набрав:

gauge = statsd.Gauge('Python_metric')
gauge.send('some_value', 15)

Затем мы можем использовать gauge.send для отправки любых значений, которые мы хотим, в StatsD. Библиотека имеет аналогичную функциональность с другими типами метрик. О них вы можете узнать, заглянув на страницу проекта.

У вас должно быть довольно хорошее представление о том, как встроить отслеживание в ваши приложения. Возможность отправлять произвольные показатели в StatsD для отслеживания и анализа делает отслеживание статистики настолько простым, что нет причин не собирать данные.

Заключение

На этом этапе у вас должен быть установлен и настроен Graphite. Пройдя этот и последний учебник, вы также настроили collectd для сбора показателей производительности вашей системы и StatsD для сбора произвольных данных о ваших собственных проектах разработки.

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

Джастин Эллингвуд