Skip to content

Commit f72272f

Browse files
committed
chore: (pre-release) add health check command
1 parent b0d16dc commit f72272f

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

cmd/postgres_exporter/main.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
package main
1515

1616
import (
17+
"errors"
1718
"fmt"
1819
"net/http"
20+
"net"
1921
"os"
2022
"strings"
2123

@@ -46,6 +48,7 @@ var (
4648
autoDiscoverDatabases = kingpin.Flag("auto-discover-databases", "Whether to discover the databases on a server dynamically. (DEPRECATED)").Default("false").Envar("PG_EXPORTER_AUTO_DISCOVER_DATABASES").Bool()
4749
queriesPath = kingpin.Flag("extend.query-path", "Path to custom queries to run. (DEPRECATED)").Default("").Envar("PG_EXPORTER_EXTEND_QUERY_PATH").String()
4850
onlyDumpMaps = kingpin.Flag("dumpmaps", "Do not run, simply dump the maps.").Bool()
51+
onlyHealthCheck = kingpin.Flag("healthcheck", "Do not run, just return if up and running.").Bool()
4952
constantLabelsList = kingpin.Flag("constantLabels", "A list of label=value separated by comma(,). (DEPRECATED)").Default("").Envar("PG_EXPORTER_CONSTANT_LABELS").String()
5053
excludeDatabases = kingpin.Flag("exclude-databases", "A list of databases to remove when autoDiscoverDatabases is enabled (DEPRECATED)").Default("").Envar("PG_EXPORTER_EXCLUDE_DATABASES").String()
5154
includeDatabases = kingpin.Flag("include-databases", "A list of databases to include when autoDiscoverDatabases is enabled (DEPRECATED)").Default("").Envar("PG_EXPORTER_INCLUDE_DATABASES").String()
@@ -81,6 +84,18 @@ func main() {
8184
return
8285
}
8386

87+
if *onlyHealthCheck {
88+
healthy, err := runHealthCheck(webConfig)
89+
if err != nil {
90+
level.Error(logger).Log("msg", "error running health check", "err", err)
91+
}
92+
if healthy {
93+
level.Info(logger).Log("msg", "health ok")
94+
os.Exit(0)
95+
}
96+
os.Exit(1)
97+
}
98+
8499
if err := c.ReloadConfig(*configFile, logger); err != nil {
85100
// This is not fatal, but it means that auth must be provided for every dsn.
86101
level.Warn(logger).Log("msg", "Error loading config", "err", err)
@@ -174,3 +189,30 @@ func main() {
174189
os.Exit(1)
175190
}
176191
}
192+
193+
func runHealthCheck(webConfig *web.FlagConfig) (bool, error) {
194+
if len(*webConfig.WebListenAddresses) == 0 {
195+
return false, errors.New("no listen addresses to run the request to")
196+
}
197+
addr := (*webConfig.WebListenAddresses)[0]
198+
host, port, err := net.SplitHostPort(addr)
199+
if err != nil {
200+
return false, err
201+
}
202+
if host == "" {
203+
host = "localhost"
204+
}
205+
url := fmt.Sprintf("http://%s:%s/", host, port)
206+
req, err := http.NewRequest("GET", url, nil)
207+
if err != nil {
208+
return false, err
209+
}
210+
211+
resp, err := http.DefaultClient.Do(req)
212+
if err != nil {
213+
return false, err
214+
}
215+
216+
defer resp.Body.Close()
217+
return resp.StatusCode == 200, nil
218+
}

0 commit comments

Comments
 (0)