📊 Мониторинг (демон)
📌 Описание
Сбор метрик системы и приложений на ноде: 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.rs—Monitor: фоновый сэмплер в демоне, интервал и глубина истории задаются в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.