diff --git a/go.mod b/go.mod index 7c4458e399..7fa9aaa664 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/prometheus/client_golang v1.24.1 github.com/prometheus/client_model v0.6.2 github.com/prometheus/common v0.70.1 - github.com/prometheus/exporter-toolkit v0.17.1 + github.com/prometheus/exporter-toolkit v0.19.0 github.com/prometheus/procfs v0.21.1 github.com/safchain/ethtool v0.7.0 golang.org/x/sys v0.47.0 diff --git a/go.sum b/go.sum index 58c02fe429..b6f9aef455 100644 --- a/go.sum +++ b/go.sum @@ -82,8 +82,8 @@ github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNw github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi/PY= github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc= -github.com/prometheus/exporter-toolkit v0.17.1 h1:psKN4wM7shBL/BxZkDHgm6YZJ3fAVG36+r86An/+7q0= -github.com/prometheus/exporter-toolkit v0.17.1/go.mod h1:dabwPJvxsC5+tsp2iolQrqBWZh+QlISKlYRpj9Hh5xk= +github.com/prometheus/exporter-toolkit v0.19.0 h1:JljWCzE5naAiZ7Ukeb8PwjNbU+WwISuW0ktgdXMnMhc= +github.com/prometheus/exporter-toolkit v0.19.0/go.mod h1:kOoEK/7wbe2Ns33l7wYHOXDZAZ/XGLyJqoGwmJxK+QU= github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= github.com/safchain/ethtool v0.7.0 h1:rlJzfDetsVvT61uz8x1YIcFn12akMfuPulHtZjtb7Is= diff --git a/node_exporter.go b/node_exporter.go index 17c372eb31..ac990dee29 100644 --- a/node_exporter.go +++ b/node_exporter.go @@ -24,17 +24,12 @@ import ( "slices" "sort" - "github.com/prometheus/common/promslog" - "github.com/prometheus/common/promslog/flag" - "github.com/alecthomas/kingpin/v2" "github.com/prometheus/client_golang/prometheus" promcollectors "github.com/prometheus/client_golang/prometheus/collectors" versioncollector "github.com/prometheus/client_golang/prometheus/collectors/version" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/prometheus/common/version" - "github.com/prometheus/exporter-toolkit/web" - "github.com/prometheus/exporter-toolkit/web/kingpinflag" + "github.com/prometheus/exporter-toolkit/bootstrap" "github.com/prometheus/node_exporter/collector" ) @@ -181,18 +176,6 @@ func (h *handler) innerHandler(filters ...string) (http.Handler, error) { func main() { var ( - metricsPath = kingpin.Flag( - "web.telemetry-path", - "Path under which to expose metrics.", - ).Default("/metrics").String() - disableExporterMetrics = kingpin.Flag( - "web.disable-exporter-metrics", - "Exclude metrics about the exporter itself (promhttp_*, process_*, go_*).", - ).Bool() - maxRequests = kingpin.Flag( - "web.max-requests", - "Maximum number of parallel scrape requests. Use 0 to disable.", - ).Default("40").Int() disableDefaultCollectors = kingpin.Flag( "collector.disable-defaults", "Set all collectors to disabled by default.", @@ -200,52 +183,30 @@ func main() { maxProcs = kingpin.Flag( "runtime.gomaxprocs", "The target number of CPUs Go will run on (GOMAXPROCS)", ).Envar("GOMAXPROCS").Default("1").Int() - toolkitFlags = kingpinflag.AddFlags(kingpin.CommandLine, ":9100") ) - promslogConfig := &promslog.Config{} - flag.AddFlags(kingpin.CommandLine, promslogConfig) - kingpin.Version(version.Print("node_exporter")) kingpin.CommandLine.UsageWriter(os.Stdout) - kingpin.HelpFlag.Short('h') - kingpin.Parse() - logger := promslog.New(promslogConfig) - - if *disableDefaultCollectors { - collector.DisableDefaultCollectors() - } - logger.Info("Starting node_exporter", "version", version.Info()) - logger.Info("Build context", "build_context", version.BuildContext()) - if user, err := user.Current(); err == nil && user.Uid == "0" { - logger.Warn("Node Exporter is running as root user. This exporter is designed to run as unprivileged user, root is not required.") - } - runtime.GOMAXPROCS(*maxProcs) - logger.Debug("Go MAXPROCS", "procs", runtime.GOMAXPROCS(0)) - - http.Handle(*metricsPath, newHandler(!*disableExporterMetrics, *maxRequests, logger)) - if *metricsPath != "/" { - landingConfig := web.LandingConfig{ - Name: "Node Exporter", - Description: "Prometheus Node Exporter", - Version: version.Info(), - Links: []web.LandingLinks{ - { - Address: *metricsPath, - Text: "Metrics", - }, - }, - } - landingPage, err := web.NewLandingPage(landingConfig) - if err != nil { - logger.Error(err.Error()) - os.Exit(1) - } - http.Handle("/", landingPage) - } - - server := &http.Server{} - if err := web.ListenAndServe(server, toolkitFlags, logger); err != nil { - logger.Error(err.Error()) + runner := bootstrap.New(bootstrap.Config{ + App: kingpin.CommandLine, + Name: "node_exporter", + Description: "Prometheus Node Exporter", + DefaultAddress: ":9100", + MetricsHandlerFactory: func(b *bootstrap.Bootstrap) (http.Handler, error) { + if *disableDefaultCollectors { + collector.DisableDefaultCollectors() + } + if user, err := user.Current(); err == nil && user.Uid == "0" { + b.Logger.Warn("Node Exporter is running as root user. This exporter is designed to run as unprivileged user, root is not required.") + } + runtime.GOMAXPROCS(*maxProcs) + b.Logger.Debug("Go MAXPROCS", "procs", runtime.GOMAXPROCS(0)) + b.Handle("/debug/pprof/", http.DefaultServeMux) + return newHandler(!b.DisableExporterMetrics, b.MaxRequests, b.Logger), nil + }, + }) + + if err := runner.Run(); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }