package main import ( "context" "fmt" "log/slog" "net/http" "os" "os/signal" "git.t-juice.club/torjus/labmon/config" "git.t-juice.club/torjus/labmon/stepmon" "github.com/prometheus/client_golang/prometheus/promhttp" ) const Version = "0.1.0" func LoadConfig() (*config.Config, error) { config, err := config.FromFile("labmon.toml") if err != nil { return nil, err } return config, nil } func main() { // Load config config, err := LoadConfig() if err != nil { fmt.Printf("Error loading config: %v\n", err) os.Exit(1) } // Setup logger logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ Level: slog.LevelDebug, })) // Setup stepmons var stepmons []*stepmon.StepMonitor for _, s := range config.StepMonitors { if s.Enabled { sm := stepmon.NewStepMonitor(s.BaseURL, s.RootID) sm.SetLogger(logger) stepmons = append(stepmons, sm) } } // Start stepmons for _, sm := range stepmons { go func(sm *stepmon.StepMonitor) { sm.Start() }(sm) } // Setup graceful shutdown ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) defer cancel() shutdownDone := make(chan struct{}, 1) // Start http server srv := &http.Server{} srv.Addr = config.ListenAddr mux := http.NewServeMux() mux.Handle("/metrics", promhttp.Handler()) srv.Handler = mux // Start http server go func() { logger.Info("Starting HTTP server", "addr", config.ListenAddr) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { logger.Error("HTTP server error", "error", err) } }() // Wait for shutdown signal go func() { <-ctx.Done() logger.Debug("Shutdown signal received") // Shutdown metrics server srv.Shutdown(context.Background()) logger.Debug("HTTP server shutdown complete") // Shutdown stepmons for _, sm := range stepmons { sm.Shutdown() logger.Debug("StepMonitor shutdown complete", "root_id", sm.RootID) } shutdownDone <- struct{}{} }() <-shutdownDone logger.Info("Shutdown complete") }