AlertFlow 是一个面向运维/SRE 的告警处理与治理平台。第一阶段不负责生产告警规则,而是作为统一 webhook 入口,对不同告警平台推送过来的事件做标准化、去重、聚合、升级和告警风暴控制。
- 以
namespace作为告警通道空间,为不同 Alertmanager、vmalert 或自定义平台提供独立 webhook 路由。 - 每个
namespace独立配置字段映射,把任意 JSON payload 归一化为标准AlertEvent。 - 策略引擎只依赖核心字段、元信息、labels、annotations、custom 字段和治理 key。
dedup_key、group_key、storm_key通过 namespace 级模板生成,后续所有策略围绕这些 key 工作。
backend/ Go 后端服务,按 DDD 分为 domain/application/infrastructure/interfaces
frontend/ React + TypeScript + Semi Design 控制台
docs/ 产品设计、架构说明和架构图
deploy/ 本地 Docker Compose 部署文件
后端分层:
backend/internal/domain/ 领域模型与领域服务:alert、namespace、normalization、keys
backend/internal/application/ 应用用例:创建 namespace、查询 namespace、接收 webhook
backend/internal/infrastructure/ 基础设施实现:当前是 memory repository,后续替换 MySQL/Redis
backend/internal/interfaces/ 外部接口适配器:HTTP API
backend/internal/config/ 配置加载与校验
先准备配置文件:
cp configs/alertflow.example.json configs/local.jsonRedis 需要精确配置到 DB 序号,默认使用 "db": 99。真实密码只放在本地 configs/local.json,不要提交到仓库。
MySQL 和 Loki 也通过 JSON 配置文件配置,核心参数:
{
"addr": ":8080",
"redis": {
"addr": "127.0.0.1:6379",
"password": "",
"db": 99
},
"loki": {
"enabled": false,
"base_url": "http://127.0.0.1:3100",
"push_path": "/loki/api/v1/push",
"query_range_path": "/loki/api/v1/query_range"
},
"database": {
"driver": "mysql",
"mysql_dsn": "user:password@tcp(host:3306)/alertflow?charset=utf8mb4&parseTime=true&loc=UTC",
"max_idle_conns": 5,
"max_open_conns": 10,
"conn_max_idle_time_sec": 600,
"conn_max_lifetime_sec": 1800,
"ping_timeout_sec": 5,
"startup_max_retries": 10,
"startup_retry_interval_sec": 2
}
}后端:
cd backend
go test ./...
go run ./cmd/alertflow -config ../configs/local.json后端启动必须显式指定 -config,避免没读到配置时误连默认的 localhost。
也可以从项目根目录使用重启脚本:
scripts/restart-backend.sh
scripts/restart-backend.sh configs/local.json
tail -f .tmp/backend.log前端:
cd frontend
npm install
npm run dev打开 http://localhost:5173。
健康检查:
curl http://localhost:8080/healthz创建 namespace:
curl -X POST http://localhost:8080/api/v1/namespaces \
-H 'Content-Type: application/json' \
-d '{
"key": "payment-prod",
"display_name": "支付生产",
"description": "支付生产告警接入空间"
}'发送 webhook:
curl -X POST http://localhost:8080/api/v1/webhooks/payment-prod \
-H 'Content-Type: application/json' \
-d '{
"alarm": { "name": "ApiHighErrorRate" },
"state": "firing",
"level": "critical",
"message": "checkout api error rate is high",
"labels": {
"service": "checkout",
"instance": "checkout-api-1"
}
}'docker compose -f deploy/docker-compose.yml up --build默认会启动:
api: AlertFlow Go APIfrontend: Semi Design 控制台
如果需要启动本地 MySQL/Redis 开发依赖:
docker compose -f deploy/docker-compose.yml --profile local-deps up --build本地 Redis 默认开启 128 个 DB,支持使用 "db": 99。
初始化 SQL 在 deploy/mysql/ 下,按文件名顺序执行。本地配置文件中的 MySQL DSN 会指向目标库,建库建表可执行:
dsn="$(grep -o '"mysql_dsn"[[:space:]]*:[[:space:]]*"[^"]*"' configs/local.json | sed 's/.*"mysql_dsn"[[:space:]]*:[[:space:]]*"//; s/"$//')"
user="${dsn%%:*}"
rest="${dsn#*:}"
pass="${rest%%@tcp*}"
addr="${dsn#*@tcp(}"
addr="${addr%%)*}"
host="${addr%%:*}"
port="${addr##*:}"
db="${dsn#*)/}"
db="${db%%\?*}"
MYSQL_PWD="$pass" mysql -h "$host" -P "$port" -u "$user" \
-e "CREATE DATABASE IF NOT EXISTS \`$db\` CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;"
for file in deploy/mysql/*.sql; do
MYSQL_PWD="$pass" mysql -h "$host" -P "$port" -u "$user" "$db" < "$file"
done