vinograd-rostelecom-channel-monitoring: archived (Vinograd WAN ICMP monitoring, /opt/monitoring)

This commit is contained in:
estorozhenko
2026-09-08 06:12:08 +00:00
parent 34e3b67c96
commit e195f0030d
8 changed files with 312 additions and 2 deletions
@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-09-08
@@ -0,0 +1,95 @@
# Design: vinograd-rostelecom-channel-monitoring
## Approach
Используем уже развёрнутый в /opt/monitoring blackbox-exporter (контейнер
`network_mode: host`, работает root — ICMP-пробы доступны). Добавляем:
1. В `blackbox.yml` — модуль `icmp` (1 пакет, timeout 5s).
2. В `prometheus.yml` — scrape job `vinograd_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).
3. **Retention 7d для job**: rule_files/`scrape_configs` job-level override
недоступен для retention в Prometheus 2.x через `scrape_configs`; retention
задаётся глобально (`--storage.tsdb.retention.time`) или через
`--storage.tsdb.retention.time` per-инстанс. Для «данные хранить неделю»
используем глобальный `--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).
4. `alerts.yml` — группа `vinograd`:
- `VinogradRostelecomDown`: `probe_success{job="vinograd_wan"} == 0` for 2m (≈4 пробы).
5. 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"}`
6. `docker-compose.yml` — без изменений (blackbox уже в host-сети, prometheus тоже).
## Files
- `/opt/monitoring/blackbox.yml` — + модуль `icmp`
- `/opt/monitoring/prometheus.yml` — + job `vinograd_wan`
- `/opt/monitoring/alerts.yml` — + группа `vinograd` / алерт
- `/opt/monitoring/grafana/dashboards/vinograd-wan.json` — новый дашборд
- `/opt/monitoring/README.md`, `EXPERIENCE.md` — документация
## Commands
```bash
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
```bash
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` при необходимости.
@@ -0,0 +1,48 @@
# Proposal: vinograd-rostelecom-channel-monitoring
## Why
Внешний канал связи «Винный город» (провайдер Ростелеком, договор Бастион)
периодически пропадает: 2026-09-08 08:07 (MSK) UptimeKuma зафиксировал
**100% потерю пакетов на шлюзе 83.239.50.145** (PING, 10/10 lost). Сейчас
доступность канала не контролируется нашим стеком мониторинга
(/opt/monitoring: Prometheus + Grafana + Loki + blackbox-exporter) — алерты
приходят только из внешнего UptimeKuma. Нужно поставить оба адреса канала
из реестра «Реестр внешних каналов связи.ods» (закладка «Винный город») на
мониторинг в наш стек:
- **IP нашего оборудования:** `83.239.50.146` (Static IP, маска 255.255.255.252 /30)
- **Шлюз:** `83.239.50.145`
## What Changes
- В blackbox-exporter добавляется модуль `icmp` (ICMP-проба, дефолт 1 пакет/проба, timeout 5s).
- В Prometheus добавляется scrape job `vinograd_wan`:
- проба ICMP обоих адресов (83.239.50.145 шлюз, 83.239.50.146 оборудование);
- интервал **30 секунд** (для чётких графиков RTT);
- метрики `probe_success` (доступность) и `probe_icmp_duration_seconds{phase="rtt"}`
(время ответа) с лейблом `instance` = человекочитаемые имена
(`vinograd-gw-83.239.50.145`, `vinograd-cpe-83.239.50.146`).
- Добавляется алерт `VinogradRostelecomDown` (critical, 2 подряд неудачных пробы).
- В Grafana добавляется дашборд **Vinograd WAN** (панели RTT + доступность обоих адресов).
- Retention: неделя (7d) для данных этого job (Prometheus TSDB общий retention 30d,
для job `vinograd_wan` задаётся переопределение retention 7d).
## Capabilities
### New Capabilities
- `vinograd-wan-monitoring`: ICMP-мониторинг внешнего канала Винный город (RTK)
с графиками RTT каждые 30s и хранением 7 дней.
### Modified Capabilities
- `monitoring-stack` (Prometheus/blackbox/alerts/Grafana) — добавляется job,
модуль, алерт, дашборд для vinograd WAN.
## Impact
- `/opt/monitoring/blackbox.yml` — модуль `icmp`
- `/opt/monitoring/prometheus.yml` — job `vinograd_wan` (scrape_interval 30s, retention 7d)
- `/opt/monitoring/alerts.yml` — алерт VinogradRostelecomDown
- `/opt/monitoring/grafana/dashboards/vinograd-wan.json` — новый дашборд
- `/opt/monitoring/README.md` — документация (адреса, метрики, алерт)
- `/opt/monitoring/EXPERIENCE.md` — заметка об опыте
@@ -0,0 +1,59 @@
# Delta for vinograd-wan-monitoring
## ADDED Requirements
### Requirement: ICMP Probe of Vinograd WAN Channel
The system MUST probe both external channel addresses of the Vinograd (Винный город) site
via ICMP every 30 seconds and store the results in Prometheus.
| Address | Role |
|---|---|
| 83.239.50.145 | Gateway (шлюз Ростелеком) |
| 83.239.50.146 | CPE / our equipment (оборудование) |
#### Scenario: Both addresses probed every 30s
- GIVEN blackbox-exporter has an `icmp` module and Prometheus job `vinograd_wan`
- WHEN 30 seconds elapse
- THEN `probe_success` and `probe_icmp_duration_seconds{phase="rtt"}` are scraped
for both 83.239.50.145 and 83.239.50.146
- AND each series carries a human-readable `instance` label
(`vinograd-gw-83.239.50.145`, `vinograd-cpe-83.239.50.146`)
#### Scenario: Probe failure
- GIVEN an address does not answer ICMP (e.g. gateway down)
- WHEN the probe runs
- THEN `probe_success` for that instance equals 0
- AND the alert `VinogradRostelecomDown` fires after 2 consecutive failed probes (2m at 30s interval)
### Requirement: RTT Response-Time Graphs
The system MUST record ICMP round-trip time (phase "rtt") so Grafana can plot
response-speed graphs every 30 seconds.
#### Scenario: RTT recorded
- GIVEN an address answers ICMP
- WHEN the probe completes
- THEN `probe_icmp_duration_seconds{phase="rtt"}` holds the round-trip time in seconds
### Requirement: 7-Day Data Retention
Prometheus MUST retain `vinograd_wan` metrics for 7 days.
#### Scenario: Old data dropped after a week
- GIVEN vinograd_wan metrics have been collected for more than 7 days
- WHEN Prometheus compacts the TSDB
- THEN samples older than 7 days for job vinograd_wan are dropped
- AND other jobs keep their default 30d retention
### Requirement: Grafana Dashboard
The system MUST provide a Grafana dashboard "Vinograd WAN" with:
- RTT (response time) graph for both addresses (ms),
- availability (probe_success) panel for both addresses,
- legend showing `vinograd-gw-83.239.50.145` / `vinograd-cpe-83.239.50.146`.
#### Scenario: Dashboard shows data
- GIVEN Grafana has the Vinograd WAN dashboard provisioned
- WHEN a user opens it
- THEN it shows the RTT graph and availability of both channel addresses
@@ -0,0 +1,26 @@
# Tasks
## 1. Конфигурация blackbox-exporter
- [x] 1.1 В `/opt/monitoring/blackbox.yml` добавить модуль `icmp` (timeout 5s)
- [x] 1.2 Проверка: `curl "http://127.0.0.1:9115/probe?target=83.239.50.146&module=icmp&debug=true"` → probe_success=1, rtt значение
## 2. Конфигурация Prometheus
- [x] 2.1 В `/opt/monitoring/prometheus.yml` добавить job `vinograd_wan` (scrape_interval 30s, module icmp, таргеты 83.239.50.145/146, relabel instance)
- [x] 2.2 Проверка: `docker exec prometheus promtool check config /etc/prometheus/prometheus.yml` → OK
- [x] 2.3 Рестарт: `docker compose restart blackbox-exporter prometheus`
- [x] 2.4 Проверка: `curl http://127.0.0.1:9090/api/v1/targets` → vinograd_wan UP ×2
- [x] 2.5 Проверка: метрики `probe_success{job="vinograd_wan"}` присутствуют в Prometheus (query API)
## 3. Алерт
- [x] 3.1 В `/opt/monitoring/alerts.yml` добавить группу `vinograd` с алертом VinogradRostelecomDown (probe_success == 0, for 2m, critical)
- [x] 3.2 Проверка: `promtool check config` → rules включают VinogradRostelecomDown
## 4. Grafana дашборд
- [x] 4.1 Создать `/opt/monitoring/grafana/dashboards/vinograd-wan.json` (RTT ms + Availability)
- [x] 4.2 Проверка: дашборд Vinograd WAN виден в Grafana и показывает данные
## 5. Документация и git
- [x] 5.1 Обновить `/opt/monitoring/README.md` (адреса, job, метрики, алерт)
- [x] 5.2 Добавить запись в `/opt/monitoring/EXPERIENCE.md`
- [ ] 5.3 `git add` (поимённо) + commit + push в gitverse (истина), gitea подтянет mirror
- [ ] 5.4 `openspec validate` + `openspec archive --yes` + обновить STATUS.md/WALKTHROUGH.md openspec-lab