Files
pve_local_exporter/src/main.go
2026-03-12 19:39:35 +05:30

82 lines
1.8 KiB
Go

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(`<html><body><a href="/metrics">Metrics</a></body></html>`))
})
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)
}
}