feat(platform): add alert policy runbook copy

This commit is contained in:
lingniu
2026-07-04 15:56:48 +08:00
parent fd93ce8d97
commit 7d6d1afbf2
2 changed files with 38 additions and 1 deletions

View File

@@ -449,6 +449,26 @@ function normalizePriorityIssues(rows?: QualityPriorityIssue[]): PriorityIssueRo
return rows;
}
function notificationPolicyRunbookText(policies: QualityNotificationPolicy[], rules: AlertRuleRow[]) {
const activeRules = rules.filter((row) => row.count > 0);
const lines = policies.map((policy, index) => [
`${index + 1}. ${policy.name} / ${policy.target}`,
` 触发:${policy.condition}`,
` 渠道:${policy.channel}`,
` 升级:${formatEscalationMinutes(policy.escalationMinutes) || '-'}`,
` 验收:${policy.acceptanceCriteria || '-'}`
].join('\n'));
return [
'【告警通知策略Runbook】',
`活跃规则:${activeRules.length.toLocaleString()}`,
`P0规则${activeRules.filter((row) => row.level === 'P0').length.toLocaleString()}`,
'',
...lines,
'',
`告警筛选:${qualityShareURL()}`
].join('\n');
}
async function copyText(value: string, label: string) {
const text = value.trim();
if (!text) {
@@ -629,6 +649,9 @@ export function Quality({
}
copyText(priorityIssueDigestText(priorityRows, notificationPlan?.summary ?? summary, health?.runtime?.platformRelease, policies), '优先队列通知汇总');
};
const copyPolicyRunbook = () => {
copyText(notificationPolicyRunbookText(policies, rules), '通知策略Runbook');
};
return (
<div className="vp-page">
@@ -783,7 +806,10 @@ export function Quality({
]}
/>
</Card>
<Card bordered title="通知策略">
<Card
bordered
title={<Space><span></span><Button size="small" onClick={copyPolicyRunbook}>Runbook</Button></Space>}
>
<div className="vp-notification-policy-list">
{policies.map((item) => (
<div key={item.name} className="vp-notification-policy">