feat(alert-center): 添加飞书Webhook通知渠道 + 告警引擎实时通知
- 后端: NotifyChannel 模型新增 feishu 类型, FeishuWebhookConfig - 后端: TestNotifyChannel 真实发送飞书测试消息(文本格式) - 后端: 告警引擎触发/恢复时自动发送飞书通知(sendFeishuAlert/sendFeishuRecovery) - 后端: AlertEngine 新增 tcp_time_wait/tcp_close_wait/service_process 指标检测 - 后端: NetworkStatModel 新增 TCPCloseWait 字段 - 后端: QuickSetupRules 一键创建6条告警规则(CPU/内存/磁盘/TIME_WAIT/CLOSE_WAIT/进程) - 后端: 注册 /alerts/quick-setup 路由 - 前端: AlertChannelDialog 新增飞书类型选项 - 前端: helpers 新增 getChannelIcon/getChannelTypeLabel 支持 feishu/dingtalk/wechat
This commit is contained in:
1 parent
7bc5169e8f
commit
5333f6f04a
30 files changed
+2406
-1001
No files matched your search
@@ -1,6 +1,7 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -272,3 +273,64 @@ func (h *AlertHandler) ToggleRule(c *gin.Context) {
|
||||
Data: rule,
|
||||
})
|
||||
}
|
||||
|
||||
// QuickSetupRules 一键创建测试告警规则(飞书Webhook测试用) // Logan.Li
|
||||
// @Summary 一键创建测试告警规则
|
||||
// @Tags 告警
|
||||
// @Router /alerts/quick-setup [post]
|
||||
func (h *AlertHandler) QuickSetupRules(c *gin.Context) {
|
||||
type ruleDef struct {
|
||||
Name string `json:"name"`
|
||||
Metric string `json:"metric"`
|
||||
Operator string `json:"operator"`
|
||||
Threshold float64 `json:"threshold"`
|
||||
Port int `json:"port,omitempty"`
|
||||
}
|
||||
|
||||
var req struct {
|
||||
Rules []ruleDef `json:"rules"`
|
||||
}
|
||||
c.ShouldBindJSON(&req)
|
||||
|
||||
// 默认规则:CPU 80%, 内存 80%, 磁盘 90%, TIME_WAIT 15000, CLOSE_WAIT 200, 端口Down, 进程检测
|
||||
defaultRules := []ruleDef{
|
||||
{Name: "CPU使用率", Metric: "cpu", Operator: ">", Threshold: 80},
|
||||
{Name: "内存使用率", Metric: "mem", Operator: ">", Threshold: 80},
|
||||
{Name: "磁盘使用率", Metric: "disk", Operator: ">", Threshold: 90},
|
||||
{Name: "TIME_WAIT连接数", Metric: "tcp_time_wait", Operator: ">", Threshold: 15000},
|
||||
{Name: "CLOSE_WAIT连接数", Metric: "tcp_close_wait", Operator: ">", Threshold: 200},
|
||||
{Name: "进程异常退出", Metric: "service_process", Operator: "==", Threshold: 0},
|
||||
}
|
||||
|
||||
rules := req.Rules
|
||||
if len(rules) == 0 {
|
||||
rules = defaultRules
|
||||
}
|
||||
|
||||
created := 0
|
||||
for _, def := range rules {
|
||||
var existing models.AgentRule
|
||||
h.db.Where("name = ?", def.Name).First(&existing)
|
||||
if existing.ID > 0 {
|
||||
continue
|
||||
}
|
||||
rule := models.AgentRule{
|
||||
Name: def.Name,
|
||||
Metric: def.Metric,
|
||||
Operator: def.Operator,
|
||||
Threshold: def.Threshold,
|
||||
Port: def.Port,
|
||||
Enabled: true,
|
||||
}
|
||||
if err := h.db.Create(&rule).Error; err != nil {
|
||||
continue
|
||||
}
|
||||
created++
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, models.Response{
|
||||
Code: 200,
|
||||
Message: fmt.Sprintf("已创建 %d 条告警规则", created),
|
||||
Data: gin.H{"created": created},
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user