package main import ( "context" "flag" "fmt" "os" "os/signal" "syscall" _ "github.com/go-sql-driver/mysql" prom_runtime "github.com/prometheus/prometheus/pkg/runtime" "github.com/toolkits/pkg/logger" "github.com/toolkits/pkg/runner" "github.com/didi/nightingale/v5/alert" "github.com/didi/nightingale/v5/backend" "github.com/didi/nightingale/v5/config" "github.com/didi/nightingale/v5/http" "github.com/didi/nightingale/v5/judge" "github.com/didi/nightingale/v5/models" "github.com/didi/nightingale/v5/pkg/i18n" "github.com/didi/nightingale/v5/pkg/ilog" "github.com/didi/nightingale/v5/rpc" "github.com/didi/nightingale/v5/timer" "github.com/didi/nightingale/v5/trans" ) var version = "not specified" var ( vers *bool help *bool ) func init() { vers = flag.Bool("v", false, "display the version.") help = flag.Bool("h", false, "print this help.") flag.Parse() if *vers { fmt.Println("version:", version) os.Exit(0) } if *help { flag.Usage() os.Exit(0) } runner.Init() fmt.Println("runner.cwd:", runner.Cwd) fmt.Println("runner.hostname:", runner.Hostname) fmt.Println("fd_limits", prom_runtime.FdLimits()) fmt.Println("vm_limits", prom_runtime.VMLimits()) } func main() { parseConf() ilog.Init(config.Config.Logger) i18n.Init(config.Config.I18N) models.InitMySQL(config.Config.MySQL) models.InitLdap(config.Config.LDAP) models.InitSalt() models.InitRoot() models.InitError() ctx, cancelFunc := context.WithCancel(context.Background()) timer.SyncResourceTags() timer.SyncUsers() timer.SyncUserGroups() timer.SyncUserGroupMember() timer.SyncClasspathReses() timer.SyncCollectRules() timer.SyncAlertMutes() timer.SyncAlertRules() timer.SyncMetricDesc() timer.CleanExpireMute() timer.CleanExpireResource() timer.BindOrphanRes() timer.UpdateAlias() judge.Start(ctx) alert.Start(ctx) trans.Start(ctx) backend.Init(config.Config.Trans.Backend) http.Start() rpc.Start() endingProc(cancelFunc) } func parseConf() { if err := config.Parse(); err != nil { fmt.Println("cannot parse configuration file:", err) os.Exit(1) } } func endingProc(cancelFunc context.CancelFunc) { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) <-c fmt.Printf("stop signal caught, stopping... pid=%d\n", os.Getpid()) // 执行清理工作 backend.DatasourceCleanUp() cancelFunc() logger.Close() http.Shutdown() fmt.Println("process stopped successfully") }