Возвращаемся к теме мониторинга в Angie. Ранее мы запускали базовую конфигурацию с экспортом метрик в Prometheus и визуализацией в Grafana. В этой статье мы задействуем возможности создания кастомных метрик, которые в конечном итоге отобразим в виде графиков в Grafana.

Навигация по циклу

  1. Почему стоит переходить на Angie.

  2. Установка Angie из пакетов и в докере.

  3. Переезд с Nginx на Angie. Пошаговая инструкция.

  4. Настройка location в Angie. Разделение динамических и статических запросов.

  5. Перенаправления в Angie: return, rewrite и примеры их применения.

  6. Сжатие текста в Angie: статика, динамика, производительность.

  7. Серверное кэширование в Angie: тонкости настройки.

  8. Настройка TLS в Angie: безопасность и скорость.

  9. Настройка Angie в роли обратного HTTP-прокси.

  10. Балансировка нагрузки для HTTP(S) в Angie.

  11. Мониторинг Angie с помощью Console Light и API.

  12. Балансировка и проксирование L4-трафика в Angie.

  13. Клиентское кэширование в Angie.

  14. Динамические группы проксируемых серверов в Angie.

  15. Мониторинг Angie с Prometheus и Grafana.

  16. Отказоустойчивый кластер Angie с VRRP и Keepalived.

  17. Контроль доступа в Angie.

  18. Аутентификация клиентов в Angie с помощью TLS-сертификатов.

  19. Кастомизация Angie (njs, Lua, Perl).

  20. Запуск CGI-скриптов в Angie.

  21. Защита от DoS-атак в Angie стандартными модулями.

  22. Защита от DoS-атак в Angie (дополнительные средства).

  23. Автоматические TLS-сертификаты в Angie с модулем ACME.

  24. HTTP/2 и HTTP/3: настройка, достоинства и недостатки.

  25. Работа с картинками в Angie.

  26. Инструменты для бенчмарка веб-сервера.

  27. Тест современных компрессоров для HTTP.

  28. Визуализация кастомных метрик 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‑заголовки.

Комментарии (0)