// Copyright (C) 2020 Marius Schellenberger package main import ( "net/http" _ "net/http/pprof" "os" "git.giftfish.de/ston1th/rcctl_exporter/rcctl" "git.giftfish.de/ston1th/rcctl_exporter/syspatch" "github.com/go-kit/kit/log/level" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/common/promlog" "github.com/prometheus/common/promlog/flag" "github.com/prometheus/common/version" "github.com/prometheus/node_exporter/https" "gopkg.in/alecthomas/kingpin.v2" ) func main() { var ( listenAddress = kingpin.Flag( "web.listen-address", "Address on which to expose metrics and web interface.", ).Default(":9501").String() 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() configFile = kingpin.Flag( "web.config", "[EXPERIMENTAL] Path to config yaml file that can enable TLS or authentication.", ).Default("").String() ) promlogConfig := &promlog.Config{} flag.AddFlags(kingpin.CommandLine, promlogConfig) kingpin.Version(version.Print("node_exporter")) kingpin.HelpFlag.Short('h') kingpin.Parse() logger := promlog.New(promlogConfig) level.Info(logger).Log("msg", "Starting rcctl_exporter", "version", version.Info()) level.Info(logger).Log("msg", "Build context", "build_context", version.BuildContext()) exporterMetricsRegistry := prometheus.NewRegistry() r := prometheus.NewRegistry() r.MustRegister(version.NewCollector("rcctl_exporter")) r.MustRegister(version.NewCollector("syspatch_exporter")) rcctlCollector, err := rcctl.NewCollector(logger) if err != nil { level.Error(logger).Log("msg", "couldn't create collector", "err", err) os.Exit(1) } if err := r.Register(rcctlCollector); err != nil { level.Error(logger).Log("msg", "couldn't register rcctl collector", "err", err) os.Exit(1) } syspatchCollector, err := syspatch.NewCollector(logger) if err != nil { level.Error(logger).Log("msg", "couldn't create collector", "err", err) os.Exit(1) } if err := r.Register(syspatchCollector); err != nil { level.Error(logger).Log("msg", "couldn't register syspatch collector", "err", err) os.Exit(1) } handler := promhttp.HandlerFor( prometheus.Gatherers{exporterMetricsRegistry, r}, promhttp.HandlerOpts{ ErrorHandling: promhttp.ContinueOnError, MaxRequestsInFlight: *maxRequests, Registry: exporterMetricsRegistry, }, ) if !*disableExporterMetrics { handler = promhttp.InstrumentMetricHandler( exporterMetricsRegistry, handler, ) } http.Handle(*metricsPath, handler) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`