graphite: Модуль NGINX для сбора статистики в Graphite
Установка на Debian/Ubuntu
Эти документы относятся к пакету APT nginx-module-graphite, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте APT репозиторий, как описано в настройке APT репозитория.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-graphite
Показать дистрибутивы и архитектуры
| Дистрибутив | Версия | Компонент | Архитектуры |
|-------------|-------------------|-----------|---------------|
| debian | bookworm | main | amd64, arm64 |
| debian | bookworm-mainline | main | amd64, arm64 |
| debian | trixie | main | amd64, arm64 |
| debian | trixie-mainline | main | amd64, arm64 |
| ubuntu | focal | main | amd64, arm64 |
| ubuntu | focal-mainline | main | amd64, arm64 |
| ubuntu | jammy | main | amd64, arm64 |
| ubuntu | jammy-mainline | main | amd64, arm64 |
| ubuntu | noble | main | amd64, arm64 |
| ubuntu | noble-mainline | main | amd64, arm64 |
Модуль nginx для сбора статистики по локациям в Graphite.
Возможности
- Агрегация метрик по локациям, серверам или http
- Вычисление перцентилей
- Отправка данных в Graphite по UDP или TCP неблокирующим образом
- Отправка пользовательских метрик из lua
Синопсис
http {
graphite_config prefix=playground server=127.0.0.1;
server {
location /foo/ {
graphite_data nginx.foo;
}
}
}
Описание
Этот модуль использует сегмент общей памяти для сбора агрегированных статистик от всех воркеров и отправляет рассчитанные значения за последнюю минуту в Graphite каждые 60 секунд (по умолчанию) по UDP или TCP неблокирующим образом. Агрегация статистики выполняется на лету в выделенном буфере фиксированного размера, созданном при старте сервера, и не влияет на производительность сервера.
Этот модуль активно используется на Mail.Ru Sites (одном из крупнейших веб-сервисов в России) на протяжении года и считается стабильным и хорошо протестированным.
Для сбора метрик из основных модулей nginx (ssl, gzip, upstream) необходимо применить небольшой патч к исходному коду nginx. См. инструкции по установке. Вы можете собрать этот модуль как динамический, но тогда вы не сможете собирать метрики из основных модулей nginx (ssl, gzip, upstream) и функций lua.
Директивы
graphite_config
синтаксис: graphite_config key1=<value1> key2=<value2> ... keyN=<valueN>
контекст: http
Укажите глобальные настройки для всего экземпляра сервера.
| Параметр | Обязательный | Значение по умолчанию | Описание |
|---|---|---|---|
| prefix | префикс пути для всех графиков | ||
| host | gethostname() | имя хоста для всех графиков | |
| server | Да | IP-адрес сервера carbon-cache | |
| protocol | udp | протокол сервера carbon-cache (udp или tcp) | |
| port | 2003 | порт сервера carbon-cache | |
| frequency | 60 | как часто отправлять значения в Graphite (секунды) | |
| intervals | 1m | интервалы агрегации, список временных интервалов, разделитель - вертикальная черта (m - минуты) |
|
| params | * | ограничить список метрик для отслеживания, разделитель - вертикальная черта | |
| shared | 2m | размер общей памяти, увеличьте в случае ошибки "слишком маленькая общая память" | |
| buffer | 64k | размер сетевого буфера, увеличьте в случае ошибки "слишком маленький размер буфера" | |
| package | 1400 | максимальный размер UDP-пакета | |
| template | шаблон для имени графика (по умолчанию - $prefix.$host.$split.$param_$interval) | ||
| error_log | суффикс пути для графиков ошибок (*) |
(*): работает только при применении патча nginx_error_log_limiting*.patch к исходному коду nginx.
Пример (стандартный):
http {
graphite_config prefix=playground server=127.0.0.1;
}
Пример (пользовательский):
http {
graphite_config prefix=playground server=127.0.0.1 intervals=1m|5m|15m params=rps|request_time|upstream_time template=$prefix.$host.$split.$param_$interval;
}
Пример (error_log):
http {
graphite_config prefix=playground server=127.0.0.1 error_log=log;
}
graphite_default_data
синтаксис: graphite_default_data <путь к префиксу> [params=<параметры>] [if=<условие>]
контекст: http, server
Создайте точки измерений во всех вложенных локациях. Вы можете использовать переменные "$location" или "$server", которые представляют собой имя текущей локации и имя текущего сервера с заменой всех неалфавитных символов на "_". Ведущие и конечные "_" удаляются.
Пример:
graphite_default_data nginx.$location;
location /foo/ {
}
location /bar/ {
}
Данные для /foo/ будут отправлены в nginx.foo, данные для /bar/ - в nginx.bar.
Параметр <params> (1.3.0) указывает список параметров, которые будут собираться для всех вложенных локаций. Чтобы добавить все параметры по умолчанию, используйте *.
Параметр <if> (1.1.0) включает условное логирование. Запрос не будет записан, если условие равно "0" или является пустой строкой.
Пример (с $server):
graphite_default_data nginx.$server.$location
server {
server_name foo_host;
location /foo/ {
}
}
server {
server_name bar_host;
location /bar/ {
}
}
Данные для /foo/ будут отправлены в nginx.foo_host.foo, данные для /bar/ - в nginx.bar_host.bar.
graphite_data
синтаксис: graphite_data <путь к префиксу> [params=<параметры>] [if=<условие>]
контекст: http, server, location, if
Создайте измерительную точку в конкретной локации.
Пример:
location /foo/ {
graphite_data nginx.foo;
}
Параметр <params> (1.3.0) указывает список параметров, которые будут собираться для этой локации. Чтобы добавить все параметры по умолчанию, используйте *.
Параметр <if> (1.1.0) включает условное логирование. Запрос не будет записан, если условие равно "0" или является пустой строкой.
Пример:
map $scheme $is_http { http 1; }
map $scheme $is_https { https 1; }
...
location /bar/ {
graphite_data nginx.all.bar;
graphite_data nginx.http.bar if=$is_http;
graphite_data nginx.https.bar if=$is_https;
graphite_data nginx.arg params=rps|request_time;
graphite_data nginx.ext params=*|rps|request_time;
}
graphite_param
синтаксис: graphite_param name=<путь> interval=<значение времени> aggregate=<функция>
контекст: location
| Параметр | Обязательный | Описание |
|---|---|---|
| name | Да | префикс пути для всех графиков |
| interval | Да* | интервал агрегации, формат значения временного интервала (m - минуты) |
| aggregate | Да* | функция агрегации на значениях |
| percentile | Да* | уровень перцентиля |
функции агрегации
| функция | Описание |
|---|---|
| sum | сумма значений за интервал |
| persec | сумма значений в секунду (sum делить на секунды в interval) |
| avg | среднее значение за интервал |
| gauge | значение счётчика |
Пример: см. ниже.
Nginx API для Lua
синтаксис: ngx.graphite.param(<name>)
Получите ссылку на имя параметра graphite, чтобы использовать его вместо имени для нижеуказанных функций. Ссылка действительна до перезагрузки nginx. После получения ссылки на параметр, вы всё еще можете передавать имя параметра в функции ниже. Вы можете получать ссылку на параметр несколько раз, вы всегда получите один и тот же объект по тому же имени (lightuserdata). Функция возвращает false, если параметр, указанный по имени, не существует. Функция возвращает nil в случае ошибок при получении ссылки. Функции получают информацию о параметрах по ссылке быстрее, чем по имени.
Доступно после применения патча к lua-nginx-module. Функция присутствует в патче для lua модуля версии v0.10.12. См. инструкции по установке.
синтаксис: ngx.graphite(<name_or_link>,<value>[,<config>])
Запишите значение статистики в функцию агрегатора. В value принимаются числа с плавающей запятой.
Доступно после применения патча к lua-nginx-module. См. инструкции по установке.
ngx.graphite(name, value, config)
Пример:
location /foo/ {
graphite_param name=lua.foo_sum aggregate=sum interval=1m;
graphite_param name=lua.foo_rps aggregate=persec interval=1m;
graphite_param name=lua.foo_avg aggregate=avg interval=1m;
graphite_param name=lua.foo_gauge aggregate=gauge;
content_by_lua '
ngx.graphite("lua.foo_sum", 0.01)
ngx.graphite("lua.foo_rps", 1)
ngx.graphite("lua.foo_avg", ngx.var.request_uri:len())
local foo_gauge_link = ngx.graphite.param("lua.foo_gauge")
ngx.graphite(foo_gauge_link, 10)
ngx.graphite(foo_gauge_link, -2)
ngx.graphite("lua.auto_rps", 1, "aggregate=persec interval=1m percentile=50|90|99")
ngx.say("hello")
';
}
Вы должны либо указать команду graphite_param, либо передать аргумент config.
Если вы выберете второй вариант, данные для этого графика не будут отправлены до первого вызова ngx.graphite.
Предупреждение:
Если вы не объявите график, используя команду graphite_param, то память для графика будет выделена динамически в общей памяти модуля.
Если общая память модуля исчерпана во время работы nginx, новые графики созданы не будут, и сообщение об ошибке будет записано в журнал.
синтаксис: ngx.graphite.get(<name_or_link>)
Получите значение счётчика с указанным name_or_link.
синтаксис: ngx.graphite.set(<name>,<value>)
Установите value для счётчика с указанным name_or_link.
Параметры
| Параметр | Единицы | Функция | Описание |
|---|---|---|---|
| request_time | мс | avg | общее время, затраченное на обработку запроса |
| bytes_sent | байты | avg | длина http-ответа |
| body_bytes_sent | байты | avg | длина тела http-ответа |
| request_length | байты | avg | длина http-запроса |
| ssl_handshake_time | мс | avg | время, затраченное на ssl-рукопожатие |
| ssl_cache_usage | % | last | объем используемого кэша SSL |
| content_time | мс | avg | время, затраченное на генерацию контента внутри nginx |
| gzip_time | мс | avg | время, затраченное на упаковку контента в формат gzip |
| upstream_time | мс | avg | время, затраченное на взаимодействие с upstream |
| upstream_connect_time | мс | avg | время, затраченное на подключение к upstream (nginx >= 1.9.1) |
| upstream_header_time | мс | avg | время, затраченное на заголовки upstream (nginx >= 1.9.1) |
| rps | rps | sum | общее количество запросов в секунду |
| keepalive_rps | rps | sum | количество запросов, отправленных по ранее открытому соединению keepalive |
| response_2xx_rps | rps | sum | общее количество ответов с кодом 2xx |
| response_3xx_rps | rps | sum | общее количество ответов с кодом 3xx |
| response_4xx_rps | rps | sum | общее количество ответов с кодом 4xx |
| response_5xx_rps | rps | sum | общее количество ответов с кодом 5xx |
| response_[0-9]{3}_rps | rps | sum | общее количество ответов с данным кодом |
| upstream_cache_(miss|bypass|expired|stale|updating|revalidated|hit)_rps | rps | sum | общее количество ответов с данным статусом кэша upstream |
| lua_time | мс | avg | время, затраченное на код lua |
Перцентили
Для расчета значения перцентиля для любого параметра установите уровень перцентиля через /. Например, request_time/50|request_time/90|request_time/99.
патч для добавления API для отправки метрик из кода lua (необязательно)
patch -p1 < /path/to/graphite-nginx-module/lua_module_v0_9_11.patch cd ..
wget 'http://nginx.org/download/nginx-1.9.2.tar.gz' tar -xzf nginx-1.9.2.tar.gz cd nginx-1.9.2/