mirror of
https://gitverse.ru/kpa39l/openspec-lab.git
synced 2026-09-29 09:15:01 +00:00
vinograd-rostelecom-channel-monitoring: archived (Vinograd WAN ICMP monitoring, /opt/monitoring)
This commit is contained in:
+2
@@ -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` при необходимости.
|
||||
+48
@@ -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` — заметка об опыте
|
||||
+59
@@ -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
|
||||
Reference in New Issue
Block a user