springdom/solace
GitHub: springdom/solace
开源的告警管理和事件响应平台,将多源告警归一化、去重并自动关联为事件,在统一界面中完成响应与升级。
Stars: 1 | Forks: 0
# Solace
开源告警管理和事件响应平台。从任何监控源摄入告警,去重,自动关联为事件,并管理响应——所有操作在一个仪表板中完成。
**可以将其视为 PagerDuty / OpsGenie,但它是开源的、可自托管的。**
## 功能特性
### 认证与访问控制
- **基于 JWT 的认证** — 使用用户名/密码进行安全登录,令牌有效期 8 小时
- **基于角色的访问控制 (RBAC)** — 三种角色:管理员(完全访问)、用户(读取 + 确认/解决)、查看者(只读)
- **默认管理员账户** — 首次启动时自动创建,配置可设置的凭据
- **首次登录密码修改** — 管理员账户在首次登录时强制修改密码
- **API 密钥向后兼容** — Webhook 摄入仍使用 `X-API-Key` 头,现有集成不受影响
- **用户管理** — 管理员面板可创建、编辑和停用用户账户
### 待办轮班(On-Call Scheduling)
- **灵活的轮班** — 支持按小时、天、周或自定义间隔轮班
- **成员管理** — 将团队成员按轮班顺序添加到排班中
- **有时区感知的交接** — 为每个排班配置交接时间和时区
- **临时覆盖** — 可在指定时间范围内临时切换值班人员并记录原因
- **“谁在值班”视图** — 实时显示当前每个排班的值班人员
### 升级策略(Escalation Policies)
- **多级升级** — 可配置超时(1-1440 分钟)定义多级升级
- **混合目标** — 每一级可直接通知用户或从排班中通知当前值班人员
- **重复支持** — 策略可在停止前重复 N 次遍历所有级别
- **服务到策略映射** — 使用通配符模式(如 `billing-*`、`*`)将服务映射到升级策略
- **优先级排序** — 当多个匹配规则存在时,优先级数字最低者生效
- **严重性过滤** — 可选限制映射仅针对特定严重性级别
### 告警摄入与归一化
- **6 个内置 Webhook 归一化器** — 通用、Prometheus Alertmanager、Grafana、Splunk、Datadog 和 Email 摄入
- **可插拔架构** — 每个提供者拥有独立的归一化器,将供应商特定负载映射为 Solace 内部格式
- **自动严重性映射** — 提供者特定的优先级/严重性级别被归一化为 Solace 的 5 级模型(严重、高、警告、低、信息)
### 去重(Deduplication)
- **基于指纹的去重** — 使用身份字段(来源、名称、服务、主机、标签)的 SHA256 哈希确保相同告警合并而非重复
- **可配置的重复窗口** — 默认 5 分钟;窗口内相同告警会递增 `duplicate_count`
- **发生时间线** — 每次重复到达都会记录时间戳,用于频率分析
### 事件关联(Incident Correlation)
- **自动基于服务的分组** — 在可配置时间窗口(默认 10 分钟)内的同服务告警会被归入单个事件
- **严重性自动提升** — 事件严重性始终反映其中最严重的告警级别
- **自动解决** — 当事件内所有告警解决时,事件自动解决
### 告警生命周期
- **完整状态流程** — 已触发 → 已确认 → 已解决,另含抑制和归档状态
- **确认与解决** — 仪表板或 API 上的一键操作
- **批量操作** — 可选择多个告警并一次性确认或解决
- **归档** — 归档已解决超过 N 天的告警以保持仪表板整洁
### 事件管理
- **事件时间线** — 所有操作(创建、添加告警、修改严重性、确认、解决)均记录为带时间戳的事件
- **事件详情视图** — 在一处查看所有关联告警、事件审计追踪和元数据
- **级联操作** — 确认或解决事件会将其所有关联告警一并处理
### 通知渠道(5 种类型)
- **Slack** — 带有严重性颜色编码、告警计数、服务信息和仪表板链接的 Block Kit 格式消息
- **Microsoft Teams** — 通过传入 Webhook 或 Power Automate 工作流 URL 的自适应卡片消息
- **Email** — 通过 SMTP 发送的 HTML 格式事件通知,包含关联告警表格
- **通用 Webhook(出站)** — 包含完整事件和告警数据的 JSON 负载,支持 HMAC 验证的共享密钥和自定义头部
- **PagerDuty** — Events API v2 集成;触发、解决和重复键同步事件到 PagerDuty 服务
- **每通道过滤** — 可按严重性和/或服务过滤通知
- **速率限制** — 每通道、每事件冷却机制防止通知垃圾
- **投递日志** — 每次通知尝试均记录状态(待处理/已发送/失败)和错误详情
- **测试按钮** — 可从 UI 向任意通道发送测试通知
### 静默 / 维护窗口
- **基于时间的抑制** — 定义维护窗口的起始和结束时间
- **灵活的匹配器** — 可按服务(列表)、严重性(列表)或标签键值对匹配
- **AND 逻辑** — 仅当所有匹配器都匹配时,告警才会被抑制
- **CRUD 管理** — 可在 UI 中创建、编辑和查看活动/过期窗口
### 告警增强
- **标签** — 可在 UI 或 API 中添加/移除的自由格式字符串标签;以 JSONB 存储并带有 GIN 索引,支持快速查询
- **调查备注** — 带作者归属和时间戳的备注,支持完整 CRUD
- **外部工单链接** — 可链接至 Jira、GitHub 或任意 URL;若缺少则自动前置 `https://`
- **运行手册 URL** — 可在告警详情面板编辑;可手动粘贴 URL 或通过运行手册规则自动附加
- **运行手册规则** — 基于模式的规则,自动将运行手册 URL 附加到传入告警。定义服务通配符模式(如 `payment-*`)、可选名称模式及带变量(`{service}`、`{host}`、`{name}`、`{environment}`)的 URL 模板。首个匹配规则优先(“另存为规则”复选框可在告警面板一键创建)
- **原始负载** — 保留完整的原始 Webhook 负载用于取证检查
### 告警自动过期
- **可配置的 TTL** — 触发告警在经过可配置的生存时间(默认 24 小时,0 禁用)后自动解决
- **仅管理员控制** — 仅管理员可通过设置运行时调整 TTL;环境变量 `ALERT_TTL_SECONDS` 用于重启后持久化
- **智能排除** — 已确认告警被排除在自动过期之外(表示有人正在处理)
- **新鲜度跟踪** — 重复到达会通过 `last_received_at` 重置过期计时器,确保活跃重复问题保持开启
- **自动过期标签** — 过期告警标记为 `auto-expired`,以区分手动解决
- **级联** — 自动过期告警会触发事件解决并像其他解决一样发送 WebSocket 事件
### 分析仪表板
- **告警流量趋势** — 展示告警摄入速率随时间变化的小时面积图
- **MTTA/MTTR 趋势** — 每日折线图跟踪平均确认时间和解决时间
- **最嘈杂的服务** — 柱状图按告警流量对服务进行排名
- **严重性分布** — 各严重性级别告警的分布
- **时间范围选择器** — 可在 7 天、14 天和 30 天视图间切换
- **集成至统计** — 扩展现有统计视图,无需单独导航
### 心跳 / 死人开关监控
- **死人开关** — 注册预期的检查点;若服务未在间隔 + 宽限期内回信,Solace 会触发告警
- **HTTP 健康检查** — 定期 GET URL;若响应非 2xx 或超时,Solace 会触发告警
- **自动恢复** — 当失败的心跳恢复时,Solace 发送已解决告警以关闭事件
- **完整流水线集成** — 心跳告警经过标准摄入流水线(去重、关联、通知、升级)
- **CRUD 管理** — 可在“心跳”标签页中创建、编辑、删除和监控心跳
- **基于 Slug回信端点** — 死人回信使用 `POST /api/v1/heartbeats/{slug}/ping` 并通过 API 键认证
### 仪表板与 UI
- **亮色与暗色主题** — 在高对比度暗操作控制台主题与简洁亮色主题间切换;偏好保存在 localStorage
- **实时更新** — WebSocket 连接支持自动重连和回退轮询
- **键盘快捷键** — `j`/`k` 导航、`a` 确认、`r` 解决、`Esc` 关闭、`?` 帮助
- **搜索与过滤** — 全文搜索名称、服务、主机、标签,并支持状态/严重性/服务过滤
- **可排序列** — 按时间、严重性、名称、服务、重复计数或状态排序
- **分页** — 可配置页面大小并支持服务端分页
- **统计栏** — 实时统计各状态/严重性下的告警数、事件数、MTTA 和 MTTR
### API 与集成
- **完整 REST API** — 所有功能均可通过 API 访问(告警、事件、静默、通知、待办、统计、设置)
- **OpenAPI 文档** — 在 `/docs` 提供自动生成的 Swagger UI
- **健康检查** — 活跃性(`/health`)与就绪性(`/health/ready`)端点用于 Kubernetes 探针
- **WebSocket 事件** — 实时事件流支持 `alert.created`、`incident.updated`、`incident_created`、`severity_changed`、`incident_resolved`
- **双重认证** — 用户会话使用 JWT 承载令牌,Webhook 摄入和外部集成使用 `X-API-Key` 头
## 架构
```
Prometheus ──┐
Grafana ─────┤ ┌─────────────┐ ┌────────────┐
Datadog ─────┼─▶ Webhook API ──▶ │ Normalizer │ ──▶ │ Dedup │
Splunk ──────┤ (X-API-Key) │ (pluggable) │ │ Engine │
Email ───────┤ └─────────────┘ └─────┬──────┘
Custom ──────┘ │
┌─────▼──────┐
│ Silence │
│ Check │
└─────┬──────┘
│
┌─────▼──────┐ ┌──────────────┐
│ Correlation │──▶ │ Notifications │
│ Engine │ └──────┬───────┘
└─────┬──────┘ │
│ ┌──────▼───────┐
│ │ Escalation │
│ │ Engine │
│ └──────┬───────┘
│ │
┌────────────▼───────────────────▼┐
│ PostgreSQL + Redis │
└────────────┬────────────────────┘
│
┌────────────▼────────────┐
│ React Dashboard (WS) │
│ JWT Auth + RBAC │
│ (Vite + Tailwind) │
└─────────────────────────┘
```
## 快速开始
### Docker Compose(推荐)
```
git clone https://github.com/springdom/solace.git
cd solace
docker compose up --build
```
- **仪表板:** http://localhost:3000
- **API:** http://localhost:8000
- **API 文档:** http://localhost:8000/docs
**默认登录:** `admin` / `admin`(首次登录时会提示修改密码)
### 发送测试告警
```
# 通用 Webhook
curl -X POST http://localhost:8000/api/v1/webhooks/generic \
-H "Content-Type: application/json" \
-d '{
"name": "HighCPU",
"severity": "critical",
"service": "payment-api",
"host": "web-01",
"description": "CPU usage above 95% for 10 minutes",
"tags": ["production", "us-east-1"]
}'
# Prometheus Alertmanager
curl -X POST http://localhost:8000/api/v1/webhooks/prometheus \
-H "Content-Type: application/json" \
-d '{
"version": "4",
"status": "firing",
"alerts": [{
"status": "firing",
"labels": {
"alertname": "DiskFull",
"instance": "db-01:9090",
"job": "postgres",
"severity": "critical"
},
"annotations": {
"summary": "Disk 95% full on db-01"
},
"startsAt": "2024-01-15T10:00:00.000Z",
"endsAt": "0001-01-01T00:00:00Z"
}]
}'
# Grafana 统一告警
curl -X POST http://localhost:8000/api/v1/webhooks/grafana \
-H "Content-Type: application/json" \
-d '{
"alerts": [{
"status": "firing",
"labels": { "alertname": "HighMemory", "grafana_folder": "Infrastructure" },
"annotations": { "summary": "Memory above 90%", "severity": "high" },
"startsAt": "2024-01-15T10:00:00.000Z",
"endsAt": "0001-01-01T00:00:00Z",
"values": { "B": 92.5 }
}]
}'
# Datadog 监控 Webhook
curl -X POST http://localhost:8000/api/v1/webhooks/datadog \
-H "Content-Type: application/json" \
-d '{
"id": "123456789",
"title": "CPU is high on web-01",
"text": "CPU utilization above threshold",
"alert_status": "triggered",
"priority": "P1",
"hostname": "web-01",
"org": { "name": "MyOrg" },
"tags": "env:production,service:payment-api"
}'
# Splunk Webhook 告警
curl -X POST http://localhost:8000/api/v1/webhooks/splunk \
-H "Content-Type: application/json" \
-d '{
"result": {
"host": "web-01",
"severity": "critical",
"service": "payment-api",
"message": "CPU usage above 95% for 10 minutes"
},
"sid": "scheduler_admin_HighCPU_at_17000000_132",
"search_name": "High CPU Usage Alert"
}'
```
### 测试事件关联
来自同一服务的告警会自动归入单个事件:
```
# 这两条告警将被关联为一个事件
curl -X POST http://localhost:8000/api/v1/webhooks/generic \
-H "Content-Type: application/json" \
-d '{"name":"HighCPU","severity":"critical","service":"payment-api","host":"web-01"}'
curl -X POST http://localhost:8000/api/v1/webhooks/generic \
-H "Content-Type: application/json" \
-d '{"name":"HighMemory","severity":"high","service":"payment-api","host":"web-02"}'
# 这将创建一个 SEPARATE 事件(不同服务)
curl -X POST http://localhost:8000/api/v1/webhooks/generic \
-H "Content-Type: application/json" \
-d '{"name":"HighErrorRate","severity":"warning","service":"auth-service"}'
```
### 配置通知渠道
```
# Slack
curl -X POST http://localhost:8000/api/v1/notifications/channels \
-H "Content-Type: application/json" \
-d '{
"name": "Ops Slack",
"channel_type": "slack",
"config": { "webhook_url": "https://hooks.slack.com/services/YOUR/HOOK/URL" },
"filters": { "severity": ["critical", "high"] }
}'
# Microsoft Teams
curl -X POST http://localhost:8000/api/v1/notifications/channels \
-H "Content-Type: application/json" \
-d '{
"name": "DevOps Teams",
"channel_type": "teams",
"config": { "webhook_url": "https://your-org.webhook.office.com/..." },
"filters": { "severity": ["critical"] }
}'
# PagerDuty
curl -X POST http://localhost:8000/api/v1/notifications/channels \
-H "Content-Type: application/json" \
-d '{
"name": "PagerDuty On-Call",
"channel_type": "pagerduty",
"config": { "routing_key": "YOUR_PAGERDUTY_INTEGRATION_KEY" },
"filters": { "severity": ["critical"] }
}'
# 通用出站 Webhook
curl -X POST http://localhost:8000/api/v1/notifications/channels \
-H "Content-Type: application/json" \
-d '{
"name": "Automation Webhook",
"channel_type": "webhook",
"config": {
"webhook_url": "https://your-service.com/hooks/solace",
"secret": "optional-shared-secret",
"headers": { "X-Custom-Header": "value" }
}
}'
```
## API 端点
### 认证
| 方法 | 端点 | 描述 |
|------|------|------|
| `POST` | `/api/v1/auth/login` | 使用用户名/密码登录,返回 JWT |
| `GET` | `/api/v1/auth/me` | 获取当前用户信息 |
| `POST` | `/api/v1/auth/change-password` | 修改密码 |
### 用户(仅管理员)
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/v1/users` | 列出用户 |
| `POST` | `/api/v1/users` | 创建用户 |
| `PUT` | `/api/v1/users/{id}` | 更新用户资料/角色 |
| `POST` | `/api/v1/users/{id}/reset-password` | 重置用户密码 |
| `DELETE` | `/api/v1/users/{id}` | 停用用户 |
### 健康检查
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/health` | 活跃性检查 |
| `GET` | `/health/ready` | 就绪性检查(数据库 + Redis) |
### Webhook(告警摄入)
| 方法 | 端点 | 描述 |
|------|------|------|
| `POST` | `/api/v1/webhooks/generic` | 通用 Webhook |
| `POST` | `/api/v1/webhooks/prometheus` | Prometheus Alertmanager |
| `POST` | `/api/v1/webhooks/grafana` | Grafana 统一告警 |
| `POST` | `/api/v1/webhooks/datadog` | Datadog 监控 Webhook |
| `POST` | `/api/v1/webhooks/splunk` | Splunk 保存的搜索 Webhook |
| `POST` | `/api/v1/webhooks/email_ingest` | 基于 Email 的告警摄入 |
### 告警
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/v1/alerts` | 列出告警(可过滤、排序、分页) |
| `GET` | `/api/v1/alerts/{id}` | 按 ID 获取告警 |
| `POST` | `/api/v1/alerts/{id}/acknowledge` | 确认告警 |
| `POST` | `/api/v1/alerts/{id}/resolve` | 解决告警 |
| `PUT` | `/api/v1/alerts/{id}/tags` | 替换全部标签 |
| `POST` | `/api/v1/alerts/{id}/tags/{tag}` | 添加单个标签 |
| `DELETE` | `/api/v1/alerts/{id}/tags/{tag}` | 移除标签 |
| `GET` | `/api/v1/alerts/{id}/notes` | 列出调查备注 |
| `POST` | `/api/v1/alerts/{id}/notes` | 添加备注 |
| `PUT` | `/api/v1/alerts/notes/{id}` | 编辑备注 |
| `DELETE` | `/api/v1/alerts/notes/{id}` | 删除备注 |
| `GET` | `/api/v1/alerts/{id}/history` | 获取发生时间线 |
| `PUT` | `/api/v1/alerts/{id}/ticket` | 设置外部工单 URL |
| `PUT` | `/api/v1/alerts/{id}/runbook` | 设置运行手册 URL(可选自动创建规则) |
| `POST` | `/api/v1/alerts/bulk/acknowledge` | 批量确认 |
| `POST` | `/api/v1/alerts/bulk/resolve` | 批量解决 |
| `POST` | `/api/v1/alerts/archive` | 归档旧已解决告警 |
### 事件
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/v1/incidents` | 列出事件(可过滤、排序、分页) |
| `GET` | `/api/v1/incidents/{id}` | 获取包含告警与事件时间线的事件 |
| `POST` | `/api/v1/incidents/{id}/acknowledge` | 确认事件及其所有告警 |
| `POST` | `/api/v1/incidents/{id}/resolve` | 解决事件及其所有告警 |
### 静默(维护窗口)
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/v1/silences` | 列出静默窗口(按状态过滤) |
| `POST` | `/api/v1/silences` | 创建静默窗口 |
| `GET` | `/api/v1/silences/{id}` | 获取静默窗口 |
| `PUT` | `/api/v1/silences/{id}` | 更新静默窗口 |
| `DELETE` | `/api/v1/silences/{id}` | 删除静默窗口 |
### 通知渠道
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/v1/notifications/channels` | 列出所有渠道 |
| `POST` | `/api/v1/notifications/channels` | 创建渠道(Slack / Teams / Email / Webhook / PagerDuty) |
| `GET` | `/api/v1/notifications/channels/{id}` | 获取渠道 |
| `PUT` | `/api/v1/notifications/channels/{id}` | 更新渠道 |
| `DELETE` | `/api/v1/notifications/channels/{id}` | 删除渠道 |
| `POST` | `/api/v1/notifications/channels/{id}/test` | 发送测试通知 |
| `GET` | `/api/v1/notifications/logs` | 列出投递日志 |
### 待办轮班
| 方法 | 端点 | 描述 |
|------|------|------|
|GET` | `/api/v1/oncall/schedules` | 列出排班(分页,可按活跃状态过滤) |
| `POST` | `/api/v1/oncall/schedules` | 创建排班(仅管理员) |
| `GET` | `/api/v1/oncall/schedules/{id}` | 获取排班 |
| `PUT` | `/api/v1/oncall/schedules/{id}` | 更新排班(仅管理员) |
| `DELETE` | `/api/v1/oncall/schedules/{id}` | 删除排班(仅管理员) |
| `GET` | `/api/v1/oncall/schedules/{id}/current` | 获取当前值班人员 |
| `POST` | `/api/v1/oncall/schedules/{id}/overrides` | 创建临时覆盖(仅管理员) |
| `DELETE` | `/api/v1/oncall/overrides/{id}` | 删除临时覆盖(仅管理员) |
### 升级策略
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/v1/oncall/policies` | 列出升级策略 |
| `POST` | `/api/v1/oncall/policies` | 创建策略(仅管理员) |
| `GET` | `/api/v1/oncall/policies/{id}` | 获取策略 |
| `PUT` | `/api/v1/oncall/policies/{id}` | 更新策略(仅管理员) |
| `DELETE` | `/api/v1/oncall/policies/{id}` | 删除策略(仅管理员) |
### 服务映射
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/v1/oncall/mappings` | 列出服务到策略的映射 |
| `POST` | `/api/v1/oncall/mappings` | 创建映射(仅管理员) |
| `DELETE` | `/api/v1/oncall/mappings/{id}` | 删除映射(仅管理员) |
### 运行手册规则
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/v1/runbooks/rules` | 列出运行手册规则 |
| `POST` | `/api/v1/runbooks/rules` | 创建规则(仅管理员) |
| `PUT` | `/api/v1/runbooks/rules/{id}` | 更新规则(仅管理员) |
| `DELETE` | `/api/v1/runbooks/rules/{id}` | 删除规则(仅管理员) |
### 统计与设置
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/v1/stats` | 仪表板统计(计数、MTTA、MTTR) |
| `GET` | `/api/v1/stats/trends` | 时间序列分析(告警流量、MTTA/MTTR 每日、顶级服务) |
| `GET` | `/api/v1/settings` | 应用配置(含告警 TTL) |
| `PUT` | `/api/v1/settings/alert-ttl` | 更新告警自动过期 TTL(仅管理员) |
### 心跳
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/v1/heartbeats` | 列出所有心跳 |
| `POST` | `/api/v1/heartbeats` | 创建心跳(仅管理员) |
| `PUT` | `/api/v1/heartbeats/{id}` | 更新心跳(仅管理员) |
| `DELETE` | `/api/v1/heartbeats/{id}` | 删除心跳(仅管理员) |
| `POST` | `/api/v1/heartbeats/{slug}/ping` | 记录死人检查(API 键认证) |
### WebSocket
| 端点 | 描述 |
|------|------|
| `GET /api/v1/ws?token={jwt_or_api_key}` | 实时事件流 |
## 配置
所有设置均可通过环境变量配置:
| 变量 | 默认值 | 描述 |
|------|--------|------|
| `DATABASE_URL` | `postgresql+asyncpg://solace:solace@localhost:5432/solace` | PostgreSQL 连接 |
| `REDIS_URL` | `redis://localhost:6379/0` | Redis 连接 |
| `API_KEY` | `""` | Webhook 摄入的 API 密钥(空值在开发环境中无需认证) |
| `SECRET_KEY` | `change-me-to-a-random-secret-key` | 用于 JWT 签名的密钥 |
| `ADMIN_USERNAME` | `admin` | 默认管理员用户名(首次启动时创建) |
| `ADMIN_PASSWORD` | `admin` | 默认管理员密码 |
| `ADMIN_EMAIL` | `admin@solace.local` | 默认管理员邮箱 |
| `JWT_EXPIRE_MINUTES` | `480` | JWT 令牌有效期(8 小时) |
| `DEDUP_WINDOW_SECONDS` | `300` | 告警去重窗口(5 分钟) |
| `CORRELATION_WINDOW_SECONDS` | `600` | 事件关联窗口(10 分钟) |
| `NOTIFICATION_COOLDOWN_SECONDS` | `300` | 每通道、每事件通知冷却(5 分钟) |
| `SOLACE_DASHBOARD_URL` | `http://localhost:3000` | 仪表板 URL(用于通知链接) |
| `APP_ENV` | `development` | 环境(`development` / `production`) |
| `LOG_LEVEL` | `INFO` | 日志级别 |
| `ALERT_TTL_SECONDS` | `86400` | 触发告警自动过期时间(秒,0 表示禁用,默认 24 小时) |
| `ALERT_EXPIRE_CHECK_INTERVAL_SECONDS` | `60` | 检查过期告警的频率 |
| `HEARTBEAT_CHECK_INTERVAL_SECONDS` | `30` | 心跳监控检查频率 |
| `SMTP_HOST` | `""` | SMTP 服务器地址 |
| `SMTP_PORT` | `587` | SMTP 端口 |
| `SMTP_USER` | `""` | SMTP 用户名 |
| `SMTP_PASSWORD` | `""` | SMTP 密码 |
| `SMTP_USE_TLS` | `true` | 启用 STARTTLS |
| `SMTP_FROM_ADDRESS` | `solace@localhost` | 邮件通知发件人地址 |
## 技术栈
**后端:** Python 3.12+、FastAPI、async SQLAlchemy(asyncpg)、Alembic、PostgreSQL、Redis、python-jose(JWT)、passlib(bcrypt)
**前端:** React 18、TypeScript、Vite、Tailwind CSS、Zustand
**部署:** Docker Compose、Kubernetes 就绪健康探针
## 开发
### 运行测试
```
pip install -e ".[dev]"
pytest tests/ -v
```
### 代码检查(Lint)
```
ruff check backend/
```
### 本地开发(无需 Docker)
```
# 启动 PostgreSQL 和 Redis
# 创建数据库:CREATE DATABASE solace;
# 运行迁移
alembic upgrade head
# 启动 API 服务器
uvicorn backend.main:app --reload --port 8000
# 启动前端(独立终端)
cd frontend && npm install && npm run dev
```
## 路线图
### 已完成
- [x] 多源 Webhook 摄入(通用、Prometheus、Grafana、Datadog、Splunk、Email)
- [x] 基于指纹的去重(可配置窗口)
- [x] 基于服务的事件自动关联
- [x] 完整的告警生命周期(触发、已确认、已解决、已抑制、已归档)
- [x] 事件管理(含审计追踪)
- [x] 通知渠道:Slack、Microsoft Teams、Email、通用 Webhook(出站)、PagerDuty
- [x] 通知过滤、速率限制、投递日志、测试按钮
- [x] 静默 / 维护窗口(支持灵活匹配)
- [x] 告警标签与调查备注
- [x] 外部工单链接(Jira、GitHub 等)
- [x] 运行手册 URL 支持(可编辑 UI 与自动附加规则)
- [x] 批量确认/解决操作
- [x] 归档旧已解决告警
- [x] 仪表板统计(MTTA、MTTR、按状态/严重性计数)
- [x] 实时 WebSocket 更新(含回退轮询)
- [] 键盘快捷键(快速导航)
- [x] 亮色与暗色主题切换
- [x] JWT 认证与默认管理员账户
- [x] 基于角色的访问控制(管理员、用户、查看者)
- [x] 用户管理(创建、编辑、停用)
- [x] 待办轮班(小时/天/周/自定义间隔轮班)
- [x] 临时覆盖值班
- [x] 多级升级策略
- [x] 服务到策略映射(通配符模式与优先级排序)
- [x] 告警自动过期(可配置 TTL,管理员控制)
- [x] 分析仪表板(含时间序列趋势)
- [x] 心跳 / 死人开关监控(HTTP 健康检查)
### 下一步
- [ ] 后台自动升级检查器(未确认时在 N 分钟后自动升级)
- [ ] 单点登录集成(Google、GitHub、SAML)
- [ ] 短信与语音通知(Twilio)
- [ ] 状态页面(公开事件状态)
- [ ] 插件系统(自定义归一化器、通知渠道、增强钩子)
- [ ] 告警模式检测与噪声评分
- [ ] 事后回顾与复盘
- [ ] 拓扑感知关联(服务依赖关系图)
## 许可证
Apache 2.0
标签:API密钥, API集成, DevOps工具, JWT认证, On-call排班, Python, Python 3.12, RBAC, SRE工具, Streamlit, Webhook, 事件生命周期, 仪表盘, 值班轮换, 力导向图, 升级策略, 去重, 可观测性, 告警管理, 告警聚合, 多层次升级, 子域名突变, 安全登录, 密钥轮换, 平台, 开源, 开源替代OpsGenie, 开源替代PagerDuty, 搜索优化, 搜索引擎查询, 故障响应, 无后门, 时区感知, 测试用例, 版权保护, 用户管理, 监控集成, 自动关联, 自托管, 角色权限, 访问控制, 逆向工具, 通知目标, 重复策略