'use client'; import Link from 'next/link'; import {EmptyStateWithBorder} from '@/components/layout/empty'; import {Button} from '@/components/ui/button'; import {Card, CardContent, CardDescription, CardHeader, CardTitle,} from '@/components/ui/card'; import {Table, TableBody, TableCell, TableHead, TableHeader, TableRow,} from '@/components/ui/table'; import type {DashboardNodeHealth} from '@/lib/services/openflare'; import {NodeStatusBadge} from '../../nodes/components/node-status-badge'; import { formatRelativeTime, getNodeStatusLabel, getNodeStatusTone, getOpenrestyStatusLabel, getOpenrestyStatusTone, isWSConnectedLastSeen, } from '../../nodes/components/node-utils'; import {formatCompactNumber, formatPercent} from './dashboard-utils'; export function NodeHealthTable({ nodes }: { nodes: DashboardNodeHealth[] }) { const sortedNodes = [...nodes].sort((left, right) => { if (right.active_event_count !== left.active_event_count) { return right.active_event_count - left.active_event_count; } const leftPressure = Math.max( left.cpu_usage_percent, left.memory_usage_percent, left.storage_usage_percent, ); const rightPressure = Math.max( right.cpu_usage_percent, right.memory_usage_percent, right.storage_usage_percent, ); return rightPressure - leftPressure; }); return (
节点健康列表 按异常数量和资源压力排序。
{sortedNodes.length === 0 ? ( ) : (
节点 状态 CPU / 内存 请求 / 错误 活动异常 最近心跳 操作 {sortedNodes.slice(0, 12).map((node) => (

{node.name}

{node.node_id}

{node.geo_name || '未配置地图点位'}

{formatPercent(node.cpu_usage_percent)} /{' '} {formatPercent(node.memory_usage_percent)} {formatCompactNumber(node.request_count)} /{' '} {formatCompactNumber(node.error_count)} 0 ? 'danger' : 'success'} /> {isWSConnectedLastSeen(node.last_seen_at) ? 'WS 已连接' : node.last_seen_at ? formatRelativeTime(node.last_seen_at) : '暂无'}
))}
)}
); }