---
title: Как работают наблюдаемость и алертинг
description: Три примитива ошибок, делающие тишину невозможной, долговечный error-сток и философия алертинга, построенная на болезненном уроке — «ноль полезного выхода» это провал, даже когда ничего не упало.
locale: ru
version: 0.2.0
canonical: https://enterium-developer-docs.pages.dev/developers/ru/how-it-works/observability-alerting/
---

> Documentation index: https://enterium-developer-docs.pages.dev/developers/llms.txt — every page of this portal has a Markdown twin at <route>.md; the frozen API contract is at https://enterium-developer-docs.pages.dev/developers/api/openapi.json.

**Проблема:** автономная ночная платформа падает двумя очень разными
способами — громко (исключение) и *тихо* (всё выходит с кодом 0 и не
производит ничего). Классический мониторинг ловит первый род и слеп
ко второму: флот может всю ночь производить нули при зелёных дашбордах.
Этот дизайн начинается со второго рода.

## Слой 1 — три примитива, делающие тишину структурно трудной

Вся обработка ошибок стекается в три маленьких примитива:

| Примитив | Для чего | Гарантия |
| --- | --- | --- |
| `capture_exception` | Любая пойманная ошибка | Никогда не бросает; лог + метрика + долговечная строка `error_event` (секреты вычищены) одним вызовом |
| `guarded(...)` | Одноразовые батч-операции | Ловит всё, захватывает, возвращает None — батч-шаг не может уронить процесс |
| `supervise(...)` | Долгоживущие фоновые циклы | На краше: захват + рестарт с бэкоффом — цикл не может умереть молча |

Третий — главный урок: проектор, вачдоги, health-монитор и автоскейлер
бегут под супервизией, потому что тихо умерший фоновый цикл превращается
в «платформа выглядит нормально и не делает ничего» — худший класс
отказа автономной системы.

```mermaid
flowchart TB
    ERR[Any caught error] --> CAP[capture_exception]
    CAP --> LOG[structured log]
    CAP --> MET[error counter]
    CAP --> DB[(error_event<br/>durable sink)]
    subgraph loops [Supervised background loops]
        P[projector] --- W[watchdog] --- H[health monitor] --- A[autoscaler]
    end
    loops -- crash --> CAP
    loops -- restart with backoff --> loops
```

Сток queryable (`GET /api/v1/errors` — см.
[Как читать ошибки](../../guides/reading-errors/)); запись — best-effort
по дизайну, поэтому структурная строка лога остаётся записью последней
надежды для краша раньше event-loop.

## Слой 2 — доктрина алертов «ноль — это провал»

Ночной прогон заканчивается самооценкой, различающей три плохих финала —
и третий и есть доктрина:

```mermaid
flowchart LR
    RUN[Nightly run ends] --> Q{Assess}
    Q -- half of collects failed --> C[collapse:<br/>exit 1 → alert]
    Q -- generated > 0, published 0 --> PF[publish_fail:<br/>exit 1 → alert]
    Q -- all green but zero qualified --> Z[all_zero:<br/>exit 0, still alarmed<br/>via dead-man's switch]
    Q -- normal --> OK[report + success ping]
```

**`all_zero` — самый интересный:** ничего не упало, все коды выхода
чистые — но платформа, чья целая ночь произвела ноль полезного выхода,
проваливает свою работу. Инфраструктурный мониторинг этого не видит;
видит только проверка исхода.

## Слой 3 — dead-man's switch

Доставка алертов сама умеет умирать (хост, сеть, месседжинг-креды — или
тот же облачный аккаунт, на котором прод). Поэтому финальный ярус
инвертирован: ночная джоба **пингует внешний сервис и на успехе, и на
провале**, а тревогу поднимает *отсутствие любого пинга* — из
инфраструктуры, намеренно независимой от собственного аккаунта платформы.
Kill-switch уровня провайдера, снёсший прод, не может снести то, что за
продом смотрит.

## Компромиссы

Полный пайплайн типизированных алертов (уровни severity, ключи дедупа,
rules-driven диспетчер, распределённый трейсинг) спроектирован и принят,
но запаркован — сегодня бежит Phase-0 пояс выше: три режима исхода,
error-сток и dead-man's switch. Страница изменится, когда доедет
остальное; до тех пор это честный инвентарь. Эндпоинта метрик-скрейпа
тоже пока нет — счётчики есть, дашбордов нет.

## Пощупать за две минуты

`GET /api/v1/errors?limit=5` показывает сток вживую; ночной отчёт (домен
`cycles`) несёт оценку исхода последнего прогона.
