# monitor **Repository Path**: gumpgan/monitor ## Basic Information - **Project Name**: monitor - **Description**: No description available - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-18 - **Last Updated**: 2026-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 监控管理系统(钉钉 / 飞书告警通知) 基于监控架构图生成的**监控管理系统**,聚焦「告警通知」环节:统一管理**钉钉**、**飞书**自定义机器人通知渠道, 支持加签(HMAC-SHA256)、@人、测试发送与告警历史审计。后端 **Go**(Gin + GORM),前端 **Vue3 + Vite + Element Plus**, **前后端分离**。 ## 系统定位 架构图梳理出的监控链路为: ``` 采集层(K8s应用/MySQL/Exporter/SkyWalking) → 采集中心(Python定时任务: collect_data→Redis→metric_data→PushGateway, refresh_consul→Consul) → 存储层(VictoriaMetrics/Redis/Consul/Barry库) → 监控服务(夜莺监控/AlertManager) → 告警发送(钉钉/飞书) ``` 本系统在「**告警发送**」这一环提供统一的通知中枢:与夜莺监控 / AlertManager 对接后,由其触发告警, 本系统负责把告警按已配置的钉钉 / 飞书渠道下发,并记录历史。 ## 技术栈 | 层 | 技术 | | --- | --- | | 后端 | Go 1.21 · Gin · GORM · 纯 Go SQLite(无 CGO) | | 前端 | Vue 3 · Vite · Element Plus · Vue Router · Axios | | 协议 | REST(`/api`)+ JSON;同源可托管构建后的前端 | ## 目录结构 ``` . ├── server/ # Go 后端 │ ├── main.go # 入口:建库/迁移/路由/启动 │ ├── config/ # 配置(环境变量) │ ├── model/ # 数据模型:Channel / AlertRecord │ ├── notify/ # 钉钉、飞书 Webhook 客户端(加签) │ ├── service/ # 渠道 & 告警业务逻辑 │ ├── handler/ # Gin 控制器 │ ├── router/ # 路由 + CORS + 静态托管 │ └── pkg/ # 统一响应 / 工具 └── web/ # Vue3 前端 ├── src/views/ # 渠道管理 / 发送告警 / 告警历史 / 监控架构 └── ... ``` ## 快速开始 ### 1. 启动后端 ```bash cd server export CGO_ENABLED=0 go mod tidy go build -o monitor-server . # 同源托管前端构建产物(可选):STATIC_DIR=../web/dist DB_PATH=monitor.db SERVER_PORT=8080 STATIC_DIR=../web/dist ./monitor-server ``` 后端默认监听 `:8080`,提供 `/api` 接口。 ### 2. 启动前端(开发模式,前后端分离联调) ```bash cd web npm install npm run dev # 默认 http://localhost:5173,已配置 /api 代理到 :8080 ``` 生产部署:先 `npm run build` 生成 `web/dist`,再由后端 `STATIC_DIR=../web/dist` 同源托管, 浏览器直接访问 `http://:8080/` 即可。 ## 核心接口 | 方法 | 路径 | 说明 | | --- | --- | --- | | GET | `/api/channels` | 渠道列表(分页 / 类型 / 关键字过滤) | | POST | `/api/channels` | 新增渠道 | | PUT | `/api/channels/:id` | 更新渠道 | | DELETE | `/api/channels/:id` | 删除渠道 | | POST | `/api/channels/:id/test` | 测试发送(直接验证机器人连通性) | | POST | `/api/alerts/send` | 发送告警(按 ID / 类型 / 全部启用渠道群发) | | GET | `/api/alerts` | 告警历史(分页 / 类型 / 状态过滤) | | GET | `/api/heal/scripts` | 自愈脚本列表 | | POST | `/api/heal/scripts` | 新增自愈脚本 | | PUT | `/api/heal/scripts/:id` | 更新自愈脚本 | | DELETE | `/api/heal/scripts/:id` | 删除自愈脚本(同时清理其历史任务) | | POST | `/api/heal/scripts/:id/execute` | 手动执行脚本,返回任务记录 | | GET | `/api/heal/tasks` | 自愈任务历史(状态 / 触发来源 / 脚本名过滤) | | GET | `/api/datasources` | 数据源列表(分页 / 类型 / 状态 / 关键字过滤) | | GET | `/api/datasources/types` | 获取支持的数据源类型 | | POST | `/api/datasources` | 新增数据源 | | PUT | `/api/datasources/:id` | 更新数据源 | | DELETE | `/api/datasources/:id` | 删除数据源 | | POST | `/api/datasources/:id/toggle` | 切换启用 / 停用状态 | | POST | `/api/datasources/:id/test` | 测试数据源连通性 | | GET | `/api/datasources/:id/query?query=up` | 代理 PromQL 即时查询(仅 Prometheus/VM) | | GET | `/api/datasources/:id/metrics` | 获取指标名列表(仅 Prometheus/VM) | | GET | `/api/alert-rules` | 告警规则列表(分页 / 数据源 / 级别 / 状态 / 关键字) | | GET | `/api/alert-rules/severities` | 告警级别枚举 | | POST | `/api/alert-rules` | 新增告警规则 | | PUT | `/api/alert-rules/:id` | 更新告警规则 | | DELETE | `/api/alert-rules/:id` | 删除告警规则 | | POST | `/api/alert-rules/:id/toggle` | 切换启用 / 停用 | | POST | `/api/alert-rules/:id/clone` | 克隆规则 | | POST | `/api/alert-rules/:id/evaluate` | 单条规则即时评估测试 | ### 发送告警示例 ```bash curl -X POST http://localhost:8080/api/alerts/send \ -H 'Content-Type: application/json' \ -d '{ "title": "订单服务 CPU 过高", "content": "- 主机:10.131.211.18\n- 指标:CPU 92%\n- 时间:2026-08-18 16:00", "level": "critical", "channel_type": "dingtalk" }' ``` `level` 取值:`info`(通知)/ `warning`(警告)/ `critical`(严重)。 `channel_type` 省略则向所有**启用**渠道群发;也可传 `channel_ids: [1,2]` 指定渠道。 ## 告警自愈(脚本 + 历史任务) 参考 Nightingale 的「告警自愈」能力,系统内置自愈脚本管理与执行历史: - **自愈脚本**:支持两种类型 - `shell`:服务端通过 `/bin/sh -c` 执行脚本正文,受 `timeout`(秒)约束; - `http`:向回调地址发送 `POST`(默认)/ `GET` 请求,告警联动时会携带 `{"script","alert_title","target","trigger":"alert"}` JSON 体。 - **手动执行**:在「自愈脚本」页点「执行」即时运行,结果以抽屉展示输出与退出码。 - **告警联动**:发送告警时传 `heal_script_ids: [1,2]`,告警群发完成后**异步**触发对应脚本,生成 `trigger=alert` 的历史任务,可在「历史任务」页按状态 / 触发来源 / 脚本名检索,并查看输出详情。 - **历史任务**字段:任务ID、脚本名、触发来源(手动 / 告警联动)、关联告警、执行对象、状态、退出码/状态码、耗时、起止时间、输出与错误。 > 安全提示:自愈脚本在服务端以 Shell 方式执行,等同于授权运维命令执行能力,请仅在内网可信环境启用,并严格管控脚本的增删改权限。 ## 数据源管理 参考 Nightingale 的「数据源」能力,系统支持统一管理常见监控数据源: | 数据源类型 | 测试连通方式 | 典型地址示例 | | --- | --- | --- | | `prometheus` / `victoriametrics` | GET `/api/v1/status/buildinfo` | `http://prometheus:9090` | | `elasticsearch` | GET `/_cluster/health` | `http://es:9200` | | `loki` | GET `/loki/api/v1/status/buildinfo` | `http://loki:3100` | | `mysql` | TCP 探测端口 | `mysql:3306` 或 `tcp://mysql:3306` | | `skywalking` | GET `/` | `http://skywalking-oap:12800` | - 每种数据源可配置 **名称、地址、关联告警引擎集群、扩展 JSON 配置(认证/索引等)、启用状态**。 - 列表支持按 **类型、状态、关键字** 检索;操作列可一键「测试」连通性、「编辑」、「删除」。 - 状态列使用开关实时切换启用/停用。 ## 数据查询与指标 参考 Nightingale「数据查询」能力: - **即时查询**:选择 Prometheus / VictoriaMetrics 数据源,输入 PromQL,返回 Table / Graph / Raw 三种视图;后端通过 `/api/datasources/:id/query` 代理查询,避免前端跨域与认证泄漏。 - **指标**:从数据源拉取全部指标名(`/api/v1/label/__name__/values`),支持搜索与一键复制,方便写 PromQL 时参考。 ## 告警规则管理 参考 Nightingale「规则管理」能力: - 规则字段:名称、数据源、PromQL、告警级别(info/warning/critical)、阈值条件(> / >= / < / <= / == / !=)、持续触发时长(秒)、标签、注释、说明、启用状态。 - 规则列表:状态、级别、名称、数据源、查询、阈值、持续时长、更新时间、启用开关、操作。 - 操作:测试(单条即时评估)、编辑、克隆、删除。 - 评估逻辑:调用数据源即时查询,提取第一条序列当前值,与阈值比较,返回是否触发、当前值与说明;规则实际周期执行可后续对接 cron/scheduler。 ### 发送告警并联动自愈示例 ```bash curl -X POST http://localhost:8080/api/alerts/send \ -H 'Content-Type: application/json' \ -d '{ "title": "磁盘使用率过高", "content": "主机 10.131.211.18 磁盘 92%", "level": "critical", "channel_type": "dingtalk", "heal_script_ids": [1] }' ``` ## 钉钉 / 飞书配置要点 - **钉钉**:机器人 Webhook 形如 `https://oapi.dingtalk.com/robot/send?access_token=xxx`; 安全设置选「加签」时把 `secret` 填入即可,系统自动计算 `timestamp + sign` 并拼接。 支持 `at_mobiles`(@手机号)与 `is_at_all`(@全员)。 - **飞书**:机器人 Webhook 形如 `https://open.feishu.cn/open-apis/bot/v2/hook/xxx`; 启用签名时填入「签名校验」的 `secret`,系统按 `timestamp + sign`(hex)拼接。 支持 `at_user_ids`(@用户 open_id)与 `is_at_all`。 - 消息格式:钉钉发送 **markdown**,飞书发送 **interactive 卡片**,并按级别着色(蓝/橙/红)。 ## Docker 部署 项目根目录已包含 `Dockerfile`(多阶段构建:前端 Vite → 后端 Go → 精简 alpine 运行镜像)与 `docker-compose.yml`。 ### 方式一:Docker Compose(推荐) ```bash docker compose up -d --build # 构建并启动后访问 http://:8080/ ``` 数据持久化在命名卷 `monitor-data`(SQLite 位于 `/app/data/monitor.db`)。 ### 方式二:手动构建 / 运行 ```bash # 构建镜像 docker build -t monitor-system:latest . # 运行(端口映射 + 数据卷) docker run -d --name monitor-system \ -p 8080:8080 \ -v monitor-data:/app/data \ -e SERVER_PORT=8080 \ -e DB_PATH=/app/data/monitor.db \ -e STATIC_DIR=/app/dist \ monitor-system:latest ``` 镜像内后端以非 root 用户运行,已内置 CA 证书(确保可访问钉钉 / 飞书 HTTPS 接口)与时区数据。 ## 验证情况 - 钉钉客户端实测可达钉钉服务器(返回 `errcode:300005 token is not exist`,报文格式正确)。 - 飞书客户端实测可达飞书服务器(返回 `code:19001 access token invalid`,报文格式正确)。 - 渠道 CRUD、测试发送、群发、历史落库均通过端到端自测。