chore(agents): задание Antigravity по метрикам узлов в консоли
Windows-клиент показывает CPU, память, диск, задержку и здоровье по каждому серверу, веб-консоль не показывает ничего из этого. Данные при этом уже лежат на Hub: таблица metric_samples наполняется из heartbeat и чистится по MetricRetentionHours, но в группе /api/v1/control нет ни одного маршрута для их чтения. Границей задания зафиксировано то, что переносить нельзя: SSH-терминал и приватные ключи остаются на Windows-машине, это заявленное свойство продукта, а не объём работы. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
3960d30ee6
commit
7fac6d5d22
1 changed files with 110 additions and 0 deletions
110
agents/antigravity/inbox/2026-08-20-console-node-metrics.md
Normal file
110
agents/antigravity/inbox/2026-08-20-console-node-metrics.md
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
# Метрики и короткая история узлов в веб-консоли
|
||||
|
||||
- **Кому:** `antigravity`
|
||||
- **Дата:** 2026-08-20
|
||||
- **От кого:** главный агент (`claude`), по задаче владельца «консоль надо
|
||||
сделать так же, как и Windows-программа»
|
||||
- **Ветка:** `antigravity/console-node-metrics`
|
||||
- **Файл отчёта:** `../done/2026-08-20-console-node-metrics.md`
|
||||
|
||||
## Зачем
|
||||
|
||||
Windows-клиент на странице «Серверы» показывает по каждому серверу CPU,
|
||||
память, диск, задержку, состояние здоровья и статус
|
||||
(`Pages/ServersPage.xaml`: `CpuText`, `MemoryText`, `DiskText`,
|
||||
`LatencyText`, `HealthText`, `Status`). Веб-консоль не показывает ничего из
|
||||
этого: в ней есть только имя узла, состояние, версия агента, время
|
||||
heartbeat и остаток срока сертификата.
|
||||
|
||||
Это первая из нескольких задач по сближению консоли с Windows-клиентом.
|
||||
Здесь закрывается ровно метрики и короткая история — остальное перечислено
|
||||
ниже и в эту задачу не входит.
|
||||
|
||||
## Установленный факт, от которого отталкиваемся
|
||||
|
||||
Данные **уже есть на Hub**, показывать нечем.
|
||||
|
||||
`ControlStore` содержит таблицу (`ControlStore.cs:81`):
|
||||
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS metric_samples (
|
||||
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
node_id TEXT NOT NULL REFERENCES agents(node_id) ON DELETE CASCADE,
|
||||
recorded_at TEXT NOT NULL,
|
||||
payload_json TEXT NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS ix_metric_samples_node_time
|
||||
ON metric_samples(node_id, recorded_at DESC);
|
||||
```
|
||||
|
||||
Наполняется она из heartbeat агента, чистится по `MetricRetentionHours`
|
||||
(по умолчанию 168 часов). При этом в группе `/api/v1/control` **нет ни
|
||||
одного маршрута для метрик** — я перечитал все `control.Map*` в
|
||||
`Program.cs`. То есть оператор физически не может их получить.
|
||||
|
||||
## Что нужно сделать
|
||||
|
||||
1. **Добавить в Control чтение метрик под ролью Operator.** Как минимум
|
||||
последний срез по каждому узлу и история по одному узлу за period.
|
||||
Форму запроса, имена полей и ограничение на объём выбираешь сам и
|
||||
обосновываешь в отчёте. Обязательные требования: маршрут в группе
|
||||
`control` (то есть `RequireAuthorization("Operator")`), ограничение
|
||||
количества возвращаемых точек, и никакого доступа к чужим данным по
|
||||
роли Agent или Automation.
|
||||
2. **Показать это в консоли** в разделе узлов: текущие CPU, память, диск и
|
||||
задержка рядом с узлом, плюс короткая история — так же, как её
|
||||
показывает Windows-клиент.
|
||||
3. **`payload_json` — данные из внешнего источника.** Он приходит от
|
||||
агента. Разбирать его в консоли только через уже имеющийся
|
||||
`escapeHtml`, как это сделано с payload событий; ни одной вставки в
|
||||
`innerHTML` без экранирования. Отсутствующие или битые поля не должны
|
||||
ронять таблицу узлов.
|
||||
|
||||
## Границы — что переносить нельзя
|
||||
|
||||
**SSH-терминал и приватные ключи в веб-консоль не переносятся.** Это не
|
||||
вопрос трудоёмкости, а заявленное свойство продукта: README обещает
|
||||
«opens direct SSH terminals without sending a private terminal key to the
|
||||
Hub», а ключ мониторинга и сертификат оператора защищены DPAPI и лежат
|
||||
только на Windows-машине. Страница Sessions остаётся у Windows-клиента.
|
||||
|
||||
Также не входит в эту задачу и делается отдельно: страница Settings,
|
||||
группы и теги серверов, alert rules и журнал уведомлений (последние два
|
||||
пункта в `docs/roadmap.md` числятся невыполненными и для Windows-клиента).
|
||||
|
||||
Не трогать: `deploy/**`, релизные workflow, Desktop, схему существующих
|
||||
таблиц (добавление индексов допустимо и обосновывается).
|
||||
|
||||
## Как проверить результат
|
||||
|
||||
- новый маршрут закрыт ролью: запрос без токена → 401, под ролью Agent и
|
||||
Automation → 403, под Operator → 200. Три теста, вывод в отчёт;
|
||||
- ограничение объёма истории проверено тестом: запрос заведомо большего
|
||||
количества точек возвращает не больше предела;
|
||||
- битый или неполный `payload_json` не роняет ни маршрут, ни отрисовку —
|
||||
тест на каждую сторону;
|
||||
- `dotnet test` целиком зелёный, с выводом;
|
||||
- прогоны CI на PR — ссылками.
|
||||
|
||||
## Связь с другими заданиями
|
||||
|
||||
Эта задача пересекается с двумя уже выданными и делать её нужно **после**
|
||||
них, иначе правки лягут друг на друга в одном файле:
|
||||
|
||||
- `2026-08-19-console-behaviour-tests.md` — поведенческие тесты консоли.
|
||||
Новая функциональность обязана прийти с такими тестами сразу, а не
|
||||
проверками строк в HTML;
|
||||
- `2026-08-19-console-events-throttle.md` — троттлинг обновления дашборда.
|
||||
Метрики увеличат объём каждого обновления, поэтому без троттлинга
|
||||
усиление нагрузки станет заметнее.
|
||||
|
||||
Если считаешь, что порядок должен быть другим, — скажи в отчёте и обоснуй,
|
||||
это решение приму.
|
||||
|
||||
## Контекст и ограничения
|
||||
|
||||
Проверено чтением кода и запуском Control локально на пустой базе: узлов
|
||||
ноль, метрик ноль. Как выглядят настоящие `payload_json` от живого агента,
|
||||
я не видел — на живом Hub не проверял. Прежде чем фиксировать контракт
|
||||
ответа, посмотри фактическую форму payload в коде агента, а не в моём
|
||||
описании.
|
||||
Loading…
Reference in a new issue