настройка vps, часть 3: метрики caddy в grafana

Содержание:

В первой части подняли хост и базовую безопасность, во второй - Caddy как реверс-прокси, Prometheus + Grafana c дашбордами по хосту и контейнерам. Снаружи видим, что блог работает, изнутри есть метрики хоста и контейнеров. Но мы не видим сам HTTP-трафик: сколько запросов в секунду, какой процент 5xx и т.д. В конце поста у вас будет настроенный дашборд для HTTP-метрик, который вы можете редактировать под свои нужды.


Финальный чеклист


Главное


Этап 1. Включаем metrics в Caddy

Дока Caddy по метрикам: https://caddyserver.com/docs/metrics

Включим метрики в /etc/caddy/Caddyfile:

{
    email username@example.com
    admin off
    servers {
        metrics
    }
}

:2019 {
    metrics /metrics
}

...

Валидируем и перечитываем:

sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy

Если в логах будет Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 39}:

sudo caddy fmt --overwrite /etc/caddy/Caddyfile

Проверим, что метрики доступны на хосте:

curl -s http://localhost:2019/metrics | head -20

Должны быть строки вроде caddy_admin_http_requests_total, caddy_http_request_duration_seconds_bucket и т. д.

Этап 2. UFW-правило для доступа из docker-сети

Напоминаю, что Prometheus живёт в контейнере и стучится к Caddy через docker-bridge. По дефолту UFW блокирует трафик от docker-сетей к хосту.

Так же, как это делали для node_exporter в части 2, открываем 2019 для стандартного диапазона 172.16.0.0/12:

sudo ufw allow from 172.16.0.0/12 to any port 2019 proto tcp
sudo ufw reload

Снаружи 2019 по-прежнему недоступен: UFW пускает только source IP из 172.16.0.0/12.

Этап 3. Добавляем Caddy в prometheus.yml

В ~/services/observability/prometheus/prometheus.yml добавляем job:

  - job_name: 'caddy'
    static_configs:
      - targets: ['172.17.0.1:2019']

172.17.0.1 - дефолтный IP моста docker0 (тот же, что использовали для node_exporter в части 2).

Перечитываем конфиг Prometheus без рестарта:

docker compose exec prometheus kill -HUP 1

Проверяем, что таргет ожил:

curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | select(.labels.job == "caddy") | {scrapeUrl, health}'

Будет:

{
  "scrapeUrl": "http://172.17.0.1:2019/metrics",
  "health": "up"
}

Если health: "down", проверьте UFW: sudo ufw status verbose. Должен отдать:

2019/tcp                   ALLOW IN    172.16.0.0/12

Этап 4. Импорт дашборда

Dashboards -> New -> Import.

grafana

Я взял этот: https://grafana.com/grafana/dashboards/24146-caddy-hosts/, ID: 24146

В DS_PROMETHEUS не забываем выбрать prometheus.

После импорта на дашборде увидим статистику по HTTP-запросам, разбивку по HTTP кодам и т.д.

Что дальше

Метрики собираются, дашборд показывает графики. Следующий шаг - настройка алертов, чтобы при превышении порогов мы получали нотификации (в Telegram).