Add option to limit concurrent requests
This commit is contained in:
parent
8231bc4395
commit
34996b206a
25
exporter.go
25
exporter.go
|
@ -265,6 +265,10 @@ func main() {
|
||||||
"telemetry.path",
|
"telemetry.path",
|
||||||
"URL path for surfacing collected metrics.",
|
"URL path for surfacing collected metrics.",
|
||||||
).Default("/metrics").String()
|
).Default("/metrics").String()
|
||||||
|
maxRequests = kingpin.Flag(
|
||||||
|
"telemetry.max-requests",
|
||||||
|
"Maximum number of concurrent requests. 0 to disable.",
|
||||||
|
).Default("5").Int()
|
||||||
enabledCollectors = kingpin.Flag(
|
enabledCollectors = kingpin.Flag(
|
||||||
"collectors.enabled",
|
"collectors.enabled",
|
||||||
"Comma-separated list of collectors to use. Use '[defaults]' as a placeholder for all the collectors enabled by default.").
|
"Comma-separated list of collectors to use. Use '[defaults]' as a placeholder for all the collectors enabled by default.").
|
||||||
|
@ -332,7 +336,7 @@ func main() {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
http.Handle(*metricsPath, h)
|
http.HandleFunc(*metricsPath, withConcurrencyLimit(*maxRequests, h.ServeHTTP))
|
||||||
http.HandleFunc("/health", healthCheck)
|
http.HandleFunc("/health", healthCheck)
|
||||||
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
http.Redirect(w, r, *metricsPath, http.StatusMovedPermanently)
|
http.Redirect(w, r, *metricsPath, http.StatusMovedPermanently)
|
||||||
|
@ -370,6 +374,25 @@ func keys(m map[string]collector.Collector) []string {
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func withConcurrencyLimit(n int, next http.HandlerFunc) http.HandlerFunc {
|
||||||
|
if n <= 0 {
|
||||||
|
return next
|
||||||
|
}
|
||||||
|
|
||||||
|
sem := make(chan struct{}, n)
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
select {
|
||||||
|
case sem <- struct{}{}:
|
||||||
|
defer func() { <-sem }()
|
||||||
|
default:
|
||||||
|
w.WriteHeader(http.StatusServiceUnavailable)
|
||||||
|
_, _ = w.Write([]byte("Too many concurrent requests"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
next(w, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type wmiExporterService struct {
|
type wmiExporterService struct {
|
||||||
stopCh chan<- bool
|
stopCh chan<- bool
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue