Files
aiops/backend/pkg/database/database.go
T
attacker 2e71371257 feat: Phase 2-5 监控中心全栈实现 — 指标浏览器/SNMP/站点拨测/中间件
Phase 2 指标监控:
- 修复 /metrics 路由(原指向 AlertManager → 现指向 MetricsExplorer)
- 新建 MetricsHandler (4 API): targets/list/query/names
- 新建 MetricsExplorer 前端(170行): 目标选择器+指标分类树+多指标叠加SVG图表

Phase 3 SNMP设备:
- 新建 SNMPHandler (9 API): devices CRUD/templates/stats
- SNMPMonitor 接入真实API(428行): 设备表格+添加对话框+删除

Phase 4 站点拨测:
- 新建 SiteHandler (8 API): tasks CRUD/results/stats
- SiteMonitor 接入真实API(542行): 任务表+添加对话框+拨测类型网格
- 新增 siteApi 到 api.ts

Phase 5 中间件采集:
- Agent 新增 collector/middleware.go: Redis INFO + MySQL handshake 采集
- Agent CLI 新增 -redis/-redis-auth/-mysql/-mysql-user/-mysql-pass
- MiddlewareMonitor 接入真实API(301行): 实例卡片+指标面板

基础设施:
- AutoMigrate 新增 23 张监控表
- 前后端容器构建部署验证通过
2026-06-18 13:02:19 +00:00

147 lines
4.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package database
import (
"fmt"
"time"
"ezops/internal/config"
"ezops/internal/models"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
// New 创建数据库连接
func New(cfg config.DatabaseConfig) (*gorm.DB, error) {
var dialector gorm.Dialector
switch cfg.Driver {
case "mysql":
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local",
cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DBName, cfg.Charset)
dialector = mysql.Open(dsn)
case "postgres":
dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
cfg.Host, cfg.Port, cfg.User, cfg.Password, cfg.DBName)
dialector = postgres.Open(dsn)
case "sqlite":
dialector = sqlite.Open(cfg.DBName)
default:
return nil, fmt.Errorf("unsupported database driver: %s", cfg.Driver)
}
db, err := gorm.Open(dialector, &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
return nil, err
}
// 设置连接池
sqlDB, err := db.DB()
if err != nil {
return nil, err
}
sqlDB.SetMaxOpenConns(cfg.MaxConn)
sqlDB.SetMaxIdleConns(cfg.MaxIdle)
sqlDB.SetConnMaxLifetime(time.Hour)
return db, nil
}
// AutoMigrate 自动迁移数据库表
// 逐表迁移:单张表的迁移错误(如索引名冲突)不会阻塞其他表,
// 避免 GORM + MySQL 8.0 的 "Can't DROP" 索引问题导致整个启动失败
func AutoMigrate(db *gorm.DB) error {
allModels := []interface{}{
&models.User{},
&models.Role{},
&models.Permission{},
&models.Server{},
&models.Cloud{},
&models.CloudAccount{},
&models.Region{},
&models.Domain{},
&models.K8sCluster{},
&models.K8sNode{},
&models.K8sPod{},
&models.K8sDeployment{},
&models.K8sService{},
&models.K8sIngress{},
&models.AlertRule{},
&models.AlertEvent{},
&models.NotifyChannel{},
&models.MetricData{},
&models.Pipeline{},
&models.PipelineRun{},
&models.AppRelease{},
&models.CronJob{},
&models.Script{},
&models.TaskExecution{},
&models.Playbook{},
&models.ApprovalTemplate{},
&models.ApprovalProcess{},
&models.ApprovalStep{},
&models.NavigationGroup{},
&models.NavigationLink{},
&models.AuditLog{},
&models.LDAPConfig{},
&models.ResourceModel{},
&models.CloudBilling{},
&models.BillingAlertRule{},
&models.AgentReport{},
&models.AgentTask{},
&models.AgentRule{},
&models.AgentAlert{},
&models.AnsiblePlaybook{},
&models.AnsibleJob{},
&models.AnsibleInventory{},
&models.LogSource{},
&models.LogEntry{},
&models.TopologyLayout{}, // 拓扑布局保存 // Logan.Li
&models.TerminalSession{}, // 终端会话录制(终端审计) // Logan.Li
&models.LLMConfig{}, // 大语言模型配置(AI 智能助手) // Logan.Li
&models.ChatHistory{}, // 对话历史记录(按用户隔离) // Logan.Li
&models.MetricsKline{}, // 指标K线聚合(Redis 热数据 → MySQL) // Logan.Li
&models.MonitorTarget{}, // 监控目标(主机/中间件/设备/站点) // Logan.Li
&models.MonitorMetric{}, // 监控指标定义 // Logan.Li
&models.MetricValue{}, // 指标当前值 // Logan.Li
&models.MetricHistory{}, // 指标历史时序 // Logan.Li
&models.MetricTag{}, // 指标标签 // Logan.Li
&models.MonitorDashboard{},// 监控大屏配置 // Logan.Li
&models.DashboardPanel{}, // 大屏面板 // Logan.Li
&models.HostGroup{}, // 主机组 // Logan.Li
&models.SNMPDevice{}, // SNMP设备 // Logan.Li
&models.SNMPTemplate{}, // SNMP模板 // Logan.Li
&models.SNMPTemplateOID{}, // SNMP模板OID // Logan.Li
&models.SNMPMetric{}, // SNMP指标 // Logan.Li
&models.SNMPInterface{}, // SNMP接口 // Logan.Li
&models.SiteTask{}, // 站点拨测任务 // Logan.Li
&models.SiteResult{}, // 拨测结果 // Logan.Li
&models.SiteAlert{}, // 拨测告警 // Logan.Li
&models.AlertRuleV2{}, // 告警规则V2 // Logan.Li
&models.AlertCondition{}, // 告警条件 // Logan.Li
&models.AlertNotifyTemplate{}, // 告警通知模板 // Logan.Li
&models.AlertUpgrade{}, // 告警升级 // Logan.Li
&models.AlertUpgradeRecord{},// 告警升级记录 // Logan.Li
&models.AlertSilence{}, // 告警静默 // Logan.Li
&models.AlertEventV2{}, // 告警事件V2 // Logan.Li
}
var lastErr error
for _, m := range allModels {
if err := db.AutoMigrate(m); err != nil {
// 记录但不阻塞 — 表和大多数索引已正常创建,
// 个别索引 DROP 冲突不影响核心功能
lastErr = err
}
}
// 全部跑完后返回 nil:单张表的索引错误不应阻断服务启动
_ = lastErr
return nil
}