anshikapundeel/incident-pilot
GitHub: anshikapundeel/incident-pilot
一个用 Go 编写的 AI 增强事件响应服务,通过确定性规则引擎关联 Alertmanager 告警与部署、日志、trace 数据,生成结构化事件报告。
Stars: 0 | Forks: 0
# incident-pilot
一个使用 Go 编写的 **AI 增强的事件响应服务**。它接收 Alertmanager 格式的告警,通过确定性的规则引擎将它们与最近的部署、日志和 trace 相关联,生成带有引用证据的结构化事件,并可选择使用本地配置的 LLM 进行重写。它将结果路由到 Slack(或 stdout)。
这是 [`ai-ops-design`](https://github.com/anshikapundeel/ai-ops-design) 中设计的可运行实现。
架构、故障模式、威胁模型和成本分析都在那里;这个仓库是将设计变为现实的 v0 代码。
```
Alertmanager webhook ──> incident-pilot ──> Slack / stdout
│
rule engine + LLM
│
(cited findings →
rephrased prose)
```
**纯 Go stdlib。零运行时依赖。不硬编码任何 API 密钥。**
## 为什么会有这个项目
当凌晨 3 点触发告警时,值班工程师需要知道三件事,顺序如下:
1. **刚刚发生了什么?**(一次部署、一次配置更改、某个依赖项的部分中断)
2. **是否已经有人在处理了?**(是否是某个未解决事件的重复项)
3. **最可能的修复方法是什么?**
incident-pilot 在告警信息到达之前就能回答这三个问题。它在分析过程中不使用 LLM(在时间紧迫的数据下,LLM 会对因果关系产生幻觉;请参阅 [llm-integration 设计文档](https://github.com/anshikapundeel/ai-ops-design/blob/main/docs/08-llm-integration.md))。
分析是通过确定性的规则代码完成的。LLM(如果已配置)仅将规则输出重写为更自然的散文。
## 功能
- **兼容 Alertmanager 的 webhook**(位于 `POST /alerts`)。现有的 Prometheus 设置可以直接路由到它,无需进行任何更改。
- v0 版本包含 **5 条关联规则**:近期部署关联、错误日志激增聚类、trace 尾延迟、未解决重复事件检测、团队路由决策。
- **可插拔的富集** — 将部署 / trace / 日志推送到 `/context/*` endpoint;规则会在下一次告警时获取这些数据。
- **模板化叙述始终可用。** LLM 叙述是可选的,并且需要显式的环境变量才能启用。
- **Slack 输出**(通过 incoming webhook URL,由环境变量驱动;代码中无密钥)。
- **强制执行规则契约:** 每个发现都至少引用一条证据;损坏的规则会变成一个 LOW 级别的发现,而不是导致 pipeline 崩溃。
- 在并发摄取 + 查询期间**通过竞态检测器检查**。
## 构建并运行
需要 Go 1.22+。
```
git clone https://github.com/anshikapundeel/incident-pilot
cd incident-pilot
go build -o incident-pilot ./cmd/incident-pilot
./incident-pilot # listens on :9099
```
## 快速演示
在一个终端中:
```
./incident-pilot
```
在另一个终端中 — 记录一次部署,输入一些错误日志,然后触发告警:
```
# 告诉平台 3 分钟前发生了一次 deploy
curl -X POST localhost:9099/context/deploys -d '{
"service": "api-gateway",
"commit": "a39bf2c",
"author": "alice",
"when": "'$(date -u -d "3 minutes ago" +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date -u -v-3M +"%Y-%m-%dT%H:%M:%SZ")'"
}'
# 添加一些 error logs
for i in 1 2 3 4 5 6 7 8 9 10; do
curl -X POST localhost:9099/context/logs -d "{
\"service\":\"api-gateway\",\"level\":\"ERROR\",
\"message\":\"upstream timeout request $i\"
}"
done
# 触发 alert
curl -X POST localhost:9099/alerts \
-H 'Content-Type: application/json' \
-d @examples/sample_alert.json
# 查看结构化的 incident
curl -s "localhost:9099/api/incidents?limit=1" | jq .
```
在第一个终端中,你会看到模板化的事件报告出现,其中包含一个部署关联发现(HIGH 严重性,因为部署发生在告警前 3 分钟)和一个错误激增发现(MEDIUM,带有聚类的错误模式)。
## v0 中内置的规则
| 规则 ID | 捕获内容 |
|-------------------------------|----------------|
| `deploy.recent_corlated` | 告警发生在对同一服务的部署后不久。最强的单一信号。 |
| `logs.error_spike` | 告警服务有大量 ERROR 级别的日志行;通过聚类突出显示主要的错误模式。 |
| `traces.tail_latency` | 该服务近期 trace 的 p99 延迟超过阈值。 |
| `incident.duplicate_open` | 相同的指纹,或相同的服务+告警名称,已经有未解决的事件。防止告警风暴导致页面泛滥。 |
| `routing.team` | 将路由决策作为一个可见的发现展示出来,以便进行审计。 |
每条规则都位于 `internal/rules/` 中各自的文件中,大约是 100 行简单明了的 Go 代码。添加第六条规则只是一个很小的更改 — 请参阅 [ADDING_RULES.md](docs/ADDING_RULES.md)。
每个发现包含:
- `severity` (info / low / medium / high / critical)
- `confidence` (low / medium / high) — 与严重性正交
- `summary` — 一段话总结
- `suggestion` — 具体的下一步命令
- `evidence` — 指向触发它的数据
## API
| Endpoint | 用途 |
|----------|---------|
| `POST /alerts` | Alertmanager webhook(信封格式或裸告警) |
| `POST /context/deploys` | 记录部署事件 |
| `POST /context/traces` | 记录 trace 样本 (TraceID, service, duration) |
| `POST /context/logs` | 记录错误日志行 |
| `GET /api/incidents?limit=N` | 列出近期事件 |
| `GET /api/incidents/{id}` | 完整获取一个事件 |
| `POST /api/incidents/{id}/resolve` | 标记事件为已解决 |
| `GET /api/stats` | 计数器:告警输入、已开启事件等 |
| `GET /healthz` | 存活探针 |
## 可选的 LLM 叙述
incident-pilot **不包含任何 API 密钥、默认提供商,也不进行外部调用。** 它始终使用模板化叙述。要启用 LLM 重写层,请在启动前设置环境变量:
```
# 本地 Ollama(推荐用于数据敏感环境):
export INCIDENT_PILOT_LLM_PROVIDER=ollama
export INCIDENT_PILOT_LLM_BASE_URL=http://localhost:11434
export INCIDENT_PILOT_LLM_MODEL=llama3.1:8b
./incident-pilot
# 或任何 OpenAI 兼容的 endpoint:
export INCIDENT_PILOT_LLM_PROVIDER=openai-compatible
export INCIDENT_PILOT_LLM_BASE_URL=https://your-endpoint.example.com
export INCIDENT_PILOT_LLM_MODEL=gpt-4o-mini
export INCIDENT_PILOT_LLM_API_KEY=YOUR_KEY
./incident-pilot
```
LLM **严格来说只是一个展示层**。系统提示明确禁止模型引入新的发现、更改严重性或捏造操作。结构化事件(权威数据)始终与叙述一起保留。
当 LLM 不可用或失败时,incident-pilot 会静默回退到模板化叙述。告警仍然会被路由。
有关此设计背后的完整原因,请参阅
[`ai-ops-design/docs/08-llm-integration.md`](https://github.com/anshikapundeel/ai-ops-design/blob/main/docs/08-llm-integration.md)。
## Slack 输出
将 `INCIDENT_PILOT_SLACK_WEBHOOK` 设置为 Slack 的 incoming-webhook URL:
```
export INCIDENT_PILOT_SLACK_WEBHOOK=https://hooks.slack.com/services/T.../B.../...
./incident-pilot
```
Slack sink 是在 stdout sink 之外添加的(而不是替代它)。如果你只想要 Slack 输出,请使用 `-quiet` 抑制 stdout。
## 这是什么以及不是什么
**是:**
- 一个完整、可运行的事件关联服务。只需放入环境,将 Alertmanager 指向 `/alerts`,将部署推送到 `/context/deploys`,每次触发时你都会得到结构化的事件报告。
- [ai-ops-design](https://github.com/anshikapundeel/ai-ops-design) 智能平面子系统的一个参考实现,特别是记录在 [docs/02-incident-pipeline.md](https://github.com/anshikapundeel/ai-ops-design/blob/main/docs/02-incident-pipeline.md) 中的事件 pipeline。
- 证明 AI 增强的事件响应可以使用确定性核心和 *可选的* LLM 层来构建,而不是使用会产生因果关系幻觉的 LLM 作为评判者。
**不是:**
- 一个存储后端。事件保存在内存中;重启后会丢失。生产环境部署应使用 Postgres 或类似技术作为存储后端。
- 一个告警管理器。使用 Prometheus Alertmanager(或其他任何工具)进行规则评估。incident-pilot 从 Alertmanager 交接的地方开始工作。
- 一个搜索引擎。未实现按内容查询过去的事件。完整设计通过向量检索涵盖了此功能(请参阅 ai-ops-design);v0 中未包含。
- 一个完整的可观测性技术栈。将其与
[`flow-trace`](https://github.com/anshikapundeel/flow-trace)
用于 trace,
[`sched-trace`](https://github.com/anshikapundeel/sched-trace) 用于
内核遥测,
[`redfish-exporter`](https://github.com/anshikapundeel/redfish-exporter)
用于硬件事件,以及
[`perf-advisor`](https://github.com/anshikapundeel/perf-advisor) 用于
性能规则分析。
## 项目布局
```
internal/model/ Alert, Context, Finding, Incident — domain types
internal/correlate/ Rule engine: runs rules, enforces evidence contract
internal/rules/ Five v0 detection rules (one file each)
internal/store/ In-memory incident store, sync.RWMutex-guarded
internal/narrate/ Templated narration + optional LLM hook
internal/route/ Stdout + Slack delivery sinks
internal/server/ HTTP API (alerts, context, query endpoints)
cmd/incident-pilot/ Server binary
examples/ Sample alert + deploy JSON payloads
docs/ DESIGN.md, ADDING_RULES.md
```
## 测试
```
go test ./... # 27 tests, all green
go test -race ./... # also race-clean
```
CI matrix:Go 1.22 和 1.23,都带有 `-race` 标志,外加一个端到端冒烟测试,该测试向实时服务器触发告警并验证事件是否出现。
## 路线图
- [x] Alertmanager 格式摄取,裸告警回退
- [x] 带有引用证据的 5 条关联规则
- [x] 可选的 LLM hook(兼容 Ollama / OpenAI)
- [x] Slack + stdout 交付 sink
- [x] 内存存储 + REST 查询 API
- [x] 27 个单元 + e2e 测试,race-clean
- [ ] 过往事件检索(已解决事件的向量相似度)
- [ ] 基于 Postgres 的持久化存储
- [ ] 对 LLM 输出进行幻觉检查(声明 → 发现基础)
- [ ] PagerDuty / Opsgenie sink
- [ ] Prometheus `/metrics` endpoint
- [ ] 更多规则:cgroup OOM、leader-selection 抖动、依赖级联图
## License
MIT.
标签:AI风险缓解, EVTX分析, 日志审计