feat(web): дашборд инстанса в настройках с живыми метриками
Вкладка «Инстанс» сверху показывает нагрузку сервера, ниже — диск и базу, внизу healthcheck с пингом (AGENT.md 7.19). - `Gauge` — полукруглый индикатор: заполняется по значению, меняет цвет на порогах 70 % и 90 %, доступен как `role="meter"`; - процессор и память обновляются раз в секунду (`useInstanceMetrics`), для простоя вкладки опрос останавливается; - два блока диска: «занято / всего» и вес базы (файл + WAL); видимых подписей нет — они раскрываются в тултипе при наведении на значение; - healthcheck: состояние каждой проверки, общий статус, техническая деталь и живой пинг — время ответа инстанса на запрос дашборда в миллисекундах; - переводы ru/en, тесты на индикаторы, формат «занято / всего», тултипы, healthcheck и отсутствие раздела у обычного пользователя.
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
import { request } from './client';
|
||||
|
||||
/** Живые метрики инстанса для дашборда в настройках (AGENT.md 7.19). */
|
||||
export interface InstanceMetrics {
|
||||
cpu: {
|
||||
/** Загрузка в процентах от доступного времени (лимит контейнера или ядра). */
|
||||
percent: number;
|
||||
cores: number;
|
||||
source: 'cgroup' | 'host' | '';
|
||||
};
|
||||
memory: {
|
||||
used_bytes: number;
|
||||
total_bytes: number;
|
||||
percent: number;
|
||||
source: 'cgroup' | 'host' | '';
|
||||
};
|
||||
disk: {
|
||||
used_bytes: number;
|
||||
total_bytes: number;
|
||||
free_bytes: number;
|
||||
};
|
||||
database: {
|
||||
bytes: number;
|
||||
wal_bytes: number;
|
||||
};
|
||||
checks: InstanceCheck[];
|
||||
health: 'ok' | 'warn' | 'failed';
|
||||
uptime_seconds: number;
|
||||
version: string;
|
||||
commit: string;
|
||||
collected_at: string;
|
||||
}
|
||||
|
||||
export interface InstanceCheck {
|
||||
name: string;
|
||||
status: 'ok' | 'warn' | 'failed' | 'off';
|
||||
message?: string;
|
||||
}
|
||||
|
||||
export const metricsQueryKey = ['instance', 'metrics'] as const;
|
||||
|
||||
export async function fetchInstanceMetrics(signal?: AbortSignal): Promise<InstanceMetrics> {
|
||||
const payload = await request<{ metrics: InstanceMetrics }>(
|
||||
'/instance/metrics',
|
||||
signal === undefined ? {} : { signal },
|
||||
);
|
||||
return payload.metrics;
|
||||
}
|
||||
Reference in New Issue
Block a user