Package: prometheus-blackbox-exporter Severity: wishlist Tags: patch Hi,
Please consider adding the systemd socket activation patch from https://github.com/prometheus/blackbox_exporter/pull/523/commits. The verified working version for both 0.13 and 0.14 is attached. TIA! Best regards, Kilian
backport systemd socket activation from https://github.com/prometheus/blackbox_exporter/pull/523 Credit goes to Stefan Bühler --- a/main.go +++ b/main.go @@ -39,6 +39,8 @@ import ( "github.com/prometheus/blackbox_exporter/config" "github.com/prometheus/blackbox_exporter/prober" + + "github.com/coreos/go-systemd/activation" ) var ( @@ -204,12 +206,16 @@ func init() { } func main() { - promlogConfig := promlog.Config{} - flag.AddFlags(kingpin.CommandLine, &promlogConfig) + os.Exit(run()) +} + +func run() int { + promlogConfig := &promlog.Config{} + flag.AddFlags(kingpin.CommandLine, promlogConfig) kingpin.Version(version.Print("blackbox_exporter")) kingpin.HelpFlag.Short('h') kingpin.Parse() - logger := promlog.New(&promlogConfig) + logger := promlog.New(promlogConfig) rh := &resultHistory{maxResults: *historyLimit} level.Info(logger).Log("msg", "Starting blackbox_exporter", "version", version.Info()) @@ -217,12 +223,12 @@ func main() { if err := sc.ReloadConfig(*configFile); err != nil { level.Error(logger).Log("msg", "Error loading config", "err", err) - os.Exit(1) + return 1 } if *configCheck { level.Info(logger).Log("msg", "Config file is ok exiting...") - os.Exit(0) + return 0 } level.Info(logger).Log("msg", "Loaded config file") @@ -329,9 +335,44 @@ func main() { w.Write(c) }) - level.Info(logger).Log("msg", "Listening on address", "address", *listenAddress) - if err := http.ListenAndServe(*listenAddress, nil); err != nil { - level.Error(logger).Log("msg", "Error starting HTTP server", "err", err) - os.Exit(1) + srv := http.Server{Addr: *listenAddress} + srvc := make(chan struct{}) + term := make(chan os.Signal, 1) + signal.Notify(term, os.Interrupt, syscall.SIGTERM) + + go func() { + listeners, err := activation.Listeners() + if err != nil { + level.Error(logger).Log("msg", "cannot retrieve activation listeners", "err", err) + return + } + + if len(listeners) > 1 { + level.Error(logger).Log("msg", "unexpected number of socket activation listeners", "listeners", len(listeners)) + return + } + if len(listeners) == 1 { + level.Info(logger).Log("msg", "Listening on activation socket") + if err := http.Serve(listeners[0], nil); err != http.ErrServerClosed { + level.Error(logger).Log("msg", "Error starting HTTP server", "err", err) + close(srvc) + } + } else { + level.Info(logger).Log("msg", "Listening on address", "address", *listenAddress) + if err := srv.ListenAndServe(); err != http.ErrServerClosed { + level.Error(logger).Log("msg", "Error starting HTTP server", "err", err) + close(srvc) + } + } + }() + + for { + select { + case <-term: + level.Info(logger).Log("msg", "Received SIGTERM, exiting gracefully...") + return 0 + case <-srvc: + return 1 + } } }