|
14 | 14 | package main
|
15 | 15 |
|
16 | 16 | import (
|
| 17 | + "errors" |
17 | 18 | "fmt"
|
18 | 19 | "net/http"
|
| 20 | + "net" |
19 | 21 | "os"
|
20 | 22 | "strings"
|
21 | 23 |
|
|
46 | 48 | 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()
|
47 | 49 | queriesPath = kingpin.Flag("extend.query-path", "Path to custom queries to run. (DEPRECATED)").Default("").Envar("PG_EXPORTER_EXTEND_QUERY_PATH").String()
|
48 | 50 | 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() |
49 | 52 | constantLabelsList = kingpin.Flag("constantLabels", "A list of label=value separated by comma(,). (DEPRECATED)").Default("").Envar("PG_EXPORTER_CONSTANT_LABELS").String()
|
50 | 53 | excludeDatabases = kingpin.Flag("exclude-databases", "A list of databases to remove when autoDiscoverDatabases is enabled (DEPRECATED)").Default("").Envar("PG_EXPORTER_EXCLUDE_DATABASES").String()
|
51 | 54 | 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() {
|
81 | 84 | return
|
82 | 85 | }
|
83 | 86 |
|
| 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 | + |
84 | 99 | if err := c.ReloadConfig(*configFile, logger); err != nil {
|
85 | 100 | // This is not fatal, but it means that auth must be provided for every dsn.
|
86 | 101 | level.Warn(logger).Log("msg", "Error loading config", "err", err)
|
@@ -174,3 +189,30 @@ func main() {
|
174 | 189 | os.Exit(1)
|
175 | 190 | }
|
176 | 191 | }
|
| 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