Перейти к содержанию

Архитектура

DumbMonit поставляется в одном контейнере. Внутри работает один процесс на Rust, который обслуживает веб-интерфейс и API, а также дочерний процесс (VictoriaMetrics), который процесс Rust запускает и контролирует. Конфигурация и состояние хранятся в SQLite.

Компоненты

Компонент Где Роль
Сервер crates/server Единый бинарный файл на Rust: HTTP API (axum), аутентификация, планировщик, движок оповещений, каналы уведомлений, отчёты.
Веб-интерфейс web/ Одностраничное приложение SvelteKit (Svelte 5, Tailwind 4, uPlot). Собирается в статические файлы и встраивается в бинарный файл сервера с помощью rust_embed.
Временные ряды crates/server/src/tsdb/ Пакетный писатель и прокси запросов для VictoriaMetrics. embedded.rs запускает и контролирует встроенный дочерний процесс VictoriaMetrics (данные в /data/vm); DUMBMONIT_VM_URL вместо этого указывает на внешний экземпляр.
Конфигурация и состояние crates/server/src/db/ SQLite с нумерованными миграциями: мониторы, учётные данные, пользователи, правила, состояние оповещений, периоды молчания, каналы.
Сборщики crates/collectors, crates/server/src/collectors/ Одна реализация трейта Collector на каждый вид монитора или сервиса, зарегистрированная в Registry. Планировщик знает только трейт.
Общие типы crates/proto Sample, Target, Credential, трейт Collector и ProbeError, а также протокол агента.
Агент crates/agent Агент для Linux, macOS, FreeBSD и Windows, передающий метрики хоста; он также может работать как ретранслятор, запускающий сборщики для удалённой площадки.
Оповещения crates/server/src/alerting/ Правила, конечный автомат оповещений, подавление по родительскому монитору, периоды молчания, обучаемые базовые линии.
Уведомления crates/server/src/notify/ Каналы (чат, push, дежурства, e-mail, вебхуки), описываемые для интерфейса в catalog.rs.
Секреты crates/server/src/crypto.rs AES-256-GCM для учётных данных и токенов, хранящихся в SQLite; ключ берётся из /data/secret.key или DUMBMONIT_SECRET.

Поток данных

 devices / services ──(SNMP, HTTP APIs, probes)──► collectors ┐
                                                              │ samples
 agents ──(push, per-machine token)──► /api/ingest ───────────┤
 relay agent (collectors run at a remote site) ───────────────┤
                                                              ▼
                                           tsdb writer (batched) ──► VictoriaMetrics
                                                                           │
 browser / scripts / assistants ◄─ /api/* ◄─ query proxy ◄─────────────────┘
                                   │
                                   └─► alerting engine ──► notify channels

 SQLite (config, users, alert state, silences) is read and written by the
 API, the scheduler and the alerting engine.
  1. Планировщик запускает каждый включённый монитор с его интервалом через реестр сборщиков. Агенты и ретрансляторы отправляют свои измерения в /api/ingest с токеном конкретной машины.
  2. Сборщики возвращают выборки с именами dumbmonit_<kind>_* и меткой target (идентификатор монитора). Писатель отправляет их в VictoriaMetrics пакетами.
  3. Движок оповещений проверяет правила по сохранённым рядам. phase — это состояние движка; effective_phase — то, что видят пользователи (suppressed, если родительский монитор недоступен). Недоступный монитор вызывает оповещение; ошибка конфигурации отображается, но уведомление не отправляется.
  4. Уведомления уходят через каналы, настроенные в политике уведомлений.
  5. Интерфейс и любые скрипты читают всё через /api/*; закрытой половины API не существует.

Точки расширения

  • Новый вид монитора — это реализация Collector плюс один вызов Registry::register. Формы в интерфейсе генерируются из GET /api/collectors.
  • Новый канал уведомлений — это отправитель плюс запись в notify/catalog.rs; интерфейс строит форму по GET /api/notify/kinds.
  • Монитору SNMP, которому нужен только профиль, Rust не требуется: достаточно файла YAML в profiles/.

Инструкции по сборке см. в разделе Разработка, а границы доверия — в модели безопасности.