Skip to content

Commit 855c514

Browse files
committed
feat(告警): 实现告警规则同步功能并重构API层
新增告警规则同步API及服务实现,支持将规则同步到Prometheus并触发重载 重构API层提取公共错误处理和工具方法到通用模块 添加相关模型定义和文档更新
1 parent 48b34b0 commit 855c514

File tree

10 files changed

+672
-237
lines changed

10 files changed

+672
-237
lines changed

docs/prometheus_adapter/README.md

Lines changed: 151 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,70 @@
1-
# Prometheus Adapter 模块文档
1+
# Prometheus Adapter
2+
3+
基于 Prometheus 的指标查询与告警规则同步适配层,提供统一的 REST API:
4+
- 按服务与版本查询任意 Prometheus 指标
5+
- 同步告警规则到 Prometheus 并触发重载
6+
7+
目录
8+
- 概述
9+
- 快速开始
10+
- 架构设计
11+
- API 参考
12+
- 指标查询
13+
- 告警规则同步
14+
- Alertmanager 集成
15+
- 支持的服务
16+
- 错误码
217

318
## 概述
419

5-
Prometheus Adapter 提供从 Prometheus 获取服务指标的 RESTful API 接口。支持按服务名称和版本进行查询。
20+
Prometheus Adapter 作为内部系统与 Prometheus 之间的适配层:
21+
- 向上暴露简洁、统一的 HTTP API
22+
- 向下负责 PromQL 查询与 Prometheus 规则文件管理
623

724
## 架构设计
825

9-
### 模块结构
26+
- 分层设计
27+
- API 层(`internal/prometheus_adapter/api`):HTTP 请求处理、参数校验、错误格式化
28+
- Service 层(`internal/prometheus_adapter/service`):业务逻辑、指标与服务存在性校验、数据装配
29+
- Client 层(`internal/prometheus_adapter/client`):与 Prometheus API 交互、PromQL 构建、结果转换
30+
- Model 层(`internal/prometheus_adapter/model`):统一数据模型、错误类型、常量
1031

32+
- 目录结构
1133
```
1234
internal/prometheus_adapter/
13-
├── server.go # 服务器主入口,负责初始化和生命周期管理
14-
├── api/ # API 层,处理 HTTP 请求
15-
│ ├── api.go # API 基础结构和初始化
16-
│ └── metric_api.go # 指标相关的 API 处理器
17-
├── service/ # 业务逻辑层
18-
│ └── metric_service.go # 指标查询服务实现
19-
├── client/ # Prometheus 客户端
35+
├── server.go # 服务器主入口,负责初始化和生命周期管理
36+
├── api/ # API 层,处理 HTTP 请求
37+
│ ├── api.go # API 基础结构和初始化
38+
│ ├── metric_api.go # 指标相关的 API 处理器
39+
│ └── alert_api.go # 告警规则同步 API 处理器
40+
├── service/ # 业务逻辑层
41+
│ ├── metric_service.go # 指标查询服务实现
42+
│ └── alert_service.go # 告警规则同步服务实现
43+
├── client/ # Prometheus 客户端
2044
│ └── prometheus_client.go # 封装 Prometheus API 调用
21-
└── model/ # 数据模型
22-
├── api.go # API 请求响应模型
23-
├── constants.go # 常量定义(错误码等)
24-
└── error.go # 错误类型定义
45+
└── model/ # 数据模型
46+
├── api.go # API 请求响应模型
47+
├── alert.go # 告警规则模型
48+
├── constants.go # 常量定义(错误码等)
49+
├── error.go # 错误类型定义
50+
└── prometheus.go # Prometheus 规则文件模型
2551
```
2652

27-
### 层次设计
53+
- 核心组件
54+
- PrometheusAdapterServer:初始化客户端与路由,管理服务生命周期
55+
- PrometheusClient:`QueryRange``GetAvailableMetrics``CheckMetricExists``CheckServiceExists``BuildQuery`
56+
- MetricService:参数校验、动态指标发现、错误转换
57+
- AlertService:告警规则同步、Prometheus 规则文件生成、配置重载
2858

29-
1. **API 层** (`api/`)
30-
- 处理 HTTP 请求和响应
31-
- 参数验证和解析
32-
- 错误响应格式化
59+
## API
3360

34-
2. **Service 层** (`service/`)
35-
- 业务逻辑处理
36-
- 指标和服务存在性验证
37-
- 数据转换和组装
61+
### 指标查询
3862

39-
3. **Client 层** (`client/`)
40-
- 与 Prometheus API 交互
41-
- PromQL 查询构建
42-
- 结果数据转换
43-
44-
4. **Model 层** (`model/`)
45-
- 统一的数据模型定义
46-
- 错误类型和错误码
47-
- 请求响应结构体
48-
49-
### 核心组件
50-
51-
#### PrometheusAdapterServer
52-
主服务器组件,负责:
53-
- 初始化 Prometheus 客户端
54-
- 创建服务实例
55-
- 设置 API 路由
56-
- 管理生命周期
57-
58-
#### PrometheusClient
59-
Prometheus 客户端封装,提供:
60-
- `QueryRange`: 执行时间范围查询
61-
- `GetAvailableMetrics`: 获取所有可用指标
62-
- `CheckMetricExists`: 检查指标是否存在
63-
- `CheckServiceExists`: 检查服务是否存在
64-
- `BuildQuery`: 构建 PromQL 查询语句
65-
66-
#### MetricService
67-
业务逻辑服务,实现:
68-
- 动态指标发现
69-
- 查询参数验证
70-
- 错误处理和转换
71-
72-
## 配置说明
73-
74-
### 环境变量
75-
76-
| 变量名 | 说明 | 默认值 |
77-
|--------|------|--------|
78-
| PROMETHEUS_ADDRESS | Prometheus 服务器地址 | http://10.210.10.33:9090 |
79-
80-
## API
81-
82-
### 1. 获取可用指标列表
83-
84-
**GET** `/v1/metrics`
85-
86-
获取所有可用的指标列表。
87-
88-
#### 请求示例
89-
```bash
90-
GET /v1/metrics
63+
1) 获取可用指标列表
64+
- 方法与路径:`GET /v1/metrics`
65+
- 用途:列出当前可查询的所有指标名称
66+
- 响应示例:
9167
```
92-
93-
#### 响应示例
94-
```json
9568
{
9669
"metrics": [
9770
"system_cpu_usage_percent",
@@ -104,69 +77,36 @@ GET /v1/metrics
10477
}
10578
```
10679

107-
### 2. 通用指标查询接口
108-
109-
**GET** `/v1/metrics/:service/:metric`
110-
111-
获取指定服务的任意指标时间序列数据。指标不存在则返回错误。
112-
113-
#### 路径参数
114-
- `service` (string, required): 服务名称
115-
- `metric` (string, required): 指标名称(必须是 Prometheus 中实际存在的指标)
116-
117-
#### 查询参数
118-
- `version` (string, optional): 服务版本,不指定则返回所有版本
119-
- `start` (string, optional): 开始时间 (RFC3339 格式,如: 2024-01-01T00:00:00Z)
120-
- `end` (string, optional): 结束时间 (RFC3339 格式,如: 2024-01-01T01:00:00Z)
121-
- `step` (string, optional): 时间步长 (如: 1m, 5m, 1h),默认 1m
122-
123-
#### 请求示例
124-
125-
1. **查询 CPU 使用率:**
126-
```bash
127-
GET /v1/metrics/metadata-service/system_cpu_usage_percent?version=1.0.0
128-
```
129-
130-
2. **查询内存使用率:**
131-
```bash
132-
GET /v1/metrics/storage-service/system_memory_usage_percent?version=1.0.0
133-
```
134-
135-
3. **查询 HTTP 请求延迟:**
136-
```bash
137-
GET /v1/metrics/storage-service/http_latency?version=1.0.0
80+
2) 查询指定服务的指标时间序列
81+
- 方法与路径:`GET /v1/metrics/{service}/{metric}`
82+
- 路径参数:
83+
- `service`:服务名(必填)
84+
- `metric`:指标名(必填,需为 Prometheus 中存在的指标)
85+
- 查询参数:
86+
- `version`:服务版本(选填;不传则返回所有版本)
87+
- `start`:开始时间(选填,RFC3339)
88+
- `end`:结束时间(选填,RFC3339)
89+
- `step`:步长(选填,如 `1m``5m``1h`;默认 `1m`
90+
- 请求示例:
91+
- `GET /v1/metrics/metadata-service/system_cpu_usage_percent?version=1.0.0`
92+
- `GET /v1/metrics/storage-service/system_memory_usage_percent?version=1.0.0`
93+
- `GET /v1/metrics/storage-service/http_latency?version=1.0.0`
94+
- `GET /v1/metrics/storage-service/system_network_qps?version=1.0.0`
95+
- 成功响应示例:
13896
```
139-
140-
4. **查询网络 QPS:**
141-
```bash
142-
GET /v1/metrics/storage-service/system_network_qps?version=1.0.0
143-
```
144-
145-
#### 成功响应示例
146-
147-
**HTTP 200 OK**
148-
```json
14997
{
15098
"service": "metadata-service",
15199
"version": "1.0.0",
152100
"metric": "system_cpu_usage_percent",
153101
"data": [
154-
{
155-
"timestamp": "2024-01-01T00:00:00Z",
156-
"value": 45.2
157-
},
158-
{
159-
"timestamp": "2024-01-01T00:01:00Z",
160-
"value": 48.5
161-
}
102+
{ "timestamp": "2024-01-01T00:00:00Z", "value": 45.2 },
103+
{ "timestamp": "2024-01-01T00:01:00Z", "value": 48.5 }
162104
]
163105
}
164106
```
165-
166-
#### 错误响应示例
167-
168-
**指标不存在时 - HTTP 404 Not Found**
169-
```json
107+
- 错误响应示例:
108+
- 指标不存在(404):
109+
```
170110
{
171111
"error": {
172112
"code": "METRIC_NOT_FOUND",
@@ -175,9 +115,8 @@ GET /v1/metrics/storage-service/system_network_qps?version=1.0.0
175115
}
176116
}
177117
```
178-
179-
**服务不存在时 - HTTP 404 Not Found**
180-
```json
118+
- 服务不存在(404):
119+
```
181120
{
182121
"error": {
183122
"code": "SERVICE_NOT_FOUND",
@@ -186,9 +125,8 @@ GET /v1/metrics/storage-service/system_network_qps?version=1.0.0
186125
}
187126
}
188127
```
189-
190-
**参数错误时 - HTTP 400 Bad Request**
191-
```json
128+
- 参数错误(400):
129+
```
192130
{
193131
"error": {
194132
"code": "INVALID_PARAMETER",
@@ -199,15 +137,81 @@ GET /v1/metrics/storage-service/system_network_qps?version=1.0.0
199137
}
200138
```
201139

202-
## 实现说明
140+
### 告警规则同步
141+
142+
- 方法与路径:`POST /v1/alert-rules/sync`
143+
- 功能:接收监控告警模块发送的完整规则列表,生成 Prometheus 规则文件并触发重载(全量同步)
144+
- 请求体示例:
145+
```
146+
{
147+
"rules": [
148+
{
149+
"name": "high_cpu_usage",
150+
"description": "CPU使用率过高告警",
151+
"expr": "system_cpu_usage_percent",
152+
"op": ">",
153+
"severity": "warning"
154+
}
155+
],
156+
"rule_metas": [
157+
{
158+
"alert_name": "high_cpu_usage_storage_v1",
159+
"labels": "{\"service\":\"storage-service\",\"version\":\"1.0.0\"}",
160+
"threshold": 90,
161+
"watch_time": 300,
162+
"match_time": "5m"
163+
}
164+
]
165+
}
166+
```
167+
- 响应示例:
168+
```
169+
{
170+
"status": "success",
171+
"message": "Rules synced to Prometheus"
172+
}
173+
```
174+
175+
## Alertmanager 集成
176+
177+
- 目标:将 Prometheus 触发的告警通过 Alertmanager 转发到监控告警模块
178+
- `alertmanager.yml` 配置示例:
179+
```yaml
180+
global:
181+
resolve_timeout: 5m
182+
183+
route:
184+
group_by: ['alertname', 'cluster', 'service']
185+
group_wait: 10s
186+
group_interval: 10s
187+
repeat_interval: 1h
188+
receiver: 'zeroops-alert-webhook'
189+
190+
receivers:
191+
- name: 'zeroops-alert-webhook'
192+
webhook_configs:
193+
- url: 'http://alert-module:8080/v1/integrations/alertmanager/webhook'
194+
send_resolved: true
195+
```
196+
- 说明:
197+
- `url`:监控告警模块的 webhook 地址(按实际部署修改主机与端口)
198+
- `send_resolved`:为 `true` 时,告警恢复也会通知
199+
200+
## 支持的服务
201+
202+
当前 mock/s3 环境下:
203+
- `metadata-service`
204+
- `storage-service`
205+
- `queue-service`
206+
- `third-party-service`(原文为 third-party-servrice,已更正)
207+
- `mock-error-service`
203208

204-
### 支持的服务列表
209+
所有服务的版本信息通过标签 `service_version` 暴露。
205210

206-
当前 mock/s3 环境中支持的服务:
207-
- `metadata-service` - 元数据管理服务
208-
- `storage-service` - 存储服务
209-
- `queue-service` - 消息队列服务
210-
- `third-party-service` - 第三方集成服务
211-
- `mock-error-service` - 错误模拟服务
211+
## 错误码
212212

213-
所有服务的版本信息通过 `service_version` 标签暴露。
213+
- `METRIC_NOT_FOUND`:指标不存在
214+
- `SERVICE_NOT_FOUND`:服务不存在
215+
- `INVALID_PARAMETER`:请求参数不合法(如时间格式不正确)
216+
- `INTERNAL_ERROR`:内部服务器错误
217+
- `PROMETHEUS_ERROR`:Prometheus 查询失败
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package api
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/fox-gonic/fox"
7+
"github.com/qiniu/zeroops/internal/prometheus_adapter/model"
8+
)
9+
10+
// setupAlertRouters 设置告警相关路由
11+
func (api *Api) setupAlertRouters(router *fox.Engine) {
12+
router.POST("/v1/alert-rules/sync", api.SyncRules)
13+
}
14+
15+
// SyncRules 同步规则到Prometheus
16+
// 接收从监控告警模块发来的规则列表,生成Prometheus规则文件并重载配置
17+
func (api *Api) SyncRules(c *fox.Context) {
18+
var req model.SyncRulesRequest
19+
if err := c.ShouldBindJSON(&req); err != nil {
20+
SendErrorResponse(c, http.StatusBadRequest, model.ErrorCodeInvalidParameter,
21+
"Invalid request body: "+err.Error(), nil)
22+
return
23+
}
24+
25+
err := api.alertService.SyncRulesToPrometheus(req.Rules, req.RuleMetas)
26+
if err != nil {
27+
SendErrorResponse(c, http.StatusInternalServerError, model.ErrorCodeInternalError,
28+
"Failed to sync rules to Prometheus: "+err.Error(), nil)
29+
return
30+
}
31+
32+
c.JSON(http.StatusOK, map[string]string{
33+
"status": "success",
34+
"message": "Rules synced to Prometheus",
35+
})
36+
}

0 commit comments

Comments
 (0)