Skip to content

Commit de793b8

Browse files
committed
Fix parsing of X-Prometheus-Scrape-Timeout-Seconds header
The previous implementation expected this header to be an integer, but vmagent may send it as a float. This caused incorrect handling in `mongodb_exporter`. Updated to support float values.
1 parent d761c95 commit de793b8

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

exporter/exporter.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -300,20 +300,25 @@ func (e *Exporter) getClient(ctx context.Context) (*mongo.Client, error) {
300300
// run for hooking up custom HTTP servers.
301301
func (e *Exporter) Handler() http.Handler {
302302
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
303-
seconds, err := strconv.Atoi(r.Header.Get("X-Prometheus-Scrape-Timeout-Seconds"))
304-
// To support older ones vmagents.
305-
if err != nil {
306-
seconds = 10
303+
scrapeTimeoutHeader := r.Header.Get("X-Prometheus-Scrape-Timeout-Seconds")
304+
seconds := 10.0
305+
306+
if scrapeTimeoutHeader != "" {
307+
if parsedSeconds, err := strconv.ParseFloat(scrapeTimeoutHeader, 64); err == nil {
308+
seconds = parsedSeconds
309+
} else {
310+
e.logger.Info("Invalid X-Prometheus-Timeout-Scrape-Timeout-Seconds header", "error", err)
311+
}
307312
}
308-
seconds -= e.opts.TimeoutOffset
313+
seconds -= float64(e.opts.TimeoutOffset)
309314

310315
var client *mongo.Client
311-
ctx, cancel := context.WithTimeout(r.Context(), time.Duration(seconds)*time.Second)
316+
ctx, cancel := context.WithTimeout(r.Context(), time.Duration(seconds*float64(time.Second)))
312317
defer cancel()
313318

314319
requestOpts := GetRequestOpts(r.URL.Query()["collect[]"], e.opts)
315320

316-
client, err = e.getClient(ctx)
321+
client, err := e.getClient(ctx)
317322
if err != nil {
318323
e.logger.Error("Cannot connect to MongoDB", "error", err)
319324
}

0 commit comments

Comments
 (0)