Сбор метрик для Graphite с помощью StatsD в Ubuntu 14.04

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

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

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

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

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

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

1: Установка StatsD

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

Загрузка компонентов

Прежде чем установить программу, нужно загрузить несколько пакетов из: git (чтобы клонировать репозиторий), node.js (потому что StatD является приложением node),а также несколько вспомогательных пакетов.

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

2: Настройка StatsD

Откройте конфигурационный файл StatsD в текстовом редакторе:

sudo nano /etc/statsd/localConfig.js

Он содержит такие строки:

{
graphitePort: 2003
, graphiteHost: "localhost"
, port: 8125
}

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

Для этого добавьте в файл строку:

{
graphitePort: 2003
, graphiteHost: "localhost"
, port: 8125
, graphite: {
legacyNamespace: false
}
}

Сохраните и закройте файл.

3: Создание схемы хранения данных StatsD

Теперь нужно определить схемы хранения данных.

Откройте файл storage-schemas:

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

Здесь можно использовать точно такую же политику хранения, как и для collectd. Отличаться будут только имя и шаблон.

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

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

Сохраните и закройте файл.

4: Настройка агрегации данных

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

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

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

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

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

[min]
pattern = \.min$
xFilesFactor = 0.1
aggregationMethod = min
[max]
pattern = \.max$
xFilesFactor = 0.1
aggregationMethod = max
[sum]
pattern = \.count$
xFilesFactor = 0
aggregationMethod = sum
[default_average]
pattern = .*
xFilesFactor = 0.5
aggregationMethod = average

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

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

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

В результате файл будет выглядеть так:

[min]
pattern = \.min$
xFilesFactor = 0.1
aggregationMethod = min
[max]
pattern = \.max$
xFilesFactor = 0.1
aggregationMethod = max
[count]
pattern = \.count$
xFilesFactor = 0
aggregationMethod = sum
[lower]
pattern = \.lower(_\d+)?$
xFilesFactor = 0.1
aggregationMethod = min
[upper]
pattern = \.upper(_\d+)?$
xFilesFactor = 0.1
aggregationMethod = max
[sum]
pattern = \.sum$
xFilesFactor = 0
aggregationMethod = sum
[gauges]
pattern = ^.*\.gauges\..*
xFilesFactor = 0
aggregationMethod = last
[default_average]
pattern = .*
xFilesFactor = 0.5
aggregationMethod = average

Сохраните и закройте файл.

5: Запуск сервиса

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

sudo service carbon-cache stop      ## подождите пару секунд
sudo service carbon-cache start

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

sudo service statsd start

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

http://domain_name_or_ip

6: Метрики StatsD

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

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

Важно понимать, что 10-секундный интервал указан в схеме хранения как самый короткий интервал хранения. Очень важно, чтобы эти два значения конфигурации совпадали, потому что это позволяет StatD обойти ограничения Carbon (Carbon принимает одно значение за каждый интервал).

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

echo "metric_name metric_value `date +%s` | nc -q0 127.0.0.1 2003

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

echo "metric_name:metric_value|type_specification" | nc -u -w0 127.0.0.1 8125

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

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

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

  • c (сокращение от count): суммирует все значения метрик, которые StatsD получает в пределах интервала, и отправляет общее значение. Он похож на метод агрегации sum, который использует Carbon.
  • g (gauge): определяет датчик. В данной ситуации нужно только его последнее значение. Демон StatsD будет продолжать отправлять Carbon то же самое значение, пока он не получит другое значение. Carbon агрегирует эти данные с помощью метода last для поддержания значения информации.
  • s (set): означает, что переданные значения являются математическим набором. Наборы в математике содержат уникальные значения. Таким образом, демон StatD может получить множество значений этого типа и подсчитать количество раз, когда он получил уникальные значения. Это может быть полезно для решения таких задач, как вычисление количества уникальных пользователей (при условии, что упользователей есть уникальный атрибут id).
  • ms: означает, что значение представляет собой временной интервал. StatsD принимает значение времени и создает довольно много разных фрагментов информации на основе данных. Демон передает в Carbon информацию о средних значениях, процентилях, стандартном отклонении, сумме и т. д.

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

7: Типы данных

Метрика gauge

Отправьте в StatsD какие-нибудь данные, чтобы проверить работу демона. Датчик – самый простой тип, который определяет текущее состояние метрики и передает только последнее значение.

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

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

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

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

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

Подождите 10 секунд, чтобы StatsD отправил значение, и снова отправьте данные:

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

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

Метрика count

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

К примеру, можно отправить в StatsD несколько метрик count.

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 делит это число на десять, чтобы отобразить количество вхождений в секунду.

Просмотрите полученный график. Метрика count не хранит свои значения между интервалами отправки данных.

Метрика set

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

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

Метрика timer

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

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

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

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

8: Сбор метрик StatsD

Теперь, когда у вас есть понимание того, как структурированы пакеты, давайте вкратце рассмотрим одну из библиотек StatD, которую можно использовать для отправки данных в программе. Любой язык, который имеет возможности отправки 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

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

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

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

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

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

Tags: , ,