Перейти к содержанию

graphite: Модуль NGINX для сбора статистики в Graphite

Установка

Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:

  • RedHat Enterprise Linux 7, 8, 9 и 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-graphite
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-graphite

Включите модуль, добавив следующее в верхней части файла /etc/nginx/nginx.conf:

load_module modules/ngx_http_graphite_module.so;

Этот документ описывает nginx-module-graphite v4.3, выпущенный 20 января 2023 года.


Модуль 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 <path prefix> [params=<params>] [if=<condition>]

контекст: 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 <path prefix> [params=<params>] [if=<condition>]

контекст: 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=<path> interval=<time value> aggregate=<func>

контекст: location

Параметр Обязательный Описание
name Да префикс пути для всех графиков
interval Да* интервал агрегации, формат значения временного интервала (m - минуты)
aggregate Да* функция агрегации значений
percentile Да* уровень перцентиля

функции агрегации

func Описание
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 ms avg общее время, затраченное на обработку запроса
bytes_sent bytes avg длина http-ответа
body_bytes_sent bytes avg длина тела http-ответа
request_length bytes avg длина http-запроса
ssl_handshake_time ms avg время, затраченное на ssl-рукопожатие
ssl_cache_usage % last сколько SSL-кэша использовано
content_time ms avg время, затраченное на генерацию контента внутри nginx
gzip_time ms avg время, затраченное на сжатие контента на лету
upstream_time ms avg время, затраченное на взаимодействие с upstream
upstream_connect_time ms avg время, затраченное на подключение к upstream (nginx >= 1.9.1)
upstream_header_time ms 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 ms 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/

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-graphite.