jettask 0.2.23__py3-none-any.whl → 0.2.24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. jettask/__init__.py +2 -0
  2. jettask/cli.py +12 -8
  3. jettask/config/lua_scripts.py +37 -0
  4. jettask/config/nacos_config.py +1 -1
  5. jettask/core/app.py +313 -340
  6. jettask/core/container.py +4 -4
  7. jettask/{persistence → core}/namespace.py +93 -27
  8. jettask/core/task.py +16 -9
  9. jettask/core/unified_manager_base.py +136 -26
  10. jettask/db/__init__.py +67 -0
  11. jettask/db/base.py +137 -0
  12. jettask/{utils/db_connector.py → db/connector.py} +130 -26
  13. jettask/db/models/__init__.py +16 -0
  14. jettask/db/models/scheduled_task.py +196 -0
  15. jettask/db/models/task.py +77 -0
  16. jettask/db/models/task_run.py +85 -0
  17. jettask/executor/__init__.py +0 -15
  18. jettask/executor/core.py +76 -31
  19. jettask/executor/process_entry.py +29 -114
  20. jettask/executor/task_executor.py +4 -0
  21. jettask/messaging/event_pool.py +928 -685
  22. jettask/messaging/scanner.py +30 -0
  23. jettask/persistence/__init__.py +28 -103
  24. jettask/persistence/buffer.py +170 -0
  25. jettask/persistence/consumer.py +330 -249
  26. jettask/persistence/manager.py +304 -0
  27. jettask/persistence/persistence.py +391 -0
  28. jettask/scheduler/__init__.py +15 -3
  29. jettask/scheduler/{task_crud.py → database.py} +61 -57
  30. jettask/scheduler/loader.py +2 -2
  31. jettask/scheduler/{scheduler_coordinator.py → manager.py} +23 -6
  32. jettask/scheduler/models.py +14 -10
  33. jettask/scheduler/schedule.py +166 -0
  34. jettask/scheduler/scheduler.py +12 -11
  35. jettask/schemas/__init__.py +50 -1
  36. jettask/schemas/backlog.py +43 -6
  37. jettask/schemas/namespace.py +70 -19
  38. jettask/schemas/queue.py +19 -3
  39. jettask/schemas/responses.py +493 -0
  40. jettask/task/__init__.py +0 -2
  41. jettask/task/router.py +3 -0
  42. jettask/test_connection_monitor.py +1 -1
  43. jettask/utils/__init__.py +7 -5
  44. jettask/utils/db_init.py +8 -4
  45. jettask/utils/namespace_dep.py +167 -0
  46. jettask/utils/queue_matcher.py +186 -0
  47. jettask/utils/rate_limit/concurrency_limiter.py +7 -1
  48. jettask/utils/stream_backlog.py +1 -1
  49. jettask/webui/__init__.py +0 -1
  50. jettask/webui/api/__init__.py +4 -4
  51. jettask/webui/api/alerts.py +806 -71
  52. jettask/webui/api/example_refactored.py +400 -0
  53. jettask/webui/api/namespaces.py +390 -45
  54. jettask/webui/api/overview.py +300 -54
  55. jettask/webui/api/queues.py +971 -267
  56. jettask/webui/api/scheduled.py +1249 -56
  57. jettask/webui/api/settings.py +129 -7
  58. jettask/webui/api/workers.py +442 -0
  59. jettask/webui/app.py +46 -2329
  60. jettask/webui/middleware/__init__.py +6 -0
  61. jettask/webui/middleware/namespace_middleware.py +135 -0
  62. jettask/webui/services/__init__.py +146 -0
  63. jettask/webui/services/heartbeat_service.py +251 -0
  64. jettask/webui/services/overview_service.py +60 -51
  65. jettask/webui/services/queue_monitor_service.py +426 -0
  66. jettask/webui/services/redis_monitor_service.py +87 -0
  67. jettask/webui/services/settings_service.py +174 -111
  68. jettask/webui/services/task_monitor_service.py +222 -0
  69. jettask/webui/services/timeline_pg_service.py +452 -0
  70. jettask/webui/services/timeline_service.py +189 -0
  71. jettask/webui/services/worker_monitor_service.py +467 -0
  72. jettask/webui/utils/__init__.py +11 -0
  73. jettask/webui/utils/time_utils.py +122 -0
  74. jettask/worker/lifecycle.py +8 -2
  75. {jettask-0.2.23.dist-info → jettask-0.2.24.dist-info}/METADATA +1 -1
  76. jettask-0.2.24.dist-info/RECORD +142 -0
  77. jettask/executor/executor.py +0 -338
  78. jettask/persistence/backlog_monitor.py +0 -567
  79. jettask/persistence/base.py +0 -2334
  80. jettask/persistence/db_manager.py +0 -516
  81. jettask/persistence/maintenance.py +0 -81
  82. jettask/persistence/message_consumer.py +0 -259
  83. jettask/persistence/models.py +0 -49
  84. jettask/persistence/offline_recovery.py +0 -196
  85. jettask/persistence/queue_discovery.py +0 -215
  86. jettask/persistence/task_persistence.py +0 -218
  87. jettask/persistence/task_updater.py +0 -583
  88. jettask/scheduler/add_execution_count.sql +0 -11
  89. jettask/scheduler/add_priority_field.sql +0 -26
  90. jettask/scheduler/add_scheduler_id.sql +0 -25
  91. jettask/scheduler/add_scheduler_id_index.sql +0 -10
  92. jettask/scheduler/make_scheduler_id_required.sql +0 -28
  93. jettask/scheduler/migrate_interval_seconds.sql +0 -9
  94. jettask/scheduler/performance_optimization.sql +0 -45
  95. jettask/scheduler/run_scheduler.py +0 -186
  96. jettask/scheduler/schema.sql +0 -84
  97. jettask/task/task_executor.py +0 -318
  98. jettask/webui/api/analytics.py +0 -323
  99. jettask/webui/config.py +0 -90
  100. jettask/webui/models/__init__.py +0 -3
  101. jettask/webui/models/namespace.py +0 -63
  102. jettask/webui/namespace_manager/__init__.py +0 -10
  103. jettask/webui/namespace_manager/multi.py +0 -593
  104. jettask/webui/namespace_manager/unified.py +0 -193
  105. jettask/webui/run.py +0 -46
  106. jettask-0.2.23.dist-info/RECORD +0 -145
  107. {jettask-0.2.23.dist-info → jettask-0.2.24.dist-info}/WHEEL +0 -0
  108. {jettask-0.2.23.dist-info → jettask-0.2.24.dist-info}/entry_points.txt +0 -0
  109. {jettask-0.2.23.dist-info → jettask-0.2.24.dist-info}/licenses/LICENSE +0 -0
  110. {jettask-0.2.23.dist-info → jettask-0.2.24.dist-info}/top_level.txt +0 -0
@@ -13,19 +13,63 @@ router = APIRouter(prefix="/alerts", tags=["alerts"])
13
13
  logger = logging.getLogger(__name__)
14
14
 
15
15
 
16
- @router.get("/rules")
16
+ @router.get(
17
+ "/rules",
18
+ summary="获取告警规则列表",
19
+ description="分页获取系统中配置的所有告警规则,支持按激活状态筛选",
20
+ responses={
21
+ 200: {
22
+ "description": "成功返回告警规则列表"
23
+ },
24
+ 500: {
25
+ "description": "服务器内部错误",
26
+ "content": {
27
+ "application/json": {
28
+ "example": {"detail": "获取告警规则列表失败: Database error"}
29
+ }
30
+ }
31
+ }
32
+ }
33
+ )
17
34
  async def get_alert_rules(
18
- page: int = Query(1, ge=1),
19
- page_size: int = Query(20, ge=1, le=100),
20
- is_active: Optional[bool] = None
35
+ page: int = Query(1, ge=1, description="页码,从 1 开始", example=1),
36
+ page_size: int = Query(20, ge=1, le=100, description="每页数量,范围 1-100", example=20),
37
+ is_active: Optional[bool] = Query(None, description="是否只返回激活的规则", example=True)
21
38
  ):
22
39
  """
23
- 获取告警规则列表
24
-
25
- Args:
26
- page: 页码(从1开始)
27
- page_size: 每页数量
28
- is_active: 是否只返回激活的规则
40
+ ## 获取告警规则列表
41
+
42
+ 分页获取系统中配置的所有告警规则,每个规则包含监控指标、阈值、告警级别等完整信息。
43
+
44
+ **功能说明**:
45
+ - 支持分页查询,避免一次返回过多数据
46
+ - 可按激活状态筛选规则
47
+ - 返回每个规则的完整配置和状态信息
48
+
49
+ **返回信息包括**:
50
+ - 规则基本信息(ID、名称、描述)
51
+ - 监控指标类型和阈值
52
+ - 比较操作符和评估窗口
53
+ - 告警级别和通知渠道
54
+ - 启用状态和创建时间
55
+
56
+ **使用场景**:
57
+ - 告警规则管理页面
58
+ - 告警配置概览
59
+ - 规则状态监控
60
+
61
+ **示例请求**:
62
+ ```bash
63
+ # 获取第一页的告警规则列表
64
+ curl -X GET "http://localhost:8001/api/v1/alerts/rules?page=1&page_size=20"
65
+
66
+ # 只获取激活的告警规则
67
+ curl -X GET "http://localhost:8001/api/v1/alerts/rules?is_active=true"
68
+ ```
69
+
70
+ **注意事项**:
71
+ - 分页参数超出范围时返回空列表
72
+ - 返回的规则按创建时间倒序排列
29
73
  """
30
74
  try:
31
75
  return AlertService.get_alert_rules(page, page_size, is_active)
@@ -34,13 +78,112 @@ async def get_alert_rules(
34
78
  raise HTTPException(status_code=500, detail=str(e))
35
79
 
36
80
 
37
- @router.post("/rules", status_code=201)
81
+ @router.post(
82
+ "/rules",
83
+ summary="创建告警规则",
84
+ description="创建一个新的告警规则,用于监控系统指标并在达到阈值时触发告警",
85
+ status_code=201,
86
+ responses={
87
+ 201: {
88
+ "description": "告警规则创建成功"
89
+ },
90
+ 400: {
91
+ "description": "请求参数错误",
92
+ "content": {
93
+ "application/json": {
94
+ "example": {"detail": "规则名称已存在"}
95
+ }
96
+ }
97
+ },
98
+ 500: {
99
+ "description": "服务器内部错误"
100
+ }
101
+ }
102
+ )
38
103
  async def create_alert_rule(request: AlertRuleRequest):
39
104
  """
40
- 创建告警规则
41
-
42
- Args:
43
- request: 告警规则请求数据
105
+ ## 创建告警规则
106
+
107
+ 创建一个新的告警规则,用于监控系统指标(如任务失败率、队列积压等)并在达到阈值时触发告警通知。
108
+
109
+ **请求体参数**:
110
+ ```json
111
+ {
112
+ "rule_name": "任务失败率告警",
113
+ "metric_type": "task_failure_rate",
114
+ "threshold": 0.1,
115
+ "operator": "gt",
116
+ "duration": 300,
117
+ "severity": "high",
118
+ "enabled": true,
119
+ "description": "当任务失败率超过10%时触发告警"
120
+ }
121
+ ```
122
+
123
+ **指标类型 (metric_type)**:
124
+ - `task_failure_rate`: 任务失败率
125
+ - `queue_backlog`: 队列积压数量
126
+ - `worker_health`: Worker 健康状态
127
+ - `task_execution_time`: 任务执行时间
128
+ - `memory_usage`: 内存使用率
129
+ - `cpu_usage`: CPU 使用率
130
+
131
+ **比较操作符 (operator)**:
132
+ - `gt`: 大于 (>)
133
+ - `gte`: 大于等于 (>=)
134
+ - `lt`: 小于 (<)
135
+ - `lte`: 小于等于 (<=)
136
+ - `eq`: 等于 (==)
137
+ - `ne`: 不等于 (!=)
138
+
139
+ **告警级别 (severity)**:
140
+ - `low`: 低级告警(提示性信息)
141
+ - `medium`: 中级告警(需要关注)
142
+ - `high`: 高级告警(需要及时处理)
143
+ - `critical`: 严重告警(需要立即处理)
144
+
145
+ **使用场景**:
146
+ - 监控任务执行健康度
147
+ - 监控系统资源使用情况
148
+ - 及时发现异常状态
149
+ - 预防性运维
150
+
151
+ **示例请求**:
152
+ ```bash
153
+ # 创建任务失败率告警
154
+ curl -X POST "http://localhost:8001/api/v1/alerts/rules" \\
155
+ -H "Content-Type: application/json" \\
156
+ -d '{
157
+ "rule_name": "任务失败率告警",
158
+ "metric_type": "task_failure_rate",
159
+ "threshold": 0.1,
160
+ "operator": "gt",
161
+ "duration": 300,
162
+ "severity": "high",
163
+ "enabled": true,
164
+ "description": "当任务失败率超过10%且持续5分钟时触发告警"
165
+ }'
166
+
167
+ # 创建队列积压告警
168
+ curl -X POST "http://localhost:8001/api/v1/alerts/rules" \\
169
+ -H "Content-Type: application/json" \\
170
+ -d '{
171
+ "rule_name": "队列积压告警",
172
+ "metric_type": "queue_backlog",
173
+ "threshold": 1000,
174
+ "operator": "gte",
175
+ "duration": 600,
176
+ "severity": "medium",
177
+ "enabled": true,
178
+ "description": "当队列积压任务数超过1000且持续10分钟时告警"
179
+ }'
180
+ ```
181
+
182
+ **注意事项**:
183
+ - 规则名称必须唯一
184
+ - duration 参数表示持续时间(秒),指标需要持续满足条件才会触发告警
185
+ - 创建后规则默认启用,可以通过 toggle 接口禁用
186
+ - 建议根据实际业务场景合理设置阈值,避免告警过于频繁
44
187
  """
45
188
  try:
46
189
  return AlertService.create_alert_rule(request)
@@ -51,14 +194,92 @@ async def create_alert_rule(request: AlertRuleRequest):
51
194
  raise HTTPException(status_code=500, detail=str(e))
52
195
 
53
196
 
54
- @router.put("/rules/{rule_id}")
197
+ @router.put(
198
+ "/rules/{rule_id}",
199
+ summary="更新告警规则",
200
+ description="更新指定告警规则的配置信息,包括阈值、告警级别等",
201
+ responses={
202
+ 200: {
203
+ "description": "告警规则更新成功"
204
+ },
205
+ 400: {
206
+ "description": "请求参数错误",
207
+ "content": {
208
+ "application/json": {
209
+ "example": {"detail": "配置参数无效"}
210
+ }
211
+ }
212
+ },
213
+ 404: {
214
+ "description": "告警规则不存在",
215
+ "content": {
216
+ "application/json": {
217
+ "example": {"detail": "告警规则 'xxx' 不存在"}
218
+ }
219
+ }
220
+ },
221
+ 500: {
222
+ "description": "服务器内部错误"
223
+ }
224
+ }
225
+ )
55
226
  async def update_alert_rule(rule_id: str, request: AlertRuleRequest):
56
227
  """
57
- 更新告警规则
58
-
59
- Args:
60
- rule_id: 规则ID
61
- request: 告警规则请求数据
228
+ ## 更新告警规则
229
+
230
+ 更新指定告警规则的配置信息,可以修改监控指标、阈值、告警级别等所有字段。
231
+
232
+ **请求体参数**:
233
+ ```json
234
+ {
235
+ "rule_name": "任务失败率告警(已更新)",
236
+ "metric_type": "task_failure_rate",
237
+ "threshold": 0.15,
238
+ "operator": "gt",
239
+ "duration": 600,
240
+ "severity": "critical",
241
+ "enabled": true,
242
+ "description": "更新后的描述信息"
243
+ }
244
+ ```
245
+
246
+ **可更新的字段**:
247
+ - 规则名称和描述
248
+ - 监控指标类型
249
+ - 告警阈值
250
+ - 比较操作符
251
+ - 持续时间
252
+ - 告警级别
253
+ - 启用状态
254
+
255
+ **使用场景**:
256
+ - 调整告警阈值
257
+ - 修改告警级别
258
+ - 更新规则描述
259
+ - 优化告警策略
260
+
261
+ **示例请求**:
262
+ ```bash
263
+ # 更新告警阈值和级别
264
+ curl -X PUT "http://localhost:8001/api/v1/alerts/rules/rule-123" \\
265
+ -H "Content-Type: application/json" \\
266
+ -d '{
267
+ "rule_name": "任务失败率告警",
268
+ "metric_type": "task_failure_rate",
269
+ "threshold": 0.15,
270
+ "operator": "gt",
271
+ "duration": 600,
272
+ "severity": "critical",
273
+ "enabled": true,
274
+ "description": "提高阈值到15%,延长持续时间到10分钟"
275
+ }'
276
+ ```
277
+
278
+ **注意事项**:
279
+ - 更新规则会立即生效
280
+ - 如果规则正在触发告警,更新后会重新评估
281
+ - 建议更新前先测试新的配置是否合理
282
+ - 所有字段都必须提供(完整更新)
62
283
  """
63
284
  try:
64
285
  return AlertService.update_alert_rule(rule_id, request)
@@ -69,13 +290,58 @@ async def update_alert_rule(rule_id: str, request: AlertRuleRequest):
69
290
  raise HTTPException(status_code=500, detail=str(e))
70
291
 
71
292
 
72
- @router.delete("/rules/{rule_id}")
293
+ @router.delete(
294
+ "/rules/{rule_id}",
295
+ summary="删除告警规则",
296
+ description="删除指定的告警规则,删除后将停止监控该规则",
297
+ responses={
298
+ 200: {
299
+ "description": "告警规则删除成功",
300
+ "content": {
301
+ "application/json": {
302
+ "example": {"success": True, "message": "告警规则已删除"}
303
+ }
304
+ }
305
+ },
306
+ 404: {
307
+ "description": "告警规则不存在",
308
+ "content": {
309
+ "application/json": {
310
+ "example": {"detail": "告警规则 'xxx' 不存在"}
311
+ }
312
+ }
313
+ },
314
+ 500: {
315
+ "description": "服务器内部错误"
316
+ }
317
+ }
318
+ )
73
319
  async def delete_alert_rule(rule_id: str):
74
320
  """
75
- 删除告警规则
76
-
77
- Args:
78
- rule_id: 规则ID
321
+ ## 删除告警规则
322
+
323
+ 删除指定的告警规则,删除后将停止对该指标的监控和告警。
324
+
325
+ **删除规则**:
326
+ - 删除操作不可逆,请谨慎操作
327
+ - 删除后会停止该规则的所有监控
328
+ - 历史告警记录会保留
329
+
330
+ **使用场景**:
331
+ - 清理不再需要的告警规则
332
+ - 移除过时的监控指标
333
+ - 告警策略调整
334
+
335
+ **示例请求**:
336
+ ```bash
337
+ curl -X DELETE "http://localhost:8001/api/v1/alerts/rules/rule-123"
338
+ ```
339
+
340
+ **注意事项**:
341
+ - 删除规则会停止该规则的监控,但不会删除历史告警记录
342
+ - 如果规则正在触发告警,删除后告警将自动解除
343
+ - 建议删除前先禁用规则,观察一段时间再删除
344
+ - 删除操作不可恢复,重要规则建议先导出备份
79
345
  """
80
346
  try:
81
347
  return AlertService.delete_alert_rule(rule_id)
@@ -86,13 +352,69 @@ async def delete_alert_rule(rule_id: str):
86
352
  raise HTTPException(status_code=500, detail=str(e))
87
353
 
88
354
 
89
- @router.post("/rules/{rule_id}/toggle")
355
+ @router.post(
356
+ "/rules/{rule_id}/toggle",
357
+ summary="启用/禁用告警规则",
358
+ description="切换告警规则的启用状态,禁用后将暂停监控",
359
+ responses={
360
+ 200: {
361
+ "description": "告警规则状态切换成功",
362
+ "content": {
363
+ "application/json": {
364
+ "example": {"success": True, "enabled": True, "message": "告警规则已启用"}
365
+ }
366
+ }
367
+ },
368
+ 404: {
369
+ "description": "告警规则不存在",
370
+ "content": {
371
+ "application/json": {
372
+ "example": {"detail": "告警规则 'xxx' 不存在"}
373
+ }
374
+ }
375
+ },
376
+ 500: {
377
+ "description": "服务器内部错误"
378
+ }
379
+ }
380
+ )
90
381
  async def toggle_alert_rule(rule_id: str):
91
382
  """
92
- 启用/禁用告警规则
93
-
94
- Args:
95
- rule_id: 规则ID
383
+ ## 启用/禁用告警规则
384
+
385
+ 切换告警规则的启用状态。禁用后规则将暂停监控,不会触发新的告警;启用后恢复监控。
386
+
387
+ **功能说明**:
388
+ - 如果规则当前是启用状态,则禁用
389
+ - 如果规则当前是禁用状态,则启用
390
+ - 切换操作立即生效
391
+
392
+ **使用场景**:
393
+ - 临时停止某个告警规则的监控
394
+ - 系统维护期间暂停告警
395
+ - 测试和调试时快速切换规则状态
396
+ - 避免告警风暴时临时关闭规则
397
+
398
+ **示例请求**:
399
+ ```bash
400
+ # 切换告警规则状态
401
+ curl -X POST "http://localhost:8001/api/v1/alerts/rules/rule-123/toggle"
402
+ ```
403
+
404
+ **返回示例**:
405
+ ```json
406
+ {
407
+ "success": true,
408
+ "enabled": false,
409
+ "message": "告警规则已禁用"
410
+ }
411
+ ```
412
+
413
+ **注意事项**:
414
+ - 禁用规则后,正在触发的告警不会自动解除
415
+ - 启用规则后会立即开始监控,可能会立即触发告警
416
+ - 建议在系统维护期间临时禁用告警规则
417
+ - 禁用状态会持久化保存,需要手动重新启用
96
418
  """
97
419
  try:
98
420
  return AlertService.toggle_alert_rule(rule_id)
@@ -103,19 +425,85 @@ async def toggle_alert_rule(rule_id: str):
103
425
  raise HTTPException(status_code=500, detail=str(e))
104
426
 
105
427
 
106
- @router.get("/rules/{rule_id}/history")
428
+ @router.get(
429
+ "/rules/{rule_id}/history",
430
+ summary="获取告警触发历史",
431
+ description="分页获取指定告警规则的历史触发记录",
432
+ responses={
433
+ 200: {
434
+ "description": "成功返回告警历史记录"
435
+ },
436
+ 404: {
437
+ "description": "告警规则不存在",
438
+ "content": {
439
+ "application/json": {
440
+ "example": {"detail": "告警规则 'xxx' 不存在"}
441
+ }
442
+ }
443
+ },
444
+ 500: {
445
+ "description": "服务器内部错误"
446
+ }
447
+ }
448
+ )
107
449
  async def get_alert_history(
108
450
  rule_id: str,
109
- page: int = Query(1, ge=1),
110
- page_size: int = Query(20, ge=1, le=100)
451
+ page: int = Query(1, ge=1, description="页码,从 1 开始", example=1),
452
+ page_size: int = Query(20, ge=1, le=100, description="每页数量,范围 1-100", example=20)
111
453
  ):
112
454
  """
113
- 获取告警触发历史
114
-
115
- Args:
116
- rule_id: 规则ID
117
- page: 页码(从1开始)
118
- page_size: 每页数量
455
+ ## 获取告警触发历史
456
+
457
+ 分页获取指定告警规则的历史触发记录,用于分析告警趋势和问题排查。
458
+
459
+ **返回信息包括**:
460
+ - 告警触发时间
461
+ - 告警级别
462
+ - 触发时的指标值
463
+ - 告警状态(活跃/已解决/已确认)
464
+ - 持续时间
465
+ - 解决时间和解决说明
466
+
467
+ **使用场景**:
468
+ - 分析告警触发频率和趋势
469
+ - 排查系统问题
470
+ - 评估告警规则的合理性
471
+ - 生成告警报告
472
+
473
+ **示例请求**:
474
+ ```bash
475
+ # 获取告警规则的历史记录
476
+ curl -X GET "http://localhost:8001/api/v1/alerts/rules/rule-123/history?page=1&page_size=20"
477
+ ```
478
+
479
+ **返回示例**:
480
+ ```json
481
+ {
482
+ "success": true,
483
+ "data": {
484
+ "total": 45,
485
+ "page": 1,
486
+ "page_size": 20,
487
+ "items": [
488
+ {
489
+ "id": "alert-001",
490
+ "triggered_at": "2025-10-19T10:30:00Z",
491
+ "resolved_at": "2025-10-19T10:45:00Z",
492
+ "severity": "high",
493
+ "metric_value": 0.18,
494
+ "threshold": 0.1,
495
+ "status": "resolved",
496
+ "duration": 900
497
+ }
498
+ ]
499
+ }
500
+ }
501
+ ```
502
+
503
+ **注意事项**:
504
+ - 历史记录按触发时间倒序排列(最新的在前)
505
+ - 包含已解决和未解决的所有告警记录
506
+ - 可用于统计分析和问题排查
119
507
  """
120
508
  try:
121
509
  return AlertService.get_alert_history(rule_id, page, page_size)
@@ -126,13 +514,72 @@ async def get_alert_history(
126
514
  raise HTTPException(status_code=500, detail=str(e))
127
515
 
128
516
 
129
- @router.post("/rules/{rule_id}/test")
517
+ @router.post(
518
+ "/rules/{rule_id}/test",
519
+ summary="测试告警规则",
520
+ description="测试告警规则的通知功能,发送测试告警消息",
521
+ responses={
522
+ 200: {
523
+ "description": "测试通知发送成功",
524
+ "content": {
525
+ "application/json": {
526
+ "example": {"success": True, "message": "测试通知已发送"}
527
+ }
528
+ }
529
+ },
530
+ 404: {
531
+ "description": "告警规则不存在",
532
+ "content": {
533
+ "application/json": {
534
+ "example": {"detail": "告警规则 'xxx' 不存在"}
535
+ }
536
+ }
537
+ },
538
+ 500: {
539
+ "description": "服务器内部错误"
540
+ }
541
+ }
542
+ )
130
543
  async def test_alert_rule(rule_id: str):
131
544
  """
132
- 测试告警规则(发送测试通知)
133
-
134
- Args:
135
- rule_id: 规则ID
545
+ ## 测试告警规则
546
+
547
+ 测试告警规则的通知功能,向配置的通知渠道发送测试告警消息,用于验证告警配置是否正确。
548
+
549
+ **功能说明**:
550
+ - 发送测试告警消息到配置的通知渠道
551
+ - 验证通知渠道是否配置正确
552
+ - 不会创建真实的告警记录
553
+ - 测试消息会标注为"测试告警"
554
+
555
+ **使用场景**:
556
+ - 验证告警规则配置是否正确
557
+ - 测试通知渠道是否可用
558
+ - 检查告警消息格式
559
+ - 新建规则后的功能验证
560
+
561
+ **示例请求**:
562
+ ```bash
563
+ # 测试告警规则
564
+ curl -X POST "http://localhost:8001/api/v1/alerts/rules/rule-123/test"
565
+ ```
566
+
567
+ **返回示例**:
568
+ ```json
569
+ {
570
+ "success": true,
571
+ "message": "测试通知已发送",
572
+ "channels": ["email", "webhook"],
573
+ "test_time": "2025-10-19T10:30:00Z"
574
+ }
575
+ ```
576
+
577
+ **注意事项**:
578
+ - 测试通知会实际发送到配置的通知渠道
579
+ - 如果通知渠道未配置,测试会失败
580
+ - 测试不会触发真实的告警流程
581
+ - 建议在规则创建或修改后进行测试
582
+ - 频繁测试可能会导致通知渠道限流
136
583
  """
137
584
  try:
138
585
  return AlertService.test_alert_rule(rule_id)
@@ -145,15 +592,83 @@ async def test_alert_rule(rule_id: str):
145
592
 
146
593
  # ============ 告警统计接口 ============
147
594
 
148
- @router.get("/statistics")
595
+ @router.get(
596
+ "/statistics",
597
+ summary="获取告警统计信息",
598
+ description="获取告警系统的统计数据,包括告警数量、级别分布等",
599
+ responses={
600
+ 200: {
601
+ "description": "成功返回告警统计信息"
602
+ },
603
+ 500: {
604
+ "description": "服务器内部错误",
605
+ "content": {
606
+ "application/json": {
607
+ "example": {"detail": "获取告警统计信息失败: Database error"}
608
+ }
609
+ }
610
+ }
611
+ }
612
+ )
149
613
  async def get_alert_statistics(
150
- namespace: Optional[str] = Query(None, description="命名空间名称")
614
+ namespace: Optional[str] = Query(None, description="命名空间名称,不指定则统计所有命名空间", example="default")
151
615
  ):
152
616
  """
153
- 获取告警统计信息
154
-
155
- Args:
156
- namespace: 命名空间名称(可选)
617
+ ## 获取告警统计信息
618
+
619
+ 获取告警系统的统计数据,包括总告警数、活跃告警数、按级别分类的告警数等,用于监控和分析。
620
+
621
+ **返回信息包括**:
622
+ - 总告警数量
623
+ - 活跃告警数量
624
+ - 已解决告警数量
625
+ - 按级别分类的告警数(critical、high、medium、low)
626
+ - 近24小时告警趋势
627
+ - 告警规则总数
628
+
629
+ **使用场景**:
630
+ - 告警监控仪表板
631
+ - 系统健康度评估
632
+ - 告警趋势分析
633
+ - 运维报表生成
634
+
635
+ **示例请求**:
636
+ ```bash
637
+ # 获取所有命名空间的告警统计
638
+ curl -X GET "http://localhost:8001/api/v1/alerts/statistics"
639
+
640
+ # 获取指定命名空间的告警统计
641
+ curl -X GET "http://localhost:8001/api/v1/alerts/statistics?namespace=default"
642
+ ```
643
+
644
+ **返回示例**:
645
+ ```json
646
+ {
647
+ "success": true,
648
+ "data": {
649
+ "total_alerts": 156,
650
+ "active_alerts": 12,
651
+ "resolved_alerts": 144,
652
+ "critical_alerts": 3,
653
+ "high_alerts": 5,
654
+ "medium_alerts": 4,
655
+ "low_alerts": 0,
656
+ "total_rules": 8,
657
+ "active_rules": 6,
658
+ "alert_trend_24h": {
659
+ "00:00": 2,
660
+ "01:00": 1,
661
+ "02:00": 0,
662
+ ...
663
+ }
664
+ }
665
+ }
666
+ ```
667
+
668
+ **注意事项**:
669
+ - 如果不指定命名空间,返回所有命名空间的汇总统计
670
+ - 统计数据为实时查询,可能会有轻微延迟
671
+ - 24小时趋势数据按小时粒度统计
157
672
  """
158
673
  try:
159
674
  return AlertService.get_alert_statistics(namespace)
@@ -164,15 +679,102 @@ async def get_alert_statistics(
164
679
 
165
680
  # ============ 活跃告警管理 ============
166
681
 
167
- @router.get("/active")
682
+ @router.get(
683
+ "/active",
684
+ summary="获取当前活跃的告警",
685
+ description="获取系统中当前正在活跃状态的告警列表",
686
+ responses={
687
+ 200: {
688
+ "description": "成功返回活跃告警列表"
689
+ },
690
+ 500: {
691
+ "description": "服务器内部错误",
692
+ "content": {
693
+ "application/json": {
694
+ "example": {"detail": "获取活跃告警失败: Database error"}
695
+ }
696
+ }
697
+ }
698
+ }
699
+ )
168
700
  async def get_active_alerts(
169
- namespace: Optional[str] = Query(None, description="命名空间名称")
701
+ namespace: Optional[str] = Query(None, description="命名空间名称,不指定则返回所有命名空间的活跃告警", example="default")
170
702
  ):
171
703
  """
172
- 获取当前活跃的告警
173
-
174
- Args:
175
- namespace: 命名空间名称(可选)
704
+ ## 获取当前活跃的告警
705
+
706
+ 获取系统中当前正在活跃状态的告警列表,即尚未解决的告警。
707
+
708
+ **返回信息包括**:
709
+ - 告警ID和规则名称
710
+ - 告警级别(critical、high、medium、low)
711
+ - 触发时间和持续时间
712
+ - 当前指标值和阈值
713
+ - 告警状态(活跃/已确认)
714
+ - 命名空间信息
715
+ - 告警消息和详细描述
716
+
717
+ **告警状态**:
718
+ - `active`: 活跃告警(未确认)
719
+ - `acknowledged`: 已确认告警(但未解决)
720
+
721
+ **使用场景**:
722
+ - 告警监控大屏
723
+ - 实时告警通知
724
+ - 运维值班查看
725
+ - 问题快速响应
726
+
727
+ **示例请求**:
728
+ ```bash
729
+ # 获取所有活跃告警
730
+ curl -X GET "http://localhost:8001/api/v1/alerts/active"
731
+
732
+ # 获取指定命名空间的活跃告警
733
+ curl -X GET "http://localhost:8001/api/v1/alerts/active?namespace=default"
734
+ ```
735
+
736
+ **返回示例**:
737
+ ```json
738
+ {
739
+ "success": true,
740
+ "data": [
741
+ {
742
+ "id": "alert-001",
743
+ "rule_id": "rule-123",
744
+ "rule_name": "任务失败率告警",
745
+ "severity": "high",
746
+ "status": "active",
747
+ "metric_value": 0.18,
748
+ "threshold": 0.1,
749
+ "message": "任务失败率超过阈值",
750
+ "started_at": "2025-10-19T10:30:00Z",
751
+ "duration": 1800,
752
+ "namespace": "default"
753
+ },
754
+ {
755
+ "id": "alert-002",
756
+ "rule_id": "rule-456",
757
+ "rule_name": "队列积压告警",
758
+ "severity": "medium",
759
+ "status": "acknowledged",
760
+ "metric_value": 1250,
761
+ "threshold": 1000,
762
+ "message": "队列积压任务数超过阈值",
763
+ "started_at": "2025-10-19T09:15:00Z",
764
+ "duration": 6300,
765
+ "acknowledged_at": "2025-10-19T10:00:00Z",
766
+ "acknowledged_by": "admin",
767
+ "namespace": "default"
768
+ }
769
+ ]
770
+ }
771
+ ```
772
+
773
+ **注意事项**:
774
+ - 返回的告警按告警级别和触发时间排序(严重的在前)
775
+ - 已确认但未解决的告警也会包含在结果中
776
+ - 不包括已解决的告警
777
+ - 可用于实时监控和告警响应
176
778
  """
177
779
  try:
178
780
  return AlertService.get_active_alerts(namespace)
@@ -181,17 +783,81 @@ async def get_active_alerts(
181
783
  raise HTTPException(status_code=500, detail=str(e))
182
784
 
183
785
 
184
- @router.post("/active/{alert_id}/acknowledge")
786
+ @router.post(
787
+ "/active/{alert_id}/acknowledge",
788
+ summary="确认告警",
789
+ description="确认一个活跃的告警,表示已知晓该告警并正在处理",
790
+ responses={
791
+ 200: {
792
+ "description": "告警确认成功",
793
+ "content": {
794
+ "application/json": {
795
+ "example": {
796
+ "success": True,
797
+ "message": "告警已确认",
798
+ "acknowledged_at": "2025-10-19T10:30:00Z",
799
+ "acknowledged_by": "admin"
800
+ }
801
+ }
802
+ }
803
+ },
804
+ 404: {
805
+ "description": "告警不存在",
806
+ "content": {
807
+ "application/json": {
808
+ "example": {"detail": "告警 'xxx' 不存在"}
809
+ }
810
+ }
811
+ },
812
+ 500: {
813
+ "description": "服务器内部错误"
814
+ }
815
+ }
816
+ )
185
817
  async def acknowledge_alert(
186
818
  alert_id: str,
187
- user: str = Query("system", description="确认用户")
819
+ user: str = Query("system", description="确认用户名称", example="admin")
188
820
  ):
189
821
  """
190
- 确认告警
191
-
192
- Args:
193
- alert_id: 告警ID
194
- user: 确认用户
822
+ ## 确认告警
823
+
824
+ 确认一个活跃的告警,表示已知晓该告警并正在处理中。确认后告警状态变为"已确认",但仍保持活跃。
825
+
826
+ **功能说明**:
827
+ - 将告警状态从"活跃"变更为"已确认"
828
+ - 记录确认时间和确认人
829
+ - 告警仍然保持活跃,直到问题解决
830
+ - 可用于告警认领和责任分配
831
+
832
+ **使用场景**:
833
+ - 运维人员接手处理告警
834
+ - 告警认领和责任划分
835
+ - 防止多人重复处理同一告警
836
+ - 告警处理流程跟踪
837
+
838
+ **示例请求**:
839
+ ```bash
840
+ # 确认告警
841
+ curl -X POST "http://localhost:8001/api/v1/alerts/active/alert-001/acknowledge?user=admin"
842
+ ```
843
+
844
+ **返回示例**:
845
+ ```json
846
+ {
847
+ "success": true,
848
+ "message": "告警已确认",
849
+ "alert_id": "alert-001",
850
+ "acknowledged_at": "2025-10-19T10:30:00Z",
851
+ "acknowledged_by": "admin"
852
+ }
853
+ ```
854
+
855
+ **注意事项**:
856
+ - 只能确认活跃状态的告警
857
+ - 已确认的告警可以重复确认(更新确认时间和确认人)
858
+ - 确认操作不会解决告警,需要调用 resolve 接口解决
859
+ - 建议在开始处理告警时立即确认
860
+ - user 参数应传入实际操作人的用户名
195
861
  """
196
862
  try:
197
863
  return AlertService.acknowledge_alert(alert_id, user)
@@ -202,17 +868,86 @@ async def acknowledge_alert(
202
868
  raise HTTPException(status_code=500, detail=str(e))
203
869
 
204
870
 
205
- @router.post("/active/{alert_id}/resolve")
871
+ @router.post(
872
+ "/active/{alert_id}/resolve",
873
+ summary="解决告警",
874
+ description="标记告警为已解决状态,并可添加解决说明",
875
+ responses={
876
+ 200: {
877
+ "description": "告警解决成功",
878
+ "content": {
879
+ "application/json": {
880
+ "example": {
881
+ "success": True,
882
+ "message": "告警已解决",
883
+ "resolved_at": "2025-10-19T10:45:00Z"
884
+ }
885
+ }
886
+ }
887
+ },
888
+ 404: {
889
+ "description": "告警不存在",
890
+ "content": {
891
+ "application/json": {
892
+ "example": {"detail": "告警 'xxx' 不存在"}
893
+ }
894
+ }
895
+ },
896
+ 500: {
897
+ "description": "服务器内部错误"
898
+ }
899
+ }
900
+ )
206
901
  async def resolve_alert(
207
902
  alert_id: str,
208
- resolution_note: Optional[str] = Query(None, description="解决说明")
903
+ resolution_note: Optional[str] = Query(None, description="解决说明,记录如何解决该告警", example="已修复任务处理逻辑,重启相关服务")
209
904
  ):
210
905
  """
211
- 解决告警
212
-
213
- Args:
214
- alert_id: 告警ID
215
- resolution_note: 解决说明(可选)
906
+ ## 解决告警
907
+
908
+ 标记告警为已解决状态,表示问题已经处理完成。可以添加解决说明,记录问题原因和处理方法。
909
+
910
+ **功能说明**:
911
+ - 将告警状态变更为"已解决"
912
+ - 记录解决时间
913
+ - 可选添加解决说明(建议填写)
914
+ - 告警从活跃列表中移除
915
+ - 保留在历史记录中供查询
916
+
917
+ **使用场景**:
918
+ - 问题处理完成后关闭告警
919
+ - 记录问题解决方法
920
+ - 建立知识库和问题处理文档
921
+ - 告警生命周期管理
922
+
923
+ **示例请求**:
924
+ ```bash
925
+ # 解决告警(不添加说明)
926
+ curl -X POST "http://localhost:8001/api/v1/alerts/active/alert-001/resolve"
927
+
928
+ # 解决告警并添加说明
929
+ curl -X POST "http://localhost:8001/api/v1/alerts/active/alert-001/resolve?resolution_note=已修复任务处理逻辑,重启相关服务"
930
+ ```
931
+
932
+ **返回示例**:
933
+ ```json
934
+ {
935
+ "success": true,
936
+ "message": "告警已解决",
937
+ "alert_id": "alert-001",
938
+ "resolved_at": "2025-10-19T10:45:00Z",
939
+ "resolution_note": "已修复任务处理逻辑,重启相关服务",
940
+ "duration": 900
941
+ }
942
+ ```
943
+
944
+ **注意事项**:
945
+ - 只能解决活跃状态或已确认状态的告警
946
+ - 已解决的告警不能再次解决
947
+ - 建议添加详细的解决说明,便于后续问题排查和知识积累
948
+ - 解决操作会记录到告警历史中
949
+ - 如果问题再次出现,会创建新的告警实例
950
+ - 解决说明应包含问题原因、处理步骤和验证方法
216
951
  """
217
952
  try:
218
953
  return AlertService.resolve_alert(alert_id, resolution_note)