Алгоритм действий состоит из следующих шагов:
1.Запуск Varnish-экспортера для сбора метрик с Varnish и отдачи их Prometheus-у
2.Настройка Prometheus-а для сбора метрик с Varnish-экспортера
3.Импортирование/настройка dashboard Grafana для визуализации метрик
4.Настрйка правил Prometheus для мониторинга Varnish показателей
1.Запуск Varnish-экспортера для сбора метрик с Varnish и отдачи их Prometheus-у
Интегрируем Varnish-экспортер с контейнер, в котором запускается Varnish
Для корректного сбора метрик Varnish-экспортером с Varnish-а-контенейр, экспортер должен успешно выполнить команду prometheus_varnish_exporter -test, которая под капотом дергает команду Varnish-а для получения статистики — varnishstat
Для Varnish использовал версии 6.2, запускаю в docker-compose через сборку образа на основе Dockerfile
https://github.com/coopTilleuls/docker-varnish
В Dockerfile добавил установку varnish-экспортера
1 |
# nano Dockerfile |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
… ### Integration varnish-exporter ARG VARNISH_EXPORTER_VERSION=1.5.1 ADD https://github.com/jonnenauha/prometheus_varnish_exporter/releases/download/${VARNISH_EXPORTER_VERSION}/prometheus_varnish_exporter-${VARNISH_EXPORTER_VERSION}.linux-amd64.tar.gz /root/ RUN cd /root && \ tar -zxvf prometheus_varnish_exporter-${VARNISH_EXPORTER_VERSION}.linux-amd64.tar.gz && \ mv prometheus_varnish_exporter-${VARNISH_EXPORTER_VERSION}.linux-amd64/prometheus_varnish_exporter /root/ && \ chmod +x prometheus_varnish_exporter && \ cp prometheus_varnish_exporter /usr/local/bin/prometheus_varnish_exporter && \ rm -rf /root/prometheus_varnish_exporter-${VARNISH_EXPORTER_VERSION}.linux-amd64.tar.gz /root/prometheus_varnish_exporter-${VARNISH_EXPORTER_VERSION}.linux-amd64 COPY docker-varnish-entrypoint /usr/local/bin/ ENTRYPOINT ["docker-varnish-entrypoint"] CMD ["varnishd", "-F", "-f", "/usr/local/etc/varnish/default.vcl"] |
В docker-varnish-entrypoint файл,который запускается при старте контейнера через ENTRYPOINT, добавил команду по запуску varnish-exporter-а
1 |
/root/prometheus_varnish_exporter & |
1 |
# nano varnish/docker-varnish-entrypoint |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/sh set -e # first arg is `-f` or `--some-option` if [ "${1#-}" != "$1" ]; then set -- varnishd "$@" fi # allow the container to be started with `--user` if [ "$1" = 'varnishd' ] && [ "$(id -u)" = '0' ]; then chown -R varnish:varnish . fi ### start varnish-exporter /root/prometheus_varnish_exporter & exec "$@" |
Исходный файл docker-varnish-entrypoint взял отсюда
https://github.com/coopTilleuls/docker-varnish/blob/master/docker-varnish-entrypoint
В docker-compose.yml добавляем сервис varnish
Также здесь пробрасывается порт, на котором слушает запросы varnish-exporter наружу на, например, туннельный IP-адрес(10.130.14.2) и на порт, например,9131, чтобы Prometheus смог подключиться к varnish-экспортеру для сбора метрик с него.
1 |
# nano docker-compose.yml |
1 2 3 4 5 6 7 8 |
### Varnish Server + Varnish exporter ### varnish: build: context: ./varnish ports: - "10.130.14.2:9131:9131" ### varnish-exporter networks: - backend |
Собираем и запускаем varnish c встроенным varnish-экспортером
1 |
# docker-compose up -d --no-deps varnish |
1 |
# docker-compose ps | grep varnish |
1 |
api_varnish_1 docker-varnish-entrypoint ... Up 80/tcp, 10.130.14.2:9131->9131/tcp |
1 |
# docker ps | grep varnish |
1 |
35a2e31b0f00 api_varnish "docker-varnish-entr…" 3 minutes ago Up 3 minutes 80/tcp, 10.130.14.2:9131->9131/tcp api_varnish_1 |
1 |
# docker images | grep varnish |
1 |
api_varnish latest c47aad82070a 4 minutes ago 201MB |
C хоста, на котором запущен varnish проверяем доступность метрик
1 |
# curl 10.130.14.2:9131/metrics | wc -l |
1 |
2120 |
C мониторинг хоста
1 |
# curl 10.130.14.2:9131/metrics | wc -l |
1 |
2120 |
2.Настройка Prometheus-а для сбора метрик с Varnish-экспортера
Добавляем varnish-экпортер в service discovery файл
1 |
# nano prometheus/sd/targets-varnish-exporter.yml |
1 2 3 4 5 |
- targets: - api.mydomain.com:9131 labels: env: prod job: varnish-exporter |
Подключаем этот service discovery файл в Prometheus
1 |
# nano prometheus/prometheus.yml |
1 2 3 4 |
- job_name: 'varnish-exporter' file_sd_configs: - files: - sd/targets-varnish-exporter.yml |
Проверка синтаксиса конфиг.файла Prometheus и файлов с правилами
1 |
# (cd /home/devops/monstack && ../prometheus-2.10.0.linux-amd64/promtool check config ./prometheus/prometheus.yml && echo OK || echo FAIL) |
Перечитываем конф.файл Prometheus
1 |
# curl -X POST https://adminuser:adminpassword@prometheus.mydomain.com/-/reload |
После чего проверяем в Prometheus наличие новой цели для мониторинга
1 |
Prometheus->Status->Target |
3.Импортирование/настройка dashboard Grafana для визуализации метрик
Импортируем дашбоард отсюда
https://github.com/jonnenauha/prometheus_varnish_exporter/blob/master/dashboards/jonnenauha/dashboard.json
Я изменил его под свои задачи
Varnish-dashboard.zip
4.Настройка правил Prometheus для мониторинга Varnish показателей
Добавляем несколько правил для мониторинга Varnish показателей
1.Запущен ли Varnish(varnish_is_running)
2.Количество недоступных бакендов выше допустимого значения(varnish_number_backend_down
3.Увеличение количества клиентских подключений к Varnish (varnish_high_number_client/frontend_connections)
4.Увеличение количества подключений к backend-ам Varnish-а (varnish_high_number_backend_connections)
5.Коэффициет кеширования меньше допустимого значения(varnish_cache_hit_rate)
1 |
# nano prometheus/services_rules.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
- name: varnish rules: ########## varnish ########## - alert: varnish_is_running expr: varnish_up == 0 for: 30s labels: severity: critical annotations: summary: "Critical: Varnish is down on the host {{ $labels.instance }}." description: "Varnish has been down for more than 30 seconds" - alert: varnish_number_backend_down_ expr: count by (instance) (varnish_backend_up == 0) > 10 for: 60s labels: severity: critical annotations: summary: "Critical: Varnish number of DOWN backends too many(>10) on the instance {{ $labels.instance }} for more than 1 minutes" description: "Varnish number of DOWN backends are {{ $value }}" - alert: varnish_high_number_client/frontend_connections expr: rate(varnish_main_client_req{job="varnish-exporter"}[5m]) > 400 for: 3m labels: severity: critical annotations: description: "Critical: varnish high number client/frontend connections(>400) on the host {{ $labels.instance }} for more than 3 minutes" summary: "Varnish number client/frontend connections is {{ $value }}" - alert: varnish_high_number_backend_connections expr: rate(varnish_main_backend_req{job="varnish-exporter"}[5m]) > 300 for: 3m labels: severity: critical annotations: description: "Critical: varnish high number backend connections(>300) on the host {{ $labels.instance }} for more than 3 minutes" summary: "Varnish number backend connections is {{ $value }}" - alert: varnish_cache_hit_rate expr: avg(( rate(varnish_main_cache_hit{job="varnish-exporter"}[5m]) / rate(varnish_main_client_req{job="varnish-exporter"}[5m]) )) * 100 < 20 for: 5m labels: severity: warning annotations: description: "Warning: Varnish cache hit rate is too small(<20%) on the host {{ $labels.instance }} for more than 3 minutes" summary: "Varnish cache hit rate is {{ $value }}%" |
Проверка синтаксиса конфиг.файла Prometheus и файлов с правилами
1 |
# (cd /home/myusername/monstack && ../prometheus-2.10.0.linux-amd64/promtool check config ./prometheus/prometheus.yml && echo OK || echo FAIL) |
Перечитываем конф.файл Prometheus
1 |
# curl -X POST https://adminuser:adminpassword@prometheus.mydomain.com/-/reload |
После чего в Prometheus→Alerts появляются добавленные правила
Источник:
https://github.com/jonnenauha/prometheus_varnish_exporter
https://github.com/jonnenauha/prometheus_varnish_exporter/blob/master/dashboards/jonnenauha/dashboard.json