package controller import ( "encoding/json" "log" "net/http" "os" "ezops/model" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // middlewareSeedResult 种子创建结果 // Logan.Li type middlewareSeedResult struct { Created int `json:"created"` Skipped []string `json:"skipped"` Failed []string `json:"failed"` Total int64 `json:"total"` Message string `json:"message"` Success bool `json:"success"` } // SeedDefaultMiddlewareTargets 首次启动时创建平台默认 Redis/MySQL 监控目标 // Logan.Li func SeedDefaultMiddlewareTargets(db *gorm.DB) { seedDefaultMiddlewareTargets(db) } // SeedDefaultMiddlewareTargetsAPI 手动触发添加默认监控目标 // Logan.Li // POST /api/v1/middleware-monitors/seed-defaults func (h *MiddlewareMonitorHandler) SeedDefaultMiddlewareTargetsAPI(c *gin.Context) { result := seedDefaultMiddlewareTargets(h.db) c.JSON(http.StatusOK, model.Response{Code: 200, Data: result}) } // seedDefaultMiddlewareTargets 内部实现,返回创建结果 // Logan.Li func seedDefaultMiddlewareTargets(db *gorm.DB) middlewareSeedResult { result := middlewareSeedResult{ Skipped: []string{}, Failed: []string{}, } mysqlUser := os.Getenv("DATABASE_USER") if mysqlUser == "" { mysqlUser = "root" } mysqlPassword := os.Getenv("DATABASE_PASSWORD") if mysqlPassword == "" { mysqlPassword = os.Getenv("MYSQL_ROOT_PASSWORD") } mysqlDB := os.Getenv("DATABASE_DBNAME") if mysqlDB == "" { mysqlDB = "aiops" } redisCfg, _ := json.Marshal(MiddlewareConfig{RedisMode: "standalone"}) mysqlCfg, _ := json.Marshal(MiddlewareConfig{ Username: mysqlUser, Password: mysqlPassword, Database: mysqlDB, }) defaults := []model.MonitorTarget{ { Name: "aiops-redis", Type: model.TargetTypeMiddleware, Status: model.TargetStatusUnknown, IP: "aiops-redis", Port: 6379, CollectMode: "api", Config: string(redisCfg), Interval: 30, Description: "redis", }, { Name: "aiops-mysql", Type: model.TargetTypeMiddleware, Status: model.TargetStatusUnknown, IP: "aiops-mysql", Port: 3306, CollectMode: "api", Config: string(mysqlCfg), Interval: 30, Description: "mysql", }, } for _, target := range defaults { var exists int64 db.Model(&model.MonitorTarget{}). Where("type = ? AND name = ?", model.TargetTypeMiddleware, target.Name). Count(&exists) if exists > 0 { result.Skipped = append(result.Skipped, target.Name) continue } // host_group_id 默认 0 会触发外键约束,创建时显式忽略 // Logan.Li if err := db.Omit("HostGroupID").Create(&target).Error; err != nil { log.Printf("[MiddlewareMonitor] 种子数据创建失败 %s: %v", target.Name, err) result.Failed = append(result.Failed, target.Name) continue } result.Created++ log.Printf("[MiddlewareMonitor] 已创建默认监控目标: %s (%s:%d)", target.Name, target.IP, target.Port) } db.Model(&model.MonitorTarget{}).Where("type = ?", model.TargetTypeMiddleware).Count(&result.Total) result.Success = result.Created > 0 || (len(result.Skipped) > 0 && len(result.Failed) == 0) switch { case result.Created > 0: result.Message = "已添加平台默认监控目标" case len(result.Failed) > 0: result.Message = "部分默认目标创建失败,请查看服务日志" case len(result.Skipped) > 0: result.Message = "默认监控目标已存在,请在下方列表查看" default: result.Message = "未创建任何默认目标" } return result }