v1.7.3 — AI 综合诊断 Overhaul + Auto-Collect 代理
AI 综合诊断焕然一新。新增 DOCX/Markdown/PDF 3 种导出格式、定时报告(每周/双周/每月),以及自动采集数据的 6 种 Auto-Collect 代理。EKS 页面也得到大幅改进,包括集群访问管理、Describe 面板、Service Resources 标签页等。
AI 综合诊断焕新 · DOCX/MD/PDF 导出 · 定时报告 · 6 种 Auto-Collect 代理 · FinOps MCP 5 个工具 · EKS 集群访问管理 · Powerpipe exit code 2 处理
AI 综合诊断焕新
原 /diagnosis 路径变更为 /ai-diagnosis,整体 UI 焕然一新。
Before / After
| 项目 | Before (v1.7.2) | After (v1.7.3) |
|---|---|---|
| 路径 | /diagnosis | /ai-diagnosis |
| 名称 | 综合诊断 | AI 综合诊断 |
| 导出 | PPTX | DOCX + Markdown + PDF |
| 定时报告 | — | 每周/双周/每月 |
| S3 上传 | — | DOCX + MD 自动上传 |
3 种导出格式
DOCX — 基于 docx 包的 A4 专业报告:
- 封面(标题、健康评分、账户别名、日期)
- 目录(超链接、Heading 1-3)
- 各部分强调色(成本=绿色、安全=红色、网络/EKS=紫色、闲置/MSK=橙色)
- Markdown 解析(标题、表格、列表、引用、行内代码/粗体/斜体)
Markdown — 将所有部分合并为单个 .md 文件导出。
PDF — /ai-diagnosis/report 专用打印页面:
- 白色背景 A4 布局,CSS
@media print分页 - 通过「打印 / 保存为 PDF」按钮使用浏览器 Print-to-PDF
// src/lib/report-docx.ts (主要结构)
const doc = new Document({
sections: [
coverPage(title, healthScore, accountAlias, date),
tableOfContents(),
...sections.map(s => sectionPage(s, accentColor)),
],
});
const buffer = await Packer.toBuffer(doc);
定时报告
| 项目 | 说明 |
|---|---|
| 频率 | 每周 / 双周 / 每月 |
| 时区 | KST (UTC+9) |
| 设置 | 星期(0-6)、日期(1-28)、小时(0-23) |
| 存储 | data/report-schedule.json |
| 检查周期 | 每 5 分钟检查一次调度 |
// src/lib/report-scheduler.ts
type Schedule = {
enabled: boolean;
frequency: 'weekly' | 'biweekly' | 'monthly';
dayOfWeek?: number; // 0=周日 ~ 6=周六
dayOfMonth?: number; // 1~28
hour: number; // 以 KST 为准
language: 'ko' | 'en';
};
在 UI 中切换 ON/OFF、设置频率/星期/时间/语言后,报告会自动生成并上传到 S3。
DOCX 和 Markdown 文件会自动上传到 awsops-deploy-{accountId}/reports/ 路径。可以通过 7 天有效的 Presigned URL 下载。CDK 栈会自动添加 S3 PutObject/GetObject 权限。
6 种 Auto-Collect 代理
用于自动化 AI 综合诊断报告数据采集的专用代理。每个代理从多个来源并行采集数据,并实时流式传输采集状态。
| 代理 | 来源 | 采集项目 |
|---|---|---|
| EKS Optimize | Prometheus + K8s + Steampipe | CPU/内存使用率、节流、Pod 重启、HTTP 5xx、节点利用率 |
| DB Optimize | Steampipe + CloudWatch | RDS/ElastiCache/OpenSearch 实例发现 + 基于指标的合理调整 |
| MSK Optimize | Steampipe + CloudWatch + Prometheus | Broker 指标、消息吞吐量、消费者滞后、分区数 |
| Idle Scan | Steampipe | 未挂载 EBS、gp2 卷、未使用 EIP、已停止 EC2、90 天以上快照、未使用 SG + 成本估算 |
| Trace Analyze | Tempo/Jaeger + Prometheus | 各服务的错误追踪、超过 500ms 的慢追踪 |
| Incident | CloudWatch + K8s + Prometheus | ALARM 状态告警、Warning 事件、HTTP 5xx 激增、CPU 尖峰、内存压力 |
// src/lib/collectors/types.ts
export interface Collector {
collect(send: SendFn, accountId?: string, isEn?: boolean): Promise<CollectorResult>;
formatContext(data: CollectorResult): string;
analysisPrompt: string;
displayName: string;
}
所有代理都实现相同的 Collector 接口。collect() 通过 Promise.allSettled 并行采集多个来源,并通过 SendFn 回调实时传递进度。添加新代理时只需实现这个接口即可。
FinOps MCP Lambda
Cost Gateway 新增了 5 个 FinOps 工具。
| 工具 | 来源 | 说明 |
|---|---|---|
get_rightsizing_recommendations | Compute Optimizer | EC2/RDS/ECS/Lambda 合理调整 + 每月节省额 |
get_savings_plans_recommendations | Cost Explorer | Savings Plans 购买建议(1 年/3 年,No Upfront) |
get_reserved_instance_recommendations | Cost Explorer | RI 购买建议(EC2/RDS/ElastiCache/Redshift) |
get_cost_optimization_hub_recommendations | Cost Optimization Hub | 综合优化建议(Rightsize/Stop/Upgrade/SP) |
get_trusted_advisor_cost_checks | Trusted Advisor | 成本优化类别检查 + 被标记的资源 |
所有工具都支持通过 target_account_id 参数进行跨账户查询。
EKS/K8s UX 大幅改进
集群访问管理
| 功能 | 说明 |
|---|---|
| 访问状态徽章 | 按集群显示是否已注册 "Access Entry" |
| 一键注册 | 通过 "Register ViewPolicy" 按钮自动创建 Access Entry + Policy |
| 连接检测 | 根据 K8s 查询结果中是否存在 context_name 判断实际连接状态 |
| CLI 指南 | 为未连接的集群提供基于 EC2 Role ARN 的注册命令指南 |
新功能
| 功能 | 文件 | 说明 |
|---|---|---|
| Describe 面板 | K9sDetailPanel | JSONB 详细信息(labels、annotations、containers、volumes、conditions) |
| Service Resources 标签页 | k8s.ts | 各服务的 CPU/Memory 条形图(Pod 选择器关联) |
| 集群过滤 | k8s/page.tsx | 点击集群卡片过滤节点/Pod/事件/服务 |
| StatsCard 导航 | StatsCard.tsx | 点击跳转,如 Nodes→/k8s/nodes、Pods→/k8s/pods |
| SQL 整合 | queries/k8s.ts | 将内联 SQL 移至中央查询文件 + 新增缓存预热器 |
Bug 修复
- 修正
external_ip→external_ips列名(服务 0/0 的 bug) - 修复 EC2 IAM Role ARN 截断问题(SQL
||运算符与过滤冲突) - 防止点击 Register 时触发集群过滤切换(
stopPropagation) - 注册后通过轮询确认连接(5 次 × 3 秒)
Benchmark:Powerpipe Exit Code 2 处理
当基准测试控制项存在告警时,Powerpipe 会以 exit code 2 退出。这是正常行为,但原有代码将其视为异常退出。
| 项目 | Before | After |
|---|---|---|
| 判断标准 | exit code === 0 | 输出文件存在 + 大小 > 0 |
| exit code 2 | 按错误处理 | 按正常处理 |
# 忽略 exit code,以输出文件的有效性来判断
powerpipe benchmark run ... > "${tmpFile}" 2>"${errorFile}"; \
if [ -s "${tmpFile}" ]; then
mv "${tmpFile}" "${resultFile}" && echo "done" > "${statusFile}";
else
echo "error" > "${statusFile}";
fi
基础设施:S3 报告上传 + update-infra 脚本
S3 策略
CDK 栈中新增了 EC2 角色的 S3 权限:
// infra-cdk/lib/awsops-stack.ts
ec2Role.addToPolicy(new iam.PolicyStatement({
actions: ['s3:PutObject', 's3:GetObject'],
resources: [`arn:aws:s3:::awsops-deploy-${this.account}/reports/*`],
}));
update-infra 脚本
无需替换 EC2 即可安全更新 CDK 栈的 00-update-infra.sh 脚本:
- 读取现有栈参数 — 从 CloudFormation 保留当前值
- 恢复 CDK 上下文 — 从在线基础设施重新提取 VPC、TGW、域名等
- cdk diff 预览 — 警告是否会替换 EC2
- 部署 — 使用
--no-rollback安全部署
版本对比
| 项目 | v1.7.2 | v1.7.3 | 变更 |
|---|---|---|---|
| 诊断路径 | /diagnosis | /ai-diagnosis | 名称变更 |
| 导出 | PPTX | DOCX + MD + PDF | 3 种 |
| 定时报告 | — | 每周/双周/每月 | 新增 |
| Auto-Collect | — | 6 种代理 | 新增 |
| FinOps 工具 | — | 5 个 MCP 工具 | 新增 |
| EKS 访问 | 手动 | 一键注册 | 改进 |
| Benchmark | 依赖 exit code | 验证输出文件 | 修复 |
主要文件变更
| 文件 | 变更内容 |
|---|---|
src/app/ai-diagnosis/page.tsx | 诊断页面焕新(路径变更、定时 UI) |
src/app/ai-diagnosis/report/page.tsx | PDF 打印专用页面 |
src/app/api/report/route.ts | 报告生成 API(15 个部分,S3 上传) |
src/lib/report-docx.ts | DOCX 生成器(封面、目录、各部分样式) |
src/lib/report-scheduler.ts | 定时报告调度器(每 5 分钟检查) |
src/lib/report-prompts.ts | 15 个部分的 Bedrock 分析提示词 |
src/lib/report-generator.ts | 数据采集编排器 |
src/lib/collectors/*.ts | 6 种 Auto-Collect 代理 |
agent/lambda/aws_finops_mcp.py | FinOps MCP Lambda(5 个工具) |
src/app/api/benchmark/route.ts | Powerpipe exit code 2 处理 |
src/lib/queries/k8s.ts | K8s SQL 查询整合 + Service Resources |
src/components/dashboard/StatsCard.tsx | 点击导航(href prop) |
infra-cdk/lib/awsops-stack.ts | 新增 S3 reports/* 策略 |
scripts/00-update-infra.sh | 安全的基础设施更新脚本 |