feat: v0.34 健康探针(Architecture B) + Agent v2.1 + 端口监控 + 告警联系人重构

- v0.31: AlertContact 重构(channel_type下拉+webhook_url替代三分立字段)
- v0.32: Agent ProcessTop 增强(cmdline/user/cpu_pct/mem_pct)
- v0.33: 端口监控 Tab(监听端口自动发现+down联动告警)
- v0.34: 健康探针(Agent本地执行HTTP/TCP/Exec→结果随心跳上报)
- Agent新增: ContextSwitch/FD/HealthProbe采集器
- 后端新增: health_probe handler + Agent model扩展
- HostMonitor新增Tab: 健康探针/端口监控
This commit is contained in:
attacker committed 2026-06-24 19:18:10 +08:00
1 parent e1f75f0bc4
commit d656520428
25 files changed
+1700 -619

No files matched your search

@@ -18,9 +18,9 @@ import { useConfirm } from '@/components/ui/confirm-dialog';
import { alertCenterApi, agentApi, alertApi } from '@/services/api';
import {
type Alert, type AlertRule, mapAlert, getSeverityBadge, getStatusBadge,
getChannelTypeLabel,
} from './alert-center-helpers';
import { AlertDetailDialog, AlertSilenceDialog } from './AlertCenterDetail';
import { AlertChannelsTab } from './AlertChannelsTab';
import { AlertRuleDialog } from '@/components/monitor/AlertRuleDialog';
import { ContactDialog } from './ContactDialog';
import { ContactGroupDialog } from './ContactGroupDialog';
@@ -265,7 +265,7 @@ const AlertCenter: React.FC = () => {
<TabsList className="grid w-full grid-cols-4 lg:w-[480px] h-9">
<TabsTrigger value="alerts" className="text-xs">告警列表</TabsTrigger>
<TabsTrigger value="rules" className="text-xs">告警规则</TabsTrigger>
<TabsTrigger value="contacts" className="text-xs">通知管理</TabsTrigger>
<TabsTrigger value="contacts" className="text-xs">报警联系人</TabsTrigger>
<TabsTrigger value="groups" className="text-xs">报警联系组</TabsTrigger>
</TabsList>
@@ -501,11 +501,9 @@ const AlertCenter: React.FC = () => {
)}
</TabsContent>
{/* 通知管理 Tab — 渠道 + 联系人合并 */}
{/* 报警联系人 Tab */}
<TabsContent value="contacts" className="space-y-4">
<AlertChannelsTab refreshKey={0} />
<div className="border-t border-border pt-4 mt-1">
<div className="flex justify-between items-center mb-3">
<div className="flex justify-between items-center">
<h3 className="text-sm font-medium">报警联系人</h3>
<Button size="sm" onClick={() => { setEditingContact(null); setContactDialogOpen(true); }}>
<Plus className="w-4 h-4 mr-1" />
@@ -529,9 +527,16 @@ const AlertCenter: React.FC = () => {
{c.phone && <div>📱 {c.phone}</div>}
{c.email && <div>📧 {c.email}</div>}
<div className="flex gap-1 flex-wrap">
{c.dingtalk && <Badge variant="outline" className="text-[10px]">钉钉</Badge>}
{c.feishu && <Badge variant="outline" className="text-[10px]">飞书</Badge>}
{c.wechat && <Badge variant="outline" className="text-[10px]">企微</Badge>}
{c.channel_type && (
<Badge variant="outline" className="text-[10px]">
{getChannelTypeLabel(c.channel_type)}
</Badge>
)}
{c.webhook_url && (
<span className="text-[10px] text-muted-foreground truncate max-w-[200px]" title={c.webhook_url}>
{c.webhook_url}
</span>
)}
</div>
<div className="flex gap-1.5 pt-1.5">
<Button variant="outline" size="sm" className="h-7 text-xs flex-1"
@@ -553,7 +558,6 @@ const AlertCenter: React.FC = () => {
))}
</div>
)}
</div>
</TabsContent>
{/* 报警联系组 Tab */}