Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AlertFlow

AlertFlow 是一个面向运维/SRE 的告警处理与治理平台。第一阶段不负责生产告警规则,而是作为统一 webhook 入口,对不同告警平台推送过来的事件做标准化、去重、聚合、升级和告警风暴控制。

当前定位

  • namespace 作为告警通道空间,为不同 Alertmanager、vmalert 或自定义平台提供独立 webhook 路由。
  • 每个 namespace 独立配置字段映射,把任意 JSON payload 归一化为标准 AlertEvent
  • 策略引擎只依赖核心字段、元信息、labels、annotations、custom 字段和治理 key。
  • dedup_keygroup_keystorm_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.json

Redis 需要精确配置到 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

API 草案

健康检查:

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

docker compose -f deploy/docker-compose.yml up --build

默认会启动:

  • api: AlertFlow Go API
  • frontend: 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

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages