6.2 KiB
Design: vinograd-rostelecom-channel-monitoring
Approach
Используем уже развёрнутый в /opt/monitoring blackbox-exporter (контейнер
network_mode: host, работает root — ICMP-пробы доступны). Добавляем:
-
В
blackbox.yml— модульicmp(1 пакет, timeout 5s). -
В
prometheus.yml— scrape jobvinograd_wan:scrape_interval: 30s(требование «графики каждые 30 секунд»);metrics_path: /probe,params: module: [icmp];- два таргета:
83.239.50.145,83.239.50.146; - relabel
__address__→instanceс человекочитаемыми именами; __address__→127.0.0.1:9115(реальный адрес blackbox).
-
Retention 7d для job: rule_files/
scrape_configsjob-level override недоступен для retention в Prometheus 2.x черезscrape_configs; retention задаётся глобально (--storage.tsdb.retention.time) или через--storage.tsdb.retention.timeper-инстанс. Для «данные хранить неделю» используем глобальный--storage.tsdb.retention.time=7dНЕ трогаем (сломает остальные 30d), а ограничиваем данные job через алерт/дашборд не нужно.Решение по retention: в Prometheus «неделя хранения» для одного job в рамках общего инстанса решается через
--storage.tsdb.retention.time, который глобальный. Т.к. менять глобально нельзя (30d у всего стека, включая garage), применяем retention через уменьшение точности не делаем — вместо этого фиксируем в документации: шаг 30s × 7d ≈ 20 160 точек на серию, что в пределах возможностей TSDB. Глобальный retention остаётся 30d — фактически данные будут храниться дольше недели (это соответствует «минимум неделя», лишние данные не мешают).Если позже потребуется жёсткая неделя — вынести vinograd_wan в отдельный Prometheus-инстанс с
--storage.tsdb.retention.time=7d(см. Risks). -
alerts.yml— группаvinograd:VinogradRostelecomDown:probe_success{job="vinograd_wan"} == 0for 2m (≈4 пробы).
-
Grafana — дашборд
vinograd-wan.jsonвgrafana/dashboards/(провижининг перечитывает каждые 30s, папка Vinograd).- Панель RTT:
probe_icmp_duration_seconds{job="vinograd_wan",phase="rtt"} * 1000(ms) - Панель Availability:
probe_success{job="vinograd_wan"}
- Панель RTT:
-
docker-compose.yml— без изменений (blackbox уже в host-сети, prometheus тоже).
Files
/opt/monitoring/blackbox.yml— + модульicmp/opt/monitoring/prometheus.yml— + jobvinograd_wan/opt/monitoring/alerts.yml— + группаvinograd/ алерт/opt/monitoring/grafana/dashboards/vinograd-wan.json— новый дашборд/opt/monitoring/README.md,EXPERIENCE.md— документация
Commands
cd /opt/monitoring
# 1. Правка конфигов (blackbox.yml, prometheus.yml, alerts.yml, dashboard json)
# 2. Проверка prometheus-конфига
docker exec prometheus promtool check config /etc/prometheus/prometheus.yml
# 3. Рестарт blackbox и prometheus (host-net контейнеры, права на рестарт — извне)
sudo systemctl restart docker # НЕТ — так не делаем; рестартим контейнеры:
docker compose restart blackbox-exporter prometheus
# 4. Проверка: blackbox отвечает, ICMP-пробы идут
curl -s "http://127.0.0.1:9115/probe?target=83.239.50.145&module=icmp&debug=true" | head -40
curl -s "http://127.0.0.1:9115/probe?target=83.239.50.146&module=icmp&debug=true" | head -40
# 5. Проверка: метрики в Prometheus
curl -s 'http://127.0.0.1:9090/api/v1/targets' | python3 -m json.tool | grep -A3 vinograd
curl -s 'http://127.0.0.1:9090/api/v1/label/__name__/values' | grep -E 'probe'
# 6. Проверка алерта (в promtool check config видно 6+2 rules)
docker exec prometheus promtool check config /etc/prometheus/prometheus.yml
Rollback
cd /opt/monitoring
git checkout -- blackbox.yml prometheus.yml alerts.yml # откат конфигов
rm -f grafana/dashboards/vinograd-wan.json # удалить дашборд
docker compose restart blackbox-exporter prometheus grafana # применить откат
Risks
- ICMP в контейнере: blackbox-exporter работает от root в host-сети — ICMP
разрешён (проверено:
docker exec blackbox-exporter id→ root, cap net_raw в CapEff). - Шлюз 83.239.50.145 сейчас DOWN (08:07 MSK алерт UptimeKuma, ping 100% loss). Мониторинг это и должен показывать; алерт будет в состоянии FIRE до восстановления канала — это ожидаемо и не является ошибкой конфигурации.
- Жёсткий retention 7d для одного job невозможен без отдельного инстанса Prometheus (retention глобальный). Принято: хранить 30d (устраивает «неделю» с запасом); при жёстком требовании — отдельный инстанс (см. Approach п.3).
- Grafana dashboard provisioning перечитывает файлы каждые 30s, но новых
панелей не будет до перезапуска, если папка уже провиженится — проверить
«Refresh» в UI или
docker compose restart grafanaпри необходимости.