UI/документация: крошки, метрики узлов в stats, правки навигации и подвала

- Документация: хлебные крошки; секции H2 в одной карточке; заголовок вкладки от H1
- Навигация: активна только текущая пилюля (Панель без постоянного home-стиля)
- GET /api/v1/stats: cluster_resources (docker stats CPU/RAM/I/O по узлам kind)
- Панель: блок ресурсов в карточке статистики; убраны строки подвала про api_routes/clusters
- Удалён app/docs/README.md; крошки app/docs → api_routes.md; README корня обновлён
This commit is contained in:
Sergey Antropoff
2026-04-04 06:37:36 +03:00
parent 710b360e4a
commit 6d4bc65c8a
12 changed files with 495 additions and 62 deletions
+28
View File
@@ -58,6 +58,26 @@ class ClusterSummary(BaseModel):
meta: dict[str, Any] = Field(default_factory=dict)
class KindNodeResourceStat(BaseModel):
"""Одна нода kind (контейнер): снимок ``docker stats`` / ``podman stats``."""
container_name: str
cpu_percent: str | None = Field(default=None, description="Доля CPU, напр. 1.23%")
memory_usage: str | None = Field(default=None, description="Использование / лимит, напр. 120MiB / 7.7GiB")
memory_percent: str | None = Field(default=None, description="Процент памяти от лимита контейнера")
net_io: str | None = Field(default=None, description="Сетевой I/O (накопительно за жизнь контейнера)")
block_io: str | None = Field(default=None, description="Блочный I/O")
pids: int | None = Field(default=None, description="Число процессов в контейнере")
class KindClusterResources(BaseModel):
"""Ресурсы узлов одного кластера kind (только запущенные контейнеры)."""
cluster_name: str
nodes: list[KindNodeResourceStat] = Field(default_factory=list)
note: str | None = Field(default=None, description="Пояснение, если узлов нет или ошибка списка")
class StatsResponse(BaseModel):
"""Краткая статистика для дашборда."""
@@ -66,6 +86,14 @@ class StatsResponse(BaseModel):
total_workers_from_meta: int | None
jobs_total: int
jobs_recent_failed: int
cluster_resources: list[KindClusterResources] = Field(
default_factory=list,
description="CPU/RAM/I/O узлов kind по данным container CLI",
)
cluster_resources_error: str | None = Field(
default=None,
description="Глобальная ошибка сбора метрик (например CLI не найден)",
)
class ClusterWorkloadsResponse(BaseModel):