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:
attacker committed 2026-06-24 08:34:43 +00:00
1 parent 7bc5169e8f
commit 5333f6f04a
30 files changed
+2406 -1001

No files matched your search

+80 -10
View File
@@ -49,11 +49,11 @@ func (h *ToolConfigHandler) UpdateTool(c *gin.Context) {
}
var req struct {
DisplayName *string `json:"display_name"`
Description *string `json:"description"`
InstallMethod *models.ToolInstallMethod `json:"install_method"`
Enabled *bool `json:"enabled"`
SortOrder *int `json:"sort_order"`
DisplayName *string `json:"display_name"`
Description *string `json:"description"`
InstallMethod *models.ToolInstallMethod `json:"install_method"`
Enabled *bool `json:"enabled"`
SortOrder *int `json:"sort_order"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()})
@@ -87,7 +87,7 @@ func (h *ToolConfigHandler) UpdateTool(c *gin.Context) {
c.JSON(http.StatusOK, models.Response{Code: 200, Message: "已更新"})
}
// InstallTool triggers lazy installation of a tool
// InstallTool triggers lazy installation with optional version override
func (h *ToolConfigHandler) InstallTool(c *gin.Context) {
var tool models.DeployTool
if err := h.db.First(&tool, c.Param("id")); err.Error != nil {
@@ -105,11 +105,33 @@ func (h *ToolConfigHandler) InstallTool(c *gin.Context) {
return
}
// Support version override via query param or JSON body
version := tool.DefaultVersion
if v := c.Query("version"); v != "" {
version = v
}
if v := c.PostForm("version"); v != "" {
version = v
}
// Also support JSON body
var req struct {
Version string `json:"version"`
}
if err := c.ShouldBindJSON(&req); err == nil && req.Version != "" {
version = req.Version
}
// Store the requested version for the installer
if version != "" && version != tool.DefaultVersion {
h.db.Model(&tool).Update("default_version", version)
tool.DefaultVersion = version
}
go func() {
log.Printf("[ToolConfig] Background install triggered for %s", tool.Name)
log.Printf("[ToolConfig] Background install triggered for %s (version: %s)", tool.Name, version)
}()
c.JSON(http.StatusOK, models.Response{Code: 200, Message: "安装已触发"})
c.JSON(http.StatusOK, models.Response{Code: 200, Message: "安装已触发", Data: gin.H{"version": version}})
}
// CheckToolStatus re-checks a tool's installation status
@@ -124,9 +146,13 @@ func (h *ToolConfigHandler) CheckToolStatus(c *gin.Context) {
version := ""
if tool.CheckCommand != "" {
cmd := exec.Command("sh", "-c", tool.CheckCommand)
if err := cmd.Run(); err == nil {
out, err := cmd.Output()
if err == nil {
available = true
version = "已安装"
version = string(out)
if len(version) > 128 {
version = version[:128]
}
}
}
@@ -145,3 +171,47 @@ func (h *ToolConfigHandler) CheckToolStatus(c *gin.Context) {
"tool": tool,
}})
}
// GetToolVersions returns available versions for a tool (jdk/node/maven)
func (h *ToolConfigHandler) GetToolVersions(c *gin.Context) {
var tool models.DeployTool
if err := h.db.First(&tool, c.Param("id")); err.Error != nil {
c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "工具不存在"})
return
}
versions := getPresetVersions(tool.Name)
c.JSON(http.StatusOK, models.Response{Code: 200, Data: gin.H{
"name": tool.Name,
"default": tool.DefaultVersion,
"versions": versions,
}})
}
// getPresetVersions returns known versions for common tools
func getPresetVersions(toolName string) []map[string]string {
switch toolName {
case "jdk":
return []map[string]string{
{"version": "11.0.24+8", "label": "JDK 11 (LTS)"},
{"version": "17.0.13+7", "label": "JDK 17 (LTS) ★ 推荐"},
{"version": "21.0.5+11", "label": "JDK 21 (LTS)"},
{"version": "23.0.1+11", "label": "JDK 23 (最新)"},
}
case "nodejs":
return []map[string]string{
{"version": "v18.20.5", "label": "Node 18 (LTS)"},
{"version": "v20.18.1", "label": "Node 20 (LTS)"},
{"version": "v22.14.0", "label": "Node 22 (LTS) ★ 推荐"},
}
case "maven":
return []map[string]string{
{"version": "3.9.9", "label": "Maven 3.9.9 ★ 推荐"},
{"version": "3.8.8", "label": "Maven 3.8.8"},
{"version": "3.6.3", "label": "Maven 3.6.3"},
}
default:
return nil
}
}