import { useEffect, useState } from 'react'; import { adminApi } from '@/api/adminApi'; import { Button, DateRangeInput, Table, type TableColumn } from '@/components/ui'; import { formatDateTime } from '@/utils/dateTime'; type History = Awaited>; const columns: TableColumn[] = [ { key: 'name', title: '告警', width: '280px', render: (row) => row.name }, { key: 'severity', title: '级别', width: '90px', render: (row) => ({ critical: '严重', warning: '警告', info: '提示' })[row.severity] || row.severity, }, { key: 'instance', title: '服务 / 实例', width: '220px', render: (row) => row.service || row.instance || '主机资源' }, { key: 'startedAt', title: '触发时间', width: '180px', render: (row) => formatDateTime(row.startedAt) }, { key: 'lastObservedAt', title: '范围内最后采样', width: '180px', render: (row) => formatDateTime(row.lastObservedAt), }, ]; export function AlertHistory() { const [dates, setDates] = useState(() => { const key = (time: number) => new Date(time + 8 * 3600_000).toISOString().slice(0, 10); return { start: key(Date.now() - 6 * 86400_000), end: key(Date.now()) }; }); const [query, setQuery] = useState({ ...dates, page: 1, revision: 0 }); const [response, setResponse] = useState<{ query: typeof query; data: History | null; error: string }>(); const loading = response?.query !== query; const data = loading ? null : response?.data; const error = loading ? '' : response?.error; useEffect(() => { let current = true; adminApi .getInfrastructureAlertHistory(query.start, query.end, query.page) .then((result) => { if (current) setResponse({ query, data: result, error: '' }); }) .catch((reason) => { if (current) setResponse({ query, data: null, error: reason instanceof Error ? reason.message : '历史告警加载失败' }); }); return () => { current = false; }; }, [query]); return (
历史告警记录
setDates({ start: value.start || '', end: value.end || '' })} />

默认近7天,最多31天;读取 Prometheus 保留的真实触发周期(含等待触发),最后采样不代表准确恢复时间。保留期外或采集缺失的历史无法补齐。

{error ? (

{error}

) : null}
共 {data?.total ?? 0} 条 · 第 {data?.page ?? query.page} 页
); }