OpenClaw + Claude Code 端到端研发自动化系统 · 告警模块技术方案
在端到端的研发自动化流程中,从 PRD 设计、AI 代码生成、单元测试、集成测试到 UI 自动化测试,每个环节都可能出现异常。及时、准确地发现并通知相关人员处理这些异常,是保障研发效率和质量的关键。
| 组件 | 技术栈 | 说明 |
|---|---|---|
| Web 框架 | FastAPI | 高性能异步 Web 框架 |
| 消息队列 | Redis / RabbitMQ | 异步任务处理(可选) |
| 数据存储 | SQLite / PostgreSQL | 告警记录存储 |
| 通知渠道 | SMTP / 云 API | 邮件、短信、企微 |
系统完全不可用
核心功能瘫痪
响应时间:5 分钟
短信 + 企微 + 邮件核心功能受影响
部分用户无法使用
响应时间:15 分钟
企微 + 邮件非核心功能异常
影响用户体验
响应时间:1 小时
企业微信轻微异常或预警
需要关注但无需立即处理
响应时间:4 小时
邮件| 异常类型 | 触发条件 | 级别 | 通知渠道 |
|---|---|---|---|
| Jenkins 构建失败 | build_status == "failed" | P0 | 短信 + 企微 + 邮件 |
| K8S 部署失败 | deployment_status == "failed" | P0 | 短信 + 企微 + 邮件 |
| 镜像构建超时 | build_duration > 1800s | P2 | 企业微信 |
| 异常类型 | 触发条件 | 级别 | 通知渠道 |
|---|---|---|---|
| 代码生成失败 | generation_status == "failed" | P1 | 企微 + 邮件 |
| 代码质量不达标 | code_quality_score < 80 | P1 | 企微 + 邮件 |
| 安全漏洞检测 | security_issues > 0 | P0 | 短信 + 企微 + 邮件 |
| 异常类型 | 触发条件 | 级别 | 通知渠道 |
|---|---|---|---|
| 单元测试失败 | test_status == "failed" | P1 | 企微 + 邮件 |
| 覆盖率不足 | coverage_percentage < 80% | P2 | 企业微信 |
| 异常类型 | 触发条件 | 级别 | 通知渠道 |
|---|---|---|---|
| 接口联调失败 | integration_test_status == "failed" | P1 | 企微 + 邮件 |
| API 响应过慢 | response_time > 2000ms | P2 | 企业微信 |
| 异常类型 | 触发条件 | 级别 | 通知渠道 |
|---|---|---|---|
| UI 测试失败 | ui_test_status == "failed" | P1 | 企微 + 邮件 |
| 视觉回归异常 | visual_diff > 5% | P2 | 企业微信 |
适用场景:P0-P3 全级别告警,适合传递详细信息
技术实现:SMTP 协议 + HTML 模板
特点:
适用场景:P0/P1紧急告警,确保即时触达
技术实现:阿里云/腾讯云 SMS API
特点:
适用场景:P1-P3日常告警,团队协作
技术实现:企微机器人 Webhook / 应用消息 API
特点:
| 告警级别 | 工作时间 (9:00-18:00) | 非工作时间 | 节假日 |
|---|---|---|---|
| P0 | 短信 + 企微 + 邮件 | 短信 + 企微 + 邮件 | 短信 + 企微 + 邮件 |
| P1 | 企微 + 邮件 | 短信 + 企微 + 邮件 | 短信 + 企微 + 邮件 |
| P2 | 企业微信 | 企业微信 | 邮件 |
| P3 | 企业微信 | 邮件 | 邮件 |
# 邮件 HTML 模板示例
<div class="alert-header">
<h1>🚨 系统异常告警</h1>
<h2>【{severity}】{alert_name}</h2>
</<div>
<table>
<tr><td>告警 ID:</td><td>{alert_id}</td></tr>
<tr><td>发生时间:</td><td>{timestamp}</td></tr>
<tr><td>涉及系统:</td><td>{system}</td></tr>
<tr><td>研发阶段:</td><td>{stage}</td></tr>
</table>
负责从 incoming events 中检测异常,支持阈值检测、趋势分析、统计异常检测等多种策略。
将检测到的异常与预定义的告警规则进行匹配,确定触发的规则和告警级别。
创建告警实例,管理告警生命周期(创建、确认、升级、解决、关闭)。
防止告警风暴,在指定的时间窗口内,相同的告警只发送一次通知。
# AlertEvent - 告警事件
class AlertEvent:
event_type: str # 事件类型
stage: str # 研发阶段
system: str # 系统名称
metric: str # 指标名称
value: Any # 指标值
timestamp: datetime # 时间戳
details: dict # 详细信息
# AlertRule - 告警规则
class AlertRule:
id: str # 规则 ID
name: str # 规则名称
severity: Severity # 告警级别
trigger: Trigger # 触发条件
notification: dict # 通知配置
# Alert - 告警实例
class Alert:
id: str # 告警 ID
rule_id: str # 规则 ID
status: Status # 告警状态
created_at: datetime # 创建时间
acknowledged_by: str # 确认人
resolved_at: datetime # 解决时间
通过生成告警的唯一指纹(dedup_key),在指定的时间窗口内抑制重复告警。
def generate_dedup_key(alert):
# 基于规则 ID、事件类型、系统、指标生成唯一键
key_parts = [
alert.rule_id,
alert.event.event_type,
alert.event.system,
alert.event.metric,
]
key_string = "|".join(key_parts)
return hashlib.sha256(key_string.encode()).hexdigest()[:32]
def is_duplicate(alert, window=300):
dedup_key = generate_dedup_key(alert)
now = datetime.now()
if dedup_key in cache:
last_seen = cache[dedup_key]
if (now - last_seen).seconds < window:
return True # 是重复告警
cache[dedup_key] = now
return False # 不是重复告警
当告警在指定时间内未被确认或解决时,自动升级到上级负责人。
async def check_escalations():
for alert in active_alerts:
timeout = get_timeout_by_severity(alert.severity)
elapsed = (now - alert.created_at).seconds
if alert.status == "triggered" and elapsed > timeout:
# 超时未确认,升级
escalate_to = get_escalation_targets(alert)
await send_escalation_notification(alert, escalate_to)
elif alert.status == "acknowledged":
ack_elapsed = (now - alert.acknowledged_at).seconds
if ack_elapsed > timeout * 2:
# 确认后超时未解决,再次升级
await send_escalation_notification(alert, escalate_to)
在维护窗口或特定时间段内,自动静默部分级别的告警。
def is_in_silence_period(rule):
now = datetime.now()
for period in rule.silence_periods:
# 检查星期几
if now.weekday() not in period.weekdays:
continue
# 检查时间段
current_time = now.hour * 60 + now.minute
start_time = parse_time(period.start_time)
end_time = parse_time(period.end_time)
if start_time <= current_time <= end_time:
return True # 在静默期内
return False
| 属性 | 说明 |
|---|---|
| URL | POST /api/v1/alerts |
| Content-Type | application/json |
# 请求体
{
"event_type": "build_failure",
"stage": "ci_cd",
"system": "backend-service",
"metric": "build_status",
"value": "failed",
"details": {
"job_id": "jenkins-12345",
"branch": "main",
"error_message": "Compilation failed"
}
}
# 响应
{
"code": 200,
"message": "Alert created successfully",
"data": {
"alert_id": "ALT-20260315-ABC123",
"status": "triggered",
"severity": "P0"
}
}
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/v1/alerts | 获取告警列表 |
| GET | /api/v1/alerts/{id} | 获取告警详情 |
| PUT | /api/v1/alerts/{id}/acknowledge | 确认告警 |
| PUT | /api/v1/alerts/{id}/resolve | 解决告警 |
| PUT | /api/v1/alerts/{id}/close | 关闭告警 |
| GET | /api/v1/statistics | 获取统计数据 |
# 基本配置
app_name: "研发自动化告警系统"
debug: false
host: "0.0.0.0"
port: 8000
# 邮件配置
email:
smtp_server: "smtp.company.com"
smtp_port: 587
use_tls: true
username: "${EMAIL_USERNAME}"
password: "${EMAIL_PASSWORD}"
# 短信配置
sms:
provider: "aliyun"
access_key: "${SMS_ACCESS_KEY}"
secret_key: "${SMS_SECRET_KEY}"
# 企业微信配置
wecom:
webhook_url: "${WECOM_WEBHOOK_URL}"
corp_id: "${WECOM_CORP_ID}"
agent_id: "${WECOM_AGENT_ID}"
secret: "${WECOM_SECRET}"
rules:
- id: "cicd_build_failure"
name: "CI/CD 构建失败"
stage: "ci_cd"
severity: "P0"
trigger:
type: "threshold"
metric: "build_status"
operator: "=="
threshold: "failed"
notification:
channels: ["sms", "wecom", "email"]
receivers: ["role:devops", "role:backend_dev"]
escalation:
enabled: true
timeout: 300
escalate_to: ["role:tech_lead"]
deduplication:
enabled: true
window: 300
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "src.main:create_app", "--factory", "--host", "0.0.0.0", "--port", "8000"]
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: alert-system
spec:
replicas: 3
selector:
matchLabels:
app: alert-system
template:
metadata:
labels:
app: alert-system
spec:
containers:
- name: alert-system
image: alert-system:v1.0
ports:
- containerPort: 8000
env:
- name: EMAIL_USERNAME
valueFrom:
secretKeyRef:
name: alert-secrets
key: email-username
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
# 1. 安装依赖
pip install -r requirements.txt
# 2. 设置环境变量
export EMAIL_USERNAME="alert@company.com"
export EMAIL_PASSWORD="your_password"
export WECOM_WEBHOOK_URL="https://qyapi.weixin.qq.com/..."
# 3. 启动服务
python -m uvicorn src.main:create_app --factory --reload
# 4. 访问 API 文档
# http://localhost:8000/docs
curl -X POST http://localhost:8000/api/v1/alerts \
-H "Content-Type: application/json" \
-d '{
"event_type": "build_failure",
"stage": "ci_cd",
"system": "backend-service",
"metric": "build_status",
"value": "failed",
"details": {
"job_id": "jenkins-12345",
"branch": "main"
}
}'
curl -X PUT http://localhost:8000/api/v1/alerts/ALT-20260315-ABC123/acknowledge \
-H "Content-Type: application/json" \
-d '{"user": "zhangsan"}'