package main import ( "fmt" "log" "log/slog" "net/http" "os" "os/signal" "strings" "syscall" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "pve_local_exporter/internal/collector" "pve_local_exporter/internal/config" "pve_local_exporter/internal/logging" ) var version string func main() { cfg := config.Parse() cfg.Version = version if cfg.ShowVersion { fmt.Println(version) return } level := slog.LevelInfo switch strings.ToUpper(cfg.LogLevel) { case "TRACE": level = logging.LevelTrace case "DEBUG": level = slog.LevelDebug case "WARNING", "WARN": level = slog.LevelWarn case "ERROR", "CRITICAL": level = slog.LevelError } slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: level, ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { if a.Key == slog.LevelKey { lvl := a.Value.Any().(slog.Level) if lvl == logging.LevelTrace { a.Value = slog.StringValue("TRACE") } } return a }, }))) reg := prometheus.NewRegistry() c := collector.New(cfg) reg.MustRegister(c) mux := http.NewServeMux() mux.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{})) mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`
Metrics`)) }) addr := fmt.Sprintf("%s:%d", cfg.Host, cfg.Port) server := &http.Server{Addr: addr, Handler: mux} sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) go func() { <-sigCh slog.Info("shutting down") server.Close() }() slog.Info("listening", "addr", addr) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatal(err) } }