82 lines
1.8 KiB
Go
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)
|
|
}
|
|
}
|