Возвращаемся к теме мониторинга в Angie. Ранее мы запускали базовую конфигурацию с экспортом метрик в Prometheus и визуализацией в Grafana. В этой статье мы задействуем возможности создания кастомных метрик, которые в конечном итоге отобразим в виде графиков в Grafana.
Навигация по циклу
Настройка location в Angie. Разделение динамических и статических запросов.
Перенаправления в Angie: return, rewrite и примеры их применения.
Сжатие текста в Angie: статика, динамика, производительность.
Визуализация кастомных метрик Angie в Grafana.
Видеоверсия
Для вашего удобства подготовлена видеоверсия этой статьи, доступна на Rutube, VKVideo и YouTube.
Кастомные метрики в Angie
Сервер Angie имеет очень развитые возможности мониторинга «из коробки», но также позволяет расширять их без ограничений. Возможности расширения реализуются штатным модулем Metric, который был рассмотрен в статье от разработчиков. Если вы не знакомы с этим модулем, то рекомендую. На этот раз мы настроим одну из очень полезных метрик — время ответа апстрима. В бесплатной версии такая метрика не экспортируется, хотя очень полезна. Причём задача состоит в том, чтобы провести метрику через весь стэк мониторинга, вплоть до отображения графика в Grafana.
Кастомные метрики настраиваются на основе переменных. Для времени ответа апстрима есть готовая переменная, которая содержит нужное нам значение: $upstream_response_time.
Начнём с простого: создаём зону разделяемой памяти для хранения метрики в контексте http и саму метрику для сбора статистики по адресу сервера:
http { metric_zone upstream_time:1m expire=on average mean window=15s count=20; metric upstream_time $upstream_addr=$upstream_response_time on=end; }
Название зоны: upstream_time, размер 1 МБ, при переполнении будут отброшены старые значения, алгоритм расчёта — среднее за окно (15 секунд).
После объявления зоны создаём саму метрику, в качестве ключа используем адрес сервера ($upstream_addr), а значения — время ответа сервера ($upstream_response_time). С помощью этой метрики мы будем знать среднее время ответа каждого сервера (апстрима).
В некоторых конфигурациях такой детализации может оказаться недостаточно. Например, если Angie обслуживает несколько сайтов и мы хотим учитывать метрику времени ответа отдельно для каждого из них. Для решения этой задачи добавим еще одну зону метрики:
http { metric_zone site:1m expire=on average mean window=15s; }
Параметры этой зоны практически аналогичны предыдущей. При этом метрику мы будем объявлять на уровне локации в каждом сайте (блок server). Например, так:
upstream apache { zone apache 10m; server 127.0.0.1:9090; } server { ... location / { metric upstream_time $upstream_addr=$upstream_response_time on=end; metric site $server_name=$upstream_response_time on=end; proxy_pass http://apache; } }
Обратите внимание, что адрес сервера определён в блоке upstream, что позволяет более тонко настроить работу с ним, а также улучшит отображение метрик в дашборде Grafana (мы можем видеть название группы, кроме адреса сервера). Метрика объявлена на уровне локации для проксирования запросов, на этот раз ключом для метрики будет имя сервера ($server_name). Также мы дублируем определение общей метрики (upstream_time), чтобы метрики из этой локации также учитывались.
Проверить сбор метрик можно с помощью HTTP API, допустим, что он настроен на URI /api/ и доступен по localhost, тогда значения метрик можно получить следующими запросами:
curl http://localhost/api/http/metric_zones/site/ curl http://localhost/api/http/metric_zones/upstream_time/
Если ответ содержит JSON с нужными значениями, значит настройка успешна. В случае нулевых значений отправьте несколько тестовых запросов на сервер для обновления метрик.
Итак, метрики собираются и следующий шаг — настроить их экспорт в Prometheus.
Экспорт в Prometheus
На этом этапы мы предполагаем, что базовый экспорт метрик и их отображение в Grafana уже настроены, как это было описано в статье про мониторинг. Если мониторинг Angie в Grafana еще на настроен, то необходимо провести все настройки из упомянутой статьи и потом возвращаться к этому этапу.
Новые метрики нужно добавить в конфигурационный файл экспорта prometheus_all.conf (по умолчанию находится в /etc/angie). Добавляем строки в блоке prometheus_template all:
'angie_http_upstreams_response_time{server_name="$1"}' $p8s_value path=~^/http/metric_zones/site/metrics/(.+?)$ type=gauge 'help=Upstream response time by server_name in HTTP.'; 'angie_http_upstreams_response_time_stats{upstream_addr="$1"}' $p8s_value path=~^/http/metric_zones/upstream_time/metrics/(.+?)$ type=gauge 'help=Upstream response time by upstream_addr in HTTP.';
Первая директива описывает экспорт метрики site (время ответа апстрима по сайтам), вторая — общую статистику по адресам серверов (upstream_time). В качестве ключа мы указываем значение сохраняющих скобок в регулярном выражении ($1), тип метрики gauge, адреса установлены в соответствии с названиями метрик.
Проверить экспорт можно после обновления конфигурации сервера по адресу для выгрузки метрик в Prometheus (у нас это http://localhost/p8s):
curl http://localhost/p8s ... # HELP angie_http_upstreams_response_time Upstream response time by server_name in HTTP. # TYPE angie_http_upstreams_response_time gauge angie_http_upstreams_response_time{server_name="ttt.ru"} 0 angie_http_upstreams_response_time{server_name="ttt2.ru"} 0 # HELP angie_http_upstreams_response_time_stats Upstream response time by upstream_addr in HTTP. # TYPE angie_http_upstreams_response_time_stats gauge angie_http_upstreams_response_time_stats{upstream_addr="127.0.0.1:9090"} 0.1285
Отлично, метрики экспортируются и накапливаются в Prometheus. Осталось добавить для них визуализацию в дашборд.
Визуализация в Grafana
Отображать метрики мы будем в виде графиков. Чтобы упростить задачу настройки можно стартовать с клонирования уже существующего графика из дашборда.
Для этого заходим в дашборд Angie и включаем режим редактирования (кнопка Edit в верхнем правом углу). Далее находим график (например, Upstream Peer Responses — 4xx Codes) и в меню (правый верхний угол) выбираем действие: More.. → Duplicate.

Далее заходим в редактирование дублированного графика (Edit). Меняем название на Upstream Response Time. В нижней панели (Queries) меняем запрос к метрике на:
angie_http_upstreams_response_time{instance="$node", job="$job"}
В поле Legend (панель Options) ставим: {{server_name}}. Таким образом, мы формируем график времени ответа по сайтам. Результат должен выглядеть так:

Далее по желанию можно более тонко настроить график в правой панели (Visualization): внешний вид линий на графике и изменить цветовую палитру. Также в этой панели нужно установить единицу измерений в поле Unit (секунды). Сохраняем график кнопкой Save Dashboard вверху справа.
Для метрики времени ответа по адресам серверов проделываем аналогичные действия, отличие в запросе к метриками и в поле Legend. Запрос должен быть:
angie_http_upstreams_response_time_stats{instance=“$node”, job=“$job”}
Поле Legend: {{upstream_addr}}. Результат настройки такой:

Также проверяем настройки в панели Visualization и сохраняем дашборд.
Если все действия прошли успешно, то получаем примерно такие графики:

На этом настройка завершена. После внесения изменений стоит провести резервное копирование кода дашборда, чтобы не потерять новые графики. Это можно сделать на странице дашборда вверху справа: Export -> Export as code.
Итоги
Модуль для создания кастомных метрик в Angie предоставляет неограниченные возможности по созданию системы мониторинга. В статье мы разобрали полный цикл создания метрик: от определение зоны до визуализации в Grafana. Наверняка для сообщества будет полезно делиться своими конфигурациями метрик обогащения дашборда Angie. При этом мониторить этой системой можно не только сам веб‑сервер или балансировщик, но и другие компоненты приложения, например, передавая метрики от бэкенда через HTTP‑заголовки.