一个供应商中立的启动工具包,用于部署一次性 Kubernetes 测试环境、注入故障、从任意产品保存调查记录,并用可配置的评判器对已完成的调查打分。Python 3.10+ 是唯一的 Python 依赖。Kubernetes 操作还需要kubectl;本地集群创建需要 Docker 和kind。
为你的集群选择本地 kind 或 AWS EKS,然后选择 21 场景完整套件或六场景冒烟测试环境。集群类型和场景套件是相互独立的选择。
工作原理
flowchart LR
A[Deploy cluster and application] --> B[Connect your product]
B --> C[Inject and verify a fault]
C --> D[Let your product investigate]
D --> E[Save investigation records]
E --> F[Score with your chosen judge]
F --> G[Compare results]
从 Project Arena 目录运行命令。集群搭建、产品集成、场景执行和评分是相互独立的步骤;请按顺序遵循以下各节。
基准测试结果
我们比较了Edge Delta 的原生 AI 调查、Grafana 的原生 AI 调查,以及使用各平台可观测性 CLI 的 Claude,覆盖 21 个 Kubernetes 事故场景。edx提供对 Edge Delta 的访问;gcx提供对 Grafana 的访问。所有最终调查均使用 GPT-6-Astra 针对相同的事故事实和评分标准进行评估。
检测与调查结果
Edge Delta 检测并调查了 18 个场景;Grafana 检测并调查了 12 个。Claude 在每个平台上针对全部 21 个场景均从外部启动:16 个告警和 5 个客户报告使用 edx,以及12 个告警和 9 个客户报告使用 gcx。Claude 的检测未被独立测量,因此这些单元格显示为—。
调查评分使用该列中所有已完成的调查。实施就绪度排除没有缓解提案的案例。
| 指标 | Edge Delta 原生 | Grafana 原生 | Claude + edx | Claude + gcx |
|---|---|---|---|---|
| 检测 | 18/21(85.7%) | 12/21(57.1%) | — | — |
| 根因分析 | 15/18(83.3%) | 9/12(75.0%) | 18/21(85.7%) | 19/21(90.5%) |
| 影响范围 | 12/18(66.7%) | 8/12(66.7%) | 18/21(85.7%) | 18/21(85.7%) |
| 支持的最终缓解措施 | 8/18(44.4%) | 5/12(41.7%) | 16/21(76.2%) | 15/21(71.4%) |
| 实施就绪度 | 9/16(56.2%) | 5/12(41.7%) | 16/21(76.2%) | 15/21(71.4%) |
在相同的 12 个事故上的比较
本表使用两个原生产品都调查过的 12 种事件类型,并对应 Claude 的调查结果。它控制的是纳入哪些场景,而不是启动提示词、时机或可用证据的差异。
| 指标 | Edge Delta 原生 | Grafana 原生 | Claude + edx | Claude + gcx |
|---|---|---|---|---|
| 根因分析 | 11/12(91.7%) | 9/12(75.0%) | 10/12(83.3%) | 10/12(83.3%) |
| 影响范围 | 9/12(75.0%) | 8/12(66.7%) | 10/12(83.3%) | 10/12(83.3%) |
| 有支持的最终缓解措施 | 7/12(58.3%) | 5/12(41.7%) | 8/12(66.7%) | 8/12(66.7%) |
| 实施就绪度 | 8/12(66.7%) | 5/12(41.7%) | 8/12(66.7%) | 8/12(66.7%) |
指标含义
| 指标 | 得分条件 |
|---|---|
| 检测 | 产品在观察窗口内检测到事件并发起调查。 |
| 根因分析 | 最终报告正确解释了事件的原因。 |
| 影响范围 | 最终报告正确识别了受影响的工作负载和下游影响,且未声称存在无依据的故障。 |
| 有支持的最终缓解措施 | 最终建议给出了具体且有依据的修复或安全遏制方案,且不包含任何残留的错误或不安全建议。 |
| 实施就绪度 | 方案明确了修正内容和关键细节;常规的评审、实施和发布检查可以保留。 |
缓解措施和就绪度衡量的是方案,而非已执行的修复或已验证的恢复。
参见评分标准了解评分规则,参见完整结果与方法论了解判定明细和评估细节。
如何部署
在 Project Arena 目录下运行所有命令。两个环境在完成集群和镜像设置后使用相同的基准测试命令。运行器使用你提供的上下文;它不会自动安装网络组件或配置镜像仓库访问权限。
| 本地 kind | AWS EKS | |
|---|---|---|
| 集群创建 | Docker 和 kind | Terraform 位于infra/cluster |
| 凭证 | 无需 AWS 凭证 | 你的 AWS 凭证 |
| 全套件镜像 | 构建并加载到 kind | 构建并推送到节点可访问的镜像仓库 |
| 网络 | NetworkPolicy 需要强制执行的 CNI | Terraform 启用 VPC CNI 策略强制执行 |
| 清理 | 删除 kind 集群 | 移除工作负载,然后销毁 Terraform 资源 |
选择部署路径
集群设置和部署方式是彼此独立的选择:
| 路径 | 变更如何到达 Kubernetes | 设置 |
|---|---|---|
| 直接方式 | bench使用 kubectl 应用应用和故障清单 |
按照下面的场景命令操作 |
| GitOps(完整套件) | 你提交并将变更推送到你的仓库;Argo CD 会同步它们 | 按照Argo CD 设置和运行指南 |
GitOps 路径使用组件 Application,flagd-values、以及batch-active。应用和故障配置可以放在单独的仓库中,也可以放在同一个仓库的不同路径中。使用你自己的仓库并配置它们的 URL。记录调查产品可以访问哪些仓库。
下面的部署、故障和重置命令使用直接方式。对于由 Argo 管理的应用,请使用 GitOps 指南中的命令;直接变更会被阻止,以避免与 Argo 的自愈机制冲突。调查导入、评分和报告在两种方式下工作方式相同。
本地 kind
安装 Python 3.10+、kubectl、Docker、kind 和 Helm。按照kind 设置创建带有 Cilium 的集群并加载完整套件镜像。然后选择其上下文:
export ARENA_CONTEXT=kind-incident-bench完整套件使用预构建的应用镜像,适用于Linux AMD64并且需要 AMD64 worker。Apple Silicon Mac 可以在原生 ARM64 kind worker 上运行冒烟套件,或者操作 AMD64 EKS 集群。仅构建 ARM64 故障镜像并不能让完整应用兼容 ARM64。
对于完整套件,保持registry: "fixture.local"和tag: "v1"在arena.json。链接的设置会为以下项启用 NetworkPolicy 强制执行netpol-isolation。仅对于冒烟套件,python3 -m bench cluster create就足够了;冒烟套件使用固定的公共镜像,不需要完整套件镜像构建。
AWS EKS
除了 Python、kubectl 和 Docker 之外,还要安装 Terraform 和 AWS CLI。配置你的 AWS 凭证,然后按照AWS 集群设置创建集群和 kubeconfig 上下文。让 Docker 向你的镜像仓库进行身份验证,并为你的 worker 架构构建镜像:
export ARENA_CONTEXT=YOUR_CONTEXT kubectl --context "$ARENA_CONTEXT" get nodes -L kubernetes.io/arch #选择与上面显示的 worker 匹配的平台。 export ARENA_PLATFORM=linux/amd64 #完整套件的预构建应用所需。 python3 -m bench.scenarios build-images --registry YOUR_REGISTRY/bench \ --tag YOUR_TAG --platform "$ARENA_PLATFORM" --push
选择worker 架构,无论由哪台计算机运行构建:
| Kubernetes worker | 构建平台 |
|---|---|
| ARM64 worker | 支持冒烟套件;完整套件需要重新构建并验证应用 |
Intel Mac 本地 kind 或 Intel/AMD worker,包括默认 EKSm6i.xlarge |
linux/amd64 |
Apple Silicon Mac 可以使用以下方式为 Intel/AMD EKS 工作节点构建linux/amd64;Docker Desktop 通过模拟支持跨平台构建。此命令一次构建一个目标架构。在混合架构集群上,应用会被调度到 AMD64 工作节点上。
设置registry和tag在arena.json为相同的值。节点必须对镜像仓库有拉取权限;请自行配置仓库权限或 Kubernetes 拉取凭据。AWS 资源会产生费用。Terraform 目前会在一个区域内的三个可用区中创建子网;可用区数量和工作节点数量是独立的设置。
完成任一设置后,按照你产品的说明安装其采集器和告警配置。然后继续下面的运行配置。
如何运行场景
配置一次运行
python3 -m bench init
编辑生成的arena.json:
| 设置项 | 填写内容 |
|---|---|
context |
你在设置中使用的 Kubernetes 上下文;没有环境上下文回退 |
product |
报告中列使用的产品名称 |
run_id,output_dir |
唯一的运行名称及其结果目录 |
suite,scenario |
full或smoke,以及该套件中的一个场景 |
registry,tag |
构建全套件镜像时使用的值 |
judge |
API 提供商、模型以及可选的端点/设置 |
judge_command |
可选的自定义评判可执行文件;会覆盖内置的 API 适配器 |
truths |
针对自定义场景的可选答案键覆盖 |
默认的full套件目前包含 21 个场景。较小的smoke套件包含六个场景,并使用公共 Python 镜像,因此不需要构建故障镜像。它们使用不同的应用;部署前请先选择一个套件。参见场景表了解要求和差异。
python3 -m bench catalog python3 -m bench deploy
注入故障之前,请完成产品设置并确认产品能接收到健康应用的遥测数据。
注入并观察
对于全套件:
python3 -m bench fault python3 -m bench verify python3 -m bench evidence
fault应用清单;verify检查是否观察到预期的故障。仅成功应用并不能构成有效的测试。在重置故障之前,让产品完成调查。
对于smoke,使用fault和evidence,然后自行检查 Pod 状态、事件和服务可用性;自动化verify目前仅支持full。健康的冒烟应用在端口 8080 上提供 HTTP 服务:
kubectl --context "$ARENA_CONTEXT" -n incident-bench port-forward service/api 8080:8080 #在另一个终端中: curl http://localhost:8080/health
若要再次尝试,请先重置,并用以下命令选择一个全新的用例目录--case,放在命令之前:
python3 -m bench --case oom-attempt2 fault python3 -m bench --case oom-attempt2 verify python3 -m bench --case oom-attempt2 evidence
使用同一个--case用于后续的导入和评分命令。它选择的是产物目录,而不是不同的场景。更改scenario在运行文件中,当测试另一个故障时。
如何连接你的产品
安装你的产品的采集器,并按照其自身的说明配置告警。Project Arena 不会安装供应商的智能体、登录产品,也不会自动配置告警。Kubernetes 日志、事件、Pod 状态和应用行为提供故障信号;通过你选择的工具收集指标和追踪。
设置product在arena.json为你希望在对比表中显示的名称。调查结束后,将这些文件保存到<output_dir>/<scenario>/(或你选择的案例目录)下:
| 文件 | 内容 |
|---|---|
final.txt |
实际交付的最终答案,保持不变 |
intermediate.txt |
更早的建议,如果有的话 |
actions.txt |
工具提交和结果,如果有的话 |
使用以下命令导入它们:
python3 -m bench archive
该命令会自动使用这些文件名。缺少最终输入是错误;缺少中间/操作证据则保持缺失。明确记录检测结果,使用--detection detected或--detection not_detected在有观察窗口和证据支持时;默认是not_measured。
支持手动导出。对于基于 API 的集成,提供一个使用调查记录格式的导出器。托管产品连接器不随附。未检测到的案例仍然可以有一条记录,其最终答案为空;它不能被表示为已完成的调查。
如何对调查进行评分
评判者是一个 AI 模型,它将已完成的调查与场景的答案键以及评分标准进行比较。答案键已包含在内。
-
在
arena.json中,选择评判者提供商和模型。例如,编辑现有的judge部分:"judge": { "provider": "openai", "model": "YOUR_MODEL" }
-
在你的 shell 中提供该提供商的 API 密钥(
OPENAI_API_KEY用于此示例)。将密钥远离arena.json。其他提供商和本地模型也受支持。 -
导入调查后,运行:
python3 -m bench packet #准备调查、答案键和评分规则 python3 -m bench judge #将它们发送给你选择的模型
结果是judgment.json在案例目录中:分数、解释和支持性引文。对你比较的每个产品使用相同的评判者模型和设置。API 调用可能会产生费用。
你可以对同一份已保存的调查再次评分,而无需重新运行事件。参见重新评分和已保存结果了解详情。
如何比较结果
python3 -m bench report --summary > summary.csv python3 -m bench report --details > details.csv
摘要将指标放在行中,产品放在列中。每个单元格显示成功/适用(百分比)。仅为示例值,并非基准测试结果:
| 指标 | 产品 A | 产品 B |
|---|---|---|
| 检测 | 8/10 (80.0%) | 7/10 (70.0%) |
| 根因分析 | 6/8 (75.0%) | 5/7 (71.4%) |
| 最终缓解 | 5/8 (62.5%) | 4/7 (57.1%) |
实际报告包含每个评分维度。明细表列出每个场景的判定结果以及是否计入分母。未检测到的案例计入检测率;不适用的案例从相关评分分母中排除。证据不足的案例在适用的已评分案例中仍保留在分母内。缺失的测量和未评分的调查在明细中仍然可见。短横线表示没有适用的已评分案例。
产品名称来自调查记录,通过内容哈希与判定结果匹配。记录和判定结果在配置的运行目录中发现。也包括未检测到案例的记录。比较产品时使用匹配的场景队列、评分标准和评判设置;参见报告选项和计数规则以合并运行并解读每个指标。
如何清理
场景之间重置
对于 GitOps,请遵循Git 重置和同步工作流以便仓库和集群返回到相同的基线。
对于使用直接部署的完整套件:
python3 -m bench reset --confirm-disposable
这会清除注入的资源,恢复三个场景标志,并且仅清除该故障的持久影响。健康的服务、应用数据、凭证和集群保持原样;重置会在下一次故障前验证基线。对于smoke,使用python3 -m bench reset;它会恢复应用但保留存储故障的 PVC。
移除本地 kind 集群
python3 -m bench cluster delete --confirm-delete
移除 AWS 资源
移除应用资源以及任何已配置的卷或负载均衡器,然后遵循AWS 拆除说明。重置故障不会停止 AWS 计费。可选的 Terraform 状态存储会单独持久保留。
高级配置
- 在命令前使用
--run path/to/run.json以选择另一个配置。显式标志会覆盖已保存的设置。 - 配置的文件路径相对于运行文件。显式 CLI 路径和评判可执行文件参数相对于当前工作目录。
- 使用
packet --rubric path/to/rubric.md用于自定义评分标准。在对比的产品之间保持相同的评分标准和评判设置。 - 产品导出器与评判格式描述自定义集成和证据要求。
- 场景实现指南涵盖清单、镜像构建、验证和重置行为。
运行离线测试:
python3 -m unittest discover -s tests -v
许可证
Project Arena 依据MIT 许可证授权。捆绑的第三方代码保留其自身许可证,包括位于以下许可下的 shop 应用Apache-2.0。