ORCH-063 — Disk-watchdog: мониторинг диска mva154 + Telegram-алерт при ≥85% #98

Merged
admin merged 7 commits from feature/ORCH-063-infra-mva154-85 into main 2026-06-09 19:13:33 +03:00
Owner

ORCH-063 — INFRA: мониторинг диска mva154 + Telegram-алерт при ≥85%

Новый фоновый daemon-поток disk-watchdog (src/disk_watchdog.py) — недостающий проактивный сигнал о заполнении хост-диска. 07.06.2026 диск mva154 тихо дорос до 100% и положил весь self-hosting-конвейер всех проектов (один прод-инстанс на общей БД/очереди). Калька каркаса reconciler/job_reaper.

Что сделано

  • Замер хост-ФС (FR-2/AC-8): каждые disk_monitor_interval_s (300с) — shutil.disk_usage по смонтированным bind-путям (/repos, /app/data), НЕ overlay /, НЕ df; дедуп по st_dev. Битый путь → пропуск, остальные меряются.
  • Решение об алерте (FR-3/FR-4): pure-функция decide_action(used_pct, threshold, prev, now, realert_s) — алерт на пересечении порога (85%, граница >=), cooldown-повтор (~6ч, анти-спам), однократный recovery ниже порога. send_telegram notifying, best-effort.
  • Конфиг + kill-switch (FR-5): ORCH_DISK_MONITOR_* с defensive-валидацией (порог 1..100, интервалы > 0 → дефолт+warning). enabled=false → демон не стартует, /queue{"enabled": false} (1:1 как сейчас).
  • Наблюдаемость (FR-6): аддитивный блок disk_monitor в GET /queue; существующие ключи не тронуты; status() never-raise.
  • Lifecycle: старт/стоп в main.lifespan (старт последним после reaper.start(), стоп первым).

Инварианты

STAGE_TRANSITIONS/QG_CHECKS/check_*/схема БД — не тронуты, миграций нет (анти-спам in-memory). never-raise (per-path/per-tick/per-send). Self-hosting безопасность: только читает и уведомляет, не трогает диск/контейнер, не рестартит прод. Откат: ORCH_DISK_MONITOR_ENABLED=false.

Тесты и документация

  • tests/test_disk_watchdog.py — TC-01..TC-12 (18 кейсов: pure decision, dedup, never-raise, формат, kill-switch, status, /queue). Полный регресс tests/ зелёный (1296).
  • Обновлены: docs/operations/INFRA.md, .env.example, CHANGELOG.md (компонент в docs/architecture/README.md + ADRs — на стадии architecture).

Refs: ORCH-063

🤖 Generated with Claude Code

## ORCH-063 — INFRA: мониторинг диска mva154 + Telegram-алерт при ≥85% Новый фоновый daemon-поток **disk-watchdog** (`src/disk_watchdog.py`) — недостающий **проактивный** сигнал о заполнении хост-диска. 07.06.2026 диск mva154 тихо дорос до 100% и положил весь self-hosting-конвейер всех проектов (один прод-инстанс на общей БД/очереди). Калька каркаса `reconciler`/`job_reaper`. ### Что сделано - **Замер хост-ФС (FR-2/AC-8):** каждые `disk_monitor_interval_s` (300с) — `shutil.disk_usage` по смонтированным bind-путям (`/repos`, `/app/data`), НЕ overlay `/`, НЕ `df`; дедуп по `st_dev`. Битый путь → пропуск, остальные меряются. - **Решение об алерте (FR-3/FR-4):** pure-функция `decide_action(used_pct, threshold, prev, now, realert_s)` — алерт на пересечении порога (85%, граница `>=`), cooldown-повтор (~6ч, анти-спам), однократный recovery ниже порога. `send_telegram` notifying, best-effort. - **Конфиг + kill-switch (FR-5):** `ORCH_DISK_MONITOR_*` с defensive-валидацией (порог 1..100, интервалы > 0 → дефолт+warning). `enabled=false` → демон не стартует, `/queue` → `{"enabled": false}` (1:1 как сейчас). - **Наблюдаемость (FR-6):** аддитивный блок `disk_monitor` в `GET /queue`; существующие ключи не тронуты; `status()` never-raise. - **Lifecycle:** старт/стоп в `main.lifespan` (старт последним после `reaper.start()`, стоп первым). ### Инварианты `STAGE_TRANSITIONS`/`QG_CHECKS`/`check_*`/схема БД — **не тронуты**, миграций нет (анти-спам in-memory). never-raise (per-path/per-tick/per-send). Self-hosting безопасность: только читает и уведомляет, не трогает диск/контейнер, не рестартит прод. Откат: `ORCH_DISK_MONITOR_ENABLED=false`. ### Тесты и документация - `tests/test_disk_watchdog.py` — TC-01..TC-12 (18 кейсов: pure decision, dedup, never-raise, формат, kill-switch, status, /queue). Полный регресс `tests/` зелёный (1296). - Обновлены: `docs/operations/INFRA.md`, `.env.example`, `CHANGELOG.md` (компонент в `docs/architecture/README.md` + ADRs — на стадии architecture). Refs: ORCH-063 🤖 Generated with [Claude Code](https://claude.com/claude-code)
admin added 6 commits 2026-06-09 19:04:37 +03:00
Adds src/disk_watchdog.py — a background daemon thread modelled on
reconciler/job_reaper that measures host-FS fill via the mounted bind-paths
(/repos, /app/data) with shutil.disk_usage and Telegram-alerts the operator at
>= threshold (default 85%). The missing proactive signal: on 07.06.2026 the
mva154 host disk silently hit 100% and stalled the whole self-hosting pipeline.

- Pure decide_action(used_pct, threshold, prev, now, realert_s): alert on
  crossing up, cooldown re-alert, single recovery below threshold (unit-tested
  without a thread/timer; clock injected).
- measure_paths: shutil.disk_usage per path, dedup by st_dev, per-path
  never-raise (a broken path never fails the tick).
- Config flags ORCH_DISK_MONITOR_* with defensive validation (threshold 1..100,
  positive intervals -> default + warning). Kill-switch -> daemon does not start.
- Additive disk_monitor block in GET /queue; start/stop in main.lifespan.
- never-raise (per-path/per-tick/per-send); STAGE_TRANSITIONS/QG_CHECKS/check_*/
  DB schema untouched, no migration (anti-spam state in-memory).

Tests: tests/test_disk_watchdog.py (TC-01..TC-12, 18 cases); full suite green
(1296). Docs: INFRA.md, .env.example, CHANGELOG.md (architecture/README.md +
ADRs authored at architecture stage).

Refs: ORCH-063
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tester(ET): auto-commit from tester run_id=488
All checks were successful
CI / test (push) Successful in 35s
CI / test (pull_request) Successful in 32s
efd744f766
admin force-pushed feature/ORCH-063-infra-mva154-85 from cf7370710e to efd744f766 2026-06-09 19:04:37 +03:00 Compare
admin added 1 commit 2026-06-09 19:08:50 +03:00
deploy(ORCH-036): finalize SUCCESS for ORCH-063
All checks were successful
CI / test (push) Successful in 30s
CI / test (pull_request) Successful in 30s
2bd3bb75d4
admin merged commit 4d74d981da into main 2026-06-09 19:13:33 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/orchestrator#98