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
+               }
        }
 }

Reply via email to