Files
glchat/web/src/api/metrics.ts
T
grendervill e1107600ec feat(web): дашборд инстанса в настройках с живыми метриками
Вкладка «Инстанс» сверху показывает нагрузку сервера, ниже — диск и базу, внизу
healthcheck с пингом (AGENT.md 7.19).

- `Gauge` — полукруглый индикатор: заполняется по значению, меняет цвет на
  порогах 70 % и 90 %, доступен как `role="meter"`;
- процессор и память обновляются раз в секунду (`useInstanceMetrics`), для
  простоя вкладки опрос останавливается;
- два блока диска: «занято / всего» и вес базы (файл + WAL); видимых подписей
  нет — они раскрываются в тултипе при наведении на значение;
- healthcheck: состояние каждой проверки, общий статус, техническая деталь и
  живой пинг — время ответа инстанса на запрос дашборда в миллисекундах;
- переводы ru/en, тесты на индикаторы, формат «занято / всего», тултипы,
  healthcheck и отсутствие раздела у обычного пользователя.
2026-09-20 21:26:25 +03:00

49 lines
1.3 KiB
TypeScript

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;
}