Ability to disable debug endpoints (#1448)

This commit is contained in:
Jan-Otto Kröpke
2024-05-03 07:30:40 +02:00
committed by GitHub
parent 8f6a1e3f07
commit 5ff820cfd0

View File

@@ -11,7 +11,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
_ "net/http/pprof" "net/http/pprof"
"os" "os"
"os/user" "os/user"
"runtime" "runtime"
@@ -80,6 +80,10 @@ func main() {
"scrape.timeout-margin", "scrape.timeout-margin",
"Seconds to subtract from the timeout allowed by the client. Tune to allow for overhead or high loads.", "Seconds to subtract from the timeout allowed by the client. Tune to allow for overhead or high loads.",
).Default("0.5").Float64() ).Default("0.5").Float64()
debugEnabled = app.Flag(
"debug.enabled",
"If true, windows_exporter will expose debug endpoints under /debug/pprof.",
).Default("false").Bool()
) )
winlogConfig := &winlog.Config{} winlogConfig := &winlog.Config{}
@@ -174,15 +178,16 @@ func main() {
_ = level.Info(logger).Log("msg", fmt.Sprintf("Enabled collectors: %v", strings.Join(enabledCollectorList, ", "))) _ = level.Info(logger).Log("msg", fmt.Sprintf("Enabled collectors: %v", strings.Join(enabledCollectorList, ", ")))
http.HandleFunc(*metricsPath, withConcurrencyLimit(*maxRequests, collectors.BuildServeHTTP(*disableExporterMetrics, *timeoutMargin))) mux := http.NewServeMux()
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc(*metricsPath, withConcurrencyLimit(*maxRequests, collectors.BuildServeHTTP(*disableExporterMetrics, *timeoutMargin)))
mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
_, err := fmt.Fprintln(w, `{"status":"ok"}`) _, err := fmt.Fprintln(w, `{"status":"ok"}`)
if err != nil { if err != nil {
_ = level.Debug(logger).Log("Failed to write to stream", "err", err) _ = level.Debug(logger).Log("Failed to write to stream", "err", err)
} }
}) })
http.HandleFunc("/version", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("/version", func(w http.ResponseWriter, r *http.Request) {
// we can't use "version" directly as it is a package, and not an object that // we can't use "version" directly as it is a package, and not an object that
// can be serialized. // can be serialized.
err := json.NewEncoder(w).Encode(prometheusVersion{ err := json.NewEncoder(w).Encode(prometheusVersion{
@@ -197,6 +202,15 @@ func main() {
http.Error(w, fmt.Sprintf("error encoding JSON: %s", err), http.StatusInternalServerError) http.Error(w, fmt.Sprintf("error encoding JSON: %s", err), http.StatusInternalServerError)
} }
}) })
if *debugEnabled {
mux.HandleFunc("/debug/pprof/", pprof.Index)
mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
mux.HandleFunc("/debug/pprof/trace", pprof.Trace)
}
if *metricsPath != "/" && *metricsPath != "" { if *metricsPath != "/" && *metricsPath != "" {
landingConfig := web.LandingConfig{ landingConfig := web.LandingConfig{
Name: "Windows Exporter", Name: "Windows Exporter",
@@ -222,7 +236,7 @@ func main() {
_ = level.Error(logger).Log("msg", "failed to generate landing page", "err", err) _ = level.Error(logger).Log("msg", "failed to generate landing page", "err", err)
os.Exit(1) os.Exit(1)
} }
http.Handle("/", landingPage) mux.Handle("/", landingPage)
} }
_ = level.Info(logger).Log("msg", "Starting windows_exporter", "version", version.Info()) _ = level.Info(logger).Log("msg", "Starting windows_exporter", "version", version.Info())
@@ -230,7 +244,7 @@ func main() {
_ = level.Debug(logger).Log("msg", "Go MAXPROCS", "procs", runtime.GOMAXPROCS(0)) _ = level.Debug(logger).Log("msg", "Go MAXPROCS", "procs", runtime.GOMAXPROCS(0))
go func() { go func() {
server := &http.Server{} server := &http.Server{Handler: mux}
if err := web.ListenAndServe(server, webConfig, logger); err != nil { if err := web.ListenAndServe(server, webConfig, logger); err != nil {
_ = level.Error(logger).Log("msg", "cannot start windows_exporter", "err", err) _ = level.Error(logger).Log("msg", "cannot start windows_exporter", "err", err)
os.Exit(1) os.Exit(1)