Files
alert-message-center/README.md
d0zingcat b03707a794 init
Signed-off-by: d0zingcat <iamtangli42@gmail.com>
2026-01-09 23:44:05 +08:00

137 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Alert Message Center
这是一个基于 **Bun**, **Hono**, **Drizzle ORM (SQLite)****React (Vite + Tailwind)** 构建的企业级告警管理系统。
它采用 **Topic (主题)** 订阅模型,类似于 Sentry 的告警分发机制。告警发送到特定的 Topic系统根据订阅关系通过 **飞书机器人私聊 (Private Message)** 将告警精准推送给订阅该 Topic 的用户。
## 核心理念
- **Topic (主题)**: 业务逻辑上的告警分类,例如 `payment-service-error`, `frontend-performance`, `daily-report`
- **User (用户)**: 接收告警的实体,绑定飞书 User ID。
- **Subscription (订阅)**: 用户订阅感兴趣的 Topic。
- **Private Message (私聊)**: 告警不再发送到嘈杂的群组,而是直接私聊发送给相关负责人,确保触达。
## 功能特性
- **精准分发**: 告警只发给订阅的人,避免群消息轰炸。
- **集中管理**: 统一管理所有告警入口和订阅关系,无需维护大量硬编码的 Webhook URL。
- **飞书集成**: 使用飞书开放平台 API支持发送富文本和卡片消息。
- **全局监控**: 提供 Grafana 风格的系统负载看板,实时追踪告警接收数、应发消息数及发送成功率。
- **现代化技术栈**: 全栈 TypeScript高性能 Bun 运行时。
## 快速开始
### 1. 前置准备
你需要创建一个飞书企业自建应用 (Custom App)
1. 访问 [飞书开发者后台](https://open.feishu.cn/app)。
2. 创建企业自建应用。
3. **启用机器人能力**: 在 "添加应用能力" -> "机器人" 中启用。
4. **申请权限**: 在 "权限管理" 中申请以下权限:
- `im:message` (获取与发送单聊、群组消息)
- `im:message:send_as_bot` (以应用身份发送消息)
- (可选) `contact:user.id:readonly` (通过手机号或邮箱获取用户 ID)
5. **发布版本**: 创建版本并发布,等待管理员审核通过。
6. 获取 **App ID** and **App Secret**
### 2. 安装依赖
确保你已经安装了 [Bun](https://bun.sh/)。
```bash
# 在根目录运行
bun install
```
### 3. 配置环境变量
`apps/server` 目录下 (或者在启动命令中) 配置环境变量:
```bash
export FEISHU_APP_ID="你的AppID"
export FEISHU_APP_SECRET="你的AppSecret"
```
### 4. 启动开发环境
这将同时启动后端 API (端口 3000) 和前端界面 (端口 5173)。
```bash
bun run dev
```
访问前端界面: [http://localhost:5173](http://localhost:5173)
### 5. 使用指南
#### 第一步:配置 Topic
1. 进入 **Topics** 页面,点击 "Add Topic"。
2. 填写 Name (显示名) 和 Slug (唯一标识,用于 URL)。
* 例如: Name: "支付服务异常", Slug: `payment-error`
#### 第二步:添加用户
1. 进入 **Users** 页面,添加用户。
2. 必须填入用户的 **飞书 User ID** (Open ID 或 User ID)。
* *提示: 可以在飞书管理后台查看用户的 User ID或者通过 API 获取。*
#### 第三步:订阅告警
1. 回到 **Topics** 页面。
2. 点击 Topic 卡片上的 **订阅图标** (用户组图标)。
3. 勾选需要接收该 Topic 告警的用户。
#### 第四步:发送告警
使用你的程序或脚本向系统发送 POST 请求:
**POST** `http://localhost:3000/api/webhook/:slug`
示例 (curl):
```bash
curl -X POST http://localhost:3000/api/webhook/payment-error \
-H "Content-Type: application/json" \
-d '{
"msg_type": "text",
"content": {
"text": "支付接口响应超时 (500ms)"
}
}'
```
系统会查找订阅了 `payment-error` 的所有用户,并通过飞书机器人给他们分别发送私聊消息。
## API 参考
### 发送告警
`POST /api/webhook/:slug`
**Parameters:**
- `slug`: Topic 的唯一标识符。
**Body:**
直接透传给飞书消息 API 的 `content``msg_type`
1. **文本消息**:
```json
{
"msg_type": "text",
"content": {
"text": "告警内容..."
}
}
```
2. **富文本/卡片消息**:
请参考 [飞书发送消息 API 文档](https://open.feishu.cn/document/server-docs/im-v1/message/create) 构建 `content`
## 项目结构
* `apps/server`: 后端服务 (Hono + Drizzle)
* `src/index.ts`: 入口文件
* `src/feishu.ts`: 飞书 API 客户端
* `src/webhook.ts`: 告警处理与分发逻辑
* `src/db`: 数据库 Schema (Topics, Users, Subscriptions)
* `apps/web`: 前端界面 (React + Vite)
* `src/views/SystemLoadView.tsx`: 实时监控仪表盘
* `src/views/AdminView.tsx`: 后台管理与仪表盘集成