Skip to content

📊 Мониторинг (демон)

📌 Описание

Сбор метрик системы и приложений на ноде: CPU, RAM, диск, сеть, состояние Docker и systemd. Метрики доступны через CLI, API демона и стримятся на платформу для дашборда и алертов.

🎯 Сценарии использования

  • asc status — сводка по серверу и приложениям в терминале.
  • asc stats — потребление CPU, памяти, дискового пространства и I/O, а также сетевого I/O по приложениям (аналог docker stats --no-stream); asc stats --live держит таблицу живой, обновляя её на месте (аналог обычного docker stats); root видит приложения всех пользователей, сгруппированные по владельцам.
  • Дашборд платформы показывает графики нагрузки нод в реальном времени.
  • Алерт «приложение упало» → уведомление в Telegram (через платформу).
  • AI-ассистент отвечает на «что жрёт память?» данными мониторинга.

🏗️ Техническое решение

  • Системные метрики: CPU, память, диск (usage + I/O), сеть (rx/tx, ошибки, дропы) — напрямую из procfs (/proc/stat, /proc/meminfo, /proc/loadavg, /proc/net/dev, /proc/uptime) и statvfs(3) для дисков; без внешних крейтов. Дистрибутив-специфичного здесь нет; под macOS позже — отдельный сборщик за той же абстракцией.
  • Метрики приложений: per-container stats (Docker API), per-unit (systemd cgroups), per-process.
  • Сетевые интерфейсы: список интерфейсов (IP, MAC, статус, скорость, тип), статистика трафика; управление интерфейсами — пост-MVP.
  • Хранение: кольцевой буфер в памяти + короткая история в SQLite; долгая история — на стороне платформы.
  • Доставка: пуш-стрим в туннель nodeservice (интервал 5–15 с, адаптивный); healthcheck-события — мгновенно.
  • Health-статусы приложений: running / stopped / unhealthy / unknown — на основе healthcheck из asc.yaml.

🧩 Реализация (текущий инкремент)

  • Модуль src/daemon/monitor/: system.rs — парсеры procfs (чистые функции над &str, покрыты unit-тестами) и снятие снапшота; mod.rsMonitor: фоновый сэмплер в демоне, интервал и глубина истории задаются в config.toml ([monitor] interval_secs = 10, history_samples = 360 — час истории при 10 с).
  • CPU usage считается по дельте двух чтений /proc/stat; скорости сети (байт/с) — по дельте счётчиков между сэмплами.
  • API: MonitorService в proto (GetSystemMetrics, GetMetricsHistory) + REST-маршруты GET /v1/metrics и GET /v1/metrics/history?limit=N — оба транспорта поверх общего слоя, как и остальной API (DMN-005).
  • CLI: asc status показывает CPU (usage, load average), память и диски — метрики снимаются самим CLI без обращения к демону (автономность).
  • Per-app метрики: метод usage() в трейте AppDriver возвращает накопительные счётчики (CPU-время в микросекундах, resident-память в байтах, байты чтения/записи блочных устройств, байты rx/tx по сети — I/O-счётчики — Option, None, когда рантайм не может их отдать); источники по рантаймам — Docker Engine API (/containers/<id>/stats, one-shot: blkio_stats.io_service_bytes_recursive для дискового I/O, networks для сетевого — оба реальны, потому что у контейнера своя cgroup и своё сетевое пространство имён), cgroup v2 systemd-юнита (cpu.stat + memory.current + io.stat для дискового I/O; сетевой I/O всегда None — юнит делит сетевое пространство имён с хостом, читать там нечего), /proc/<pid>/stat + statm + io для процессов (дисковый I/O из read_bytes/write_bytes; сетевой I/O всегда None по той же причине, что и у systemd). CPU% считается по дельте двух сэмплов (~500 мс), как в docker stats, и может превышать 100% на многоядерных машинах.
  • CLI asc stats: таблица ID / KIND / CPU % / MEM / QUOTA / DISK / NET/s / DISK/s / NET I/O / DISK I/O по запущенным приложениям — QUOTA — компактный бар использования (как в asc app disk), если у приложения задана дисковая квота, иначе прочерк; DISK — полный размер каталога приложения в любом случае; NET/s и DISK/s — текущая скорость («rx/s / tx/s» и «read/s / write/s»), дельта тех же двух сэмплов, из которых считается CPU%; NET I/O и DISK I/O — «rx / tx» и «read / write», накопительные суммы байт с момента запуска приложения (как колонки NET I/O / BLOCK I/O в самом docker stats — не скорость); все четыре — прочерк, когда рантайм не может отдать пару (сеть доступна только для Docker-приложений, см. выше); сортировка --sort cpu|mem (по умолчанию cpu); у root — группировка по владельцам, как в asc app list. Остановленные приложения показываются с прочерками. --live перерисовывает ту же таблицу на месте (очистка экрана + перерисовка) каждые ~500 мс — ровно то время, которое и так уходит на один сэмпл из-за дельты CPU, лишний sleep не нужен — до Ctrl+C.
  • Следующие инкременты: per-app метрики в API (MonitorService), история в SQLite, healthcheck-статусы, пуш в туннель.

🔗 Связанные задачи

DMN-006, NODE-003, FE-004 в ROADMAP.md.

Распространяется по лицензии MIT.