stephendelaney/OpsAgent
GitHub: stephendelaney/OpsAgent
OpsAgent 是一个由 Monit 告警触发的 AI 驱动 Java 事件响应 Agent,通过 LLM 自动完成故障数据采集、根因分析并通知运维团队。
Stars: 0 | Forks: 0
# OpsAgent - AI 驱动的 Java 节点事件响应
一个智能运维 Agent,通过收集诊断数据、执行基于 LLM 的根因分析并向运维团队发送告警,自动响应 AWS EC2 实例上的 Java 节点故障。
## 概述
当 Java 节点发生故障时,OpsAgent 由 Monit 告警触发。它会:
1. **收集诊断数据**:来自 EFS 的日志、当前系统指标,以及可选的 heap dump
2. **AI 分析**:使用 Claude/GPT 进行全面的根因分析
3. **告警运维团队**:通过 Slack/PagerDuty 发送详细报告
4. **可选重启**:如果启用,可以自动重启节点(默认禁用)
## 运行模型
OpsAgent 的实际运行方式与其功能同样重要。需要了解三点:
1. **它是一个常驻监听器,通常在本地/运维主机上运行。** OpsAgent 是一个长期运行的
Flask webhook 服务——每个 EC2 节点上的 Monit 会在 Java 进程失败的那一刻向其发送 POST 请求。因此,托管 OpsAgent 的机器必须保持**开机状态,且能被节点网络访问到**,以便告警能够到达。在笔记本电脑上运行适合开发,但在实际部署中需要一台专用的常驻主机(小型运维机器或 bastion)。默认情况下,webhook 绑定到
`127.0.0.1`;要从远程节点接收告警,请设置 `webhook_host: "0.0.0.0"` **并**启用
`authentication`(参见[安全注意事项](#security-considerations))。
2. **应用日志存在于每个实例的 EFS 挂载中,并保留两份深度。** 每个 EC2 实例都挂载了共享的 EFS 驱动器,Java 应用将其日志写入此处。保留策略是一个**保留两份文件的滚动窗口**(当前日志加上一次轮转)——因此及时收集至关重要:一旦发生第三次轮转,最早的证据就会丢失。当告警触发时,OpsAgent 会通过 SSH/SFTP 连接到节点,并在该窗口越过故障点之前提取挂载到 EFS 的日志(路径在 `config.yaml` 中的 `efs:` 下配置)。
3. **在存放 Java 源代码的地方运行它,您将获得源代码级别的关联分析。** 日志分诊告诉您发生了*什么*失败;将堆栈跟踪和日志证据与实际的源代码树配对,可以告诉您是*哪段代码路径*导致的。当 OpsAgent 运行在一台也检出了服务源代码的机器上时,这种关联就变得可行了——这就是“思考伙伴”步骤,Claude 结合运行时证据和源代码进行推理。有关这如何契合默认的“日志优先”设计,请参见[日志与代码分析对比](#logs-vs-code-analysis)。
## 核心功能
- 🤖 **基于 LLM 的分析**:使用 Claude Sonnet 或 GPT-4 进行全面的根因诊断
- 📊 **智能数据收集**:仅收集必要的数据(仅在出现内存问题时才收集 heap dump)
- 🎯 **务实的设计**:专注于诊断,而非代码分析(日志中包含答案)
- 🔒 **默认安全**:禁用自动恢复 - 由运维团队决定是否重启
- ⚡ **快速响应**:简化的工作流,用于快速的事件分诊
- 🧪 **全面测试**:包含模拟组件的全面测试套件
## 架构(简化版)
```
OpsAgent/
├── OpAgent.py # Main orchestrator + Monit webhook
├── config.yaml # Configuration
├── requirements.txt # Dependencies
├── collectors/ # Data collection modules
│ ├── log_collector.py # Gather logs from EFS
│ ├── metrics_collector.py # Current system metrics
│ └── heap_dump_collector.py # Optional heap dump collection
├── analyzer.py # Unified LLM analyzer
├── recovery.py # Optional automated restart
├── utils/ # Supporting utilities
│ ├── logger.py # Structured logging
│ └── notifier.py # Slack/PagerDuty alerts
└── tests/ # Comprehensive test suite
```
## 工作流
```
┌─────────────┐
│ Monit Alert │
└──────┬──────┘
│
v
┌──────────────────────────────────┐
│ 1. Collect Current Metrics │
│ - CPU, memory, disk, Java PID │
└──────┬───────────────────────────┘
│
v
┌──────────────────────────────────┐
│ 2. Collect Logs from EFS │
│ - Application logs │
│ - System logs │
│ - GC logs │
│ (rolling window, two deep — │
│ pulled before it rotates past)│
└──────┬───────────────────────────┘
│
v
┌──────────────────────────────────┐
│ 3. Collect Heap Dumps (Optional) │
│ - Only if OOM detected │
└──────┬───────────────────────────┘
│
v
┌──────────────────────────────────┐
│ 4. LLM Analysis (Claude/GPT) │
│ - Root cause identification │
│ - Evidence correlation │
│ - Actionable recommendations │
└──────┬───────────────────────────┘
│
v
┌──────────────────────────────────┐
│ 5. Alert Operations Team │
│ - Slack notification │
│ - PagerDuty incident │
│ - Detailed incident report │
└──────┬───────────────────────────┘
│
v
┌──────────────────────────────────┐
│ 6. Optional: Automated Restart │
│ - Disabled by default │
│ - Ops team manually restarts │
└──────────────────────────────────┘
```
## 安装说明
### 前置条件
- Python 3.8+
- 已配置 AWS 凭证
- 对 EC2 实例的 SSH 访问权限
- Anthropic 或 OpenAI API key
### 设置
```
# 克隆仓库
git clone https://github.com/stephendelaney/OpsAgent.git
cd OpsAgent
# 安装依赖
pip install -r requirements.txt
# 复制并自定义配置
cp config.yaml.example config.yaml
vi config.yaml
# 更新:SSH key 路径、EFS 路径、实例详情
# 配置 API keys
export ANTHROPIC_API_KEY="your-api-key-here"
export SLACK_WEBHOOK_URL="your-slack-webhook-url"
# 运行测试
pytest tests/ -v
# 启动 agent
python OpAgent.py
```
### 部署(常驻主机)
由于 OpsAgent 是一个长期运行的监听器(参见[运行模型](#operating-model)),在实际部署中,应该通过进程管理器将其运行在一台常驻主机上,而不是在终端中运行。
一个最简的 `systemd` unit:
```
# /etc/systemd/system/ops-agent.service
[Unit]
Description=OpsAgent - Java incident response listener
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=ops-agent
WorkingDirectory=/opt/ops-agent
# 在此处提供 API keys / MONIT_AUTH_TOKEN,或通过 config.yaml 从 AWS Secrets Manager 加载
EnvironmentFile=/etc/ops-agent/ops-agent.env
ExecStart=/opt/ops-agent/.venv/bin/python /opt/ops-agent/OpAgent.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
```
```
sudo systemctl daemon-reload
sudo systemctl enable --now ops-agent
sudo systemctl status ops-agent
journalctl -u ops-agent -f # follow logs
```
请记住在 `config.yaml` 中设置 `webhook_host: "0.0.0.0"` 并启用 `authentication`,以便远程的
Monit 节点能够访问该监听器(参见[安全注意事项](#security-considerations))。
## 配置
### 核心配置项
```
# 启用/禁用自动恢复 (DEFAULT: false)
recovery:
auto_restart: false # Ops team manually restarts by default
# 用于收集 log 和 heap dump 的 EFS 路径
efs:
logs_path: "/mnt/efs/logs"
heap_dumps_path: "/mnt/efs/heap-dumps"
# LLM provider (anthropic 或 openai)
llm:
provider: "anthropic"
anthropic:
model: "claude-sonnet-4-5-20250929"
# 通知渠道
notifications:
slack:
enabled: true
channel: "#ops-alerts"
```
有关所有选项,请参见 [config.yaml.example](config.yaml.example)。
## 用法
### 作为 Webhook 服务
将 Agent 启动为监听 Monit 告警的 webhook 服务:
```
python OpAgent.py
```
Agent 将监听 8000 端口(可配置)以接收传入的 Monit webhook。
### 配置 Monit
将 webhook 添加到您的 Monit 配置中:
```
check process java-app with pidfile /var/run/java-app.pid
start program = "/opt/java-app/bin/start.sh"
stop program = "/opt/java-app/bin/stop.sh"
if does not exist then exec "/usr/bin/curl -X POST http://ops-agent-host:8000/monit-webhook \
-H 'Content-Type: application/json' \
-d '{\"service\":\"java-app\",\"event\":\"Does not exist\",\"instance_ip\":\"INSTANCE_IP\",\"instance_id\":\"INSTANCE_ID\"}'"
```
### 手动触发(用于测试)
```
import asyncio
from OpAgent import OpAgent
agent = OpAgent('config.yaml')
alert_data = {
'service': 'java-app',
'event': 'Does not exist',
'instance_ip': '10.0.1.50',
'instance_id': 'i-1234567890abcdef0'
}
result = asyncio.run(agent.handle_alert(alert_data))
print(result)
```
## 测试
包含单元测试和集成测试的全面测试套件:
```
# 运行所有测试
pytest tests/ -v
# 运行特定 test module
pytest tests/test_collectors.py -v
# 附带 coverage 运行
pytest tests/ --cov=. --cov-report=html
# 仅运行 integration tests
pytest tests/test_integration.py -v
```
### 测试固件
位于 `tests/fixtures/` 的示例数据文件:
- `sample_monit_alert.json`:Monit 告警示例
- `sample_app.log`:包含 OOM 错误的应用日志
- `sample_gc.log`:显示内存压力的 GC 日志
- `test_config.yaml`:测试配置
## 为什么采用这种设计?
### 日志与代码分析对比
**决策**:自动化路径专注于日志分析,而不是代码仓库分析。
**理由**:
- Java 故障(OOM、死锁、连接问题)在日志中显而易见
- 堆栈跟踪直接指向问题区域
- 无需检出/解析代码,响应更快
- 复杂度更低,可靠性更高——自动化分诊保持快速且无依赖
**本地源代码例外**:默认采用“日志优先”,因为 Agent 无法假设其运行的任何主机上都存在源代码。但是,当您在检出了服务源代码的环境中*确实*运行了 OpsAgent 时(参见[运行模型](#operating-model),第 3 点),将日志证据与实际代码关联起来是顺理成章的下一步——堆栈帧映射到真实的文件和行号,LLM 可以直接针对出错的路径进行推理。可以将其视为两个层级:默认情况下进行快速的纯日志分诊,当手头有代码时,则进行更深度的源码关联根因分析。
### 默认手动恢复
**决策**:默认禁用自动恢复。
**理由**:
- 运维人员在重启前会审查分析结果
- 防止重启循环
- 允许对复杂问题进行人工干预
- 在生产环境中更安全
### 可选的 Heap Dump
**决策**:仅在检测到内存问题时才收集 heap dump。
**理由**:
- Heap dump 体积庞大(GB 级别),传输缓慢
- 只有与内存相关的故障才需要它
- 大多数问题仅通过日志即可诊断
## 安全注意事项
- **SSH 密钥**:存储在 AWS Secrets Manager 中(推荐)或安全的文件系统中
- **API 密钥**:使用环境变量,切勿提交到代码中
- **Webhook 认证**:在生产环境中启用基于 token 的认证
- **凭证脱敏**:敏感数据在记录前进行脱敏处理
- **日志数据会离开您的环境**:收集到的应用日志会被发送给第三方 LLM
(Claude/GPT)进行分析,日志中可能包含嵌入在堆栈跟踪中的 PII、token 或机密信息。
请审查您服务商的数据处理条款,如果这关系到您的合规性要求,请在源头对敏感字段进行清洗或脱敏。(注意:EFS 的滚动窗口只有两个文件的深度,因此它本身并不是一个长期的留存存储——请在其他地方满足审计/留存需求。)
## 故障排除
### Agent 未收到告警
- **Webhook 绑定地址**:默认情况下,OpsAgent 绑定 `127.0.0.1`,因此远程 Monit 节点无法访问它。要接受来自其他主机的告警,请设置 `webhook_host: "0.0.0.0"` 并通过 `MONIT_AUTH_TOKEN` 启用 `authentication`。
- 确认运行 OpsAgent 的主机已开机且可访问——它是一个常驻监听器(参见[运行模型](#operating-model));如果机器休眠或断网,告警将会丢失。
- 检查 Monit webhook 配置
- 验证到 Agent 的网络连通性
- 检查 Agent 日志:`/var/log/ops-agent/ops-agent.log`
### SSH 连接失败
- 验证配置中的 SSH 密钥路径
- 检查 EC2 安全组是否允许来自 Agent 的 SSH 连接
- 测试手动 SSH 连接:`ssh -i /path/to/key.pem ec2-user@instance-ip`
### LLM 分析失败
- 验证 API 密钥是否已设置:`echo $ANTHROPIC_API_KEY`
- 检查 API 速率限制
- 查看 LLM 服务商的状态页面
### Heap dump 收集缓慢
- Heap dump 可能有几个 GB 大小 - 这是正常现象
- 考虑在配置中增加 `collection_timeout`
- 验证 EFS 挂载性能
## 许可证
[在此处添加您的许可证]
## 支持
如有问题或疑问:
- 检查 `/var/log/ops-agent/` 中的日志
- 查看 `/tmp/ops-agent-incidents/` 中的事件报告
- 启用 DEBUG 日志记录以获取详细输出
**注意**:此 Agent 专为防御性安全和事件响应设计。它不执行代码修改或进攻性安全操作。
标签:AIOps, Petitpotam, 库, 应急响应, 故障诊断, 根因分析, 自动化响应, 运维工具, 逆向工具