fix(inputs.prometheus): Set the timeout for slow running API endpoints correctly (#12559)

This commit is contained in:
Pascal Zimmermann 2023-01-30 15:52:54 +01:00 committed by GitHub
parent 2529d5fa16
commit dc9eb02301
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 60 additions and 0 deletions

View File

@ -163,6 +163,7 @@ func (p *Prometheus) Init() error {
}
ctx := context.Background()
p.HTTPClientConfig.Timeout = p.ResponseTimeout
client, err := p.HTTPClientConfig.CreateClient(ctx, p.Log)
if err != nil {
return err

View File

@ -1,7 +1,9 @@
package prometheus
import (
"errors"
"fmt"
"github.com/influxdata/telegraf/config"
"math"
"net/http"
"net/http/httptest"
@ -137,6 +139,63 @@ func TestPrometheusGeneratesMetricsAlthoughFirstDNSFailsIntegration(t *testing.T
require.True(t, acc.HasTimestamp("test_metric", time.Unix(1490802350, 0)))
}
func TestPrometheusGeneratesMetricsSlowEndpoint(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
time.Sleep(4 * time.Second)
_, err := fmt.Fprintln(w, sampleTextFormat)
require.NoError(t, err)
}))
defer ts.Close()
p := &Prometheus{
Log: testutil.Logger{},
URLs: []string{ts.URL},
URLTag: "url",
ResponseTimeout: config.Duration(time.Second * 5),
}
err := p.Init()
require.NoError(t, err)
var acc testutil.Accumulator
err = acc.GatherError(p.Gather)
require.NoError(t, err)
require.True(t, acc.HasFloatField("go_gc_duration_seconds", "count"))
require.True(t, acc.HasFloatField("go_goroutines", "gauge"))
require.True(t, acc.HasFloatField("test_metric", "value"))
require.True(t, acc.HasTimestamp("test_metric", time.Unix(1490802350, 0)))
require.False(t, acc.HasTag("test_metric", "address"))
require.True(t, acc.TagValue("test_metric", "url") == ts.URL+"/metrics")
}
func TestPrometheusGeneratesMetricsSlowEndpointHitTheTimeout(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
time.Sleep(6 * time.Second)
_, err := fmt.Fprintln(w, sampleTextFormat)
require.NoError(t, err)
}))
defer ts.Close()
p := &Prometheus{
Log: testutil.Logger{},
URLs: []string{ts.URL},
URLTag: "url",
ResponseTimeout: config.Duration(time.Second * 5),
}
err := p.Init()
require.NoError(t, err)
var acc testutil.Accumulator
err = acc.GatherError(p.Gather)
errMessage := fmt.Sprintf("error making HTTP request to %s/metrics: Get \"%s/metrics\": "+
"context deadline exceeded (Client.Timeout exceeded while awaiting headers)", ts.URL, ts.URL)
errExpected := errors.New(errMessage)
require.Equal(t, errExpected, err)
require.Error(t, err)
}
func TestPrometheusGeneratesSummaryMetricsV2(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, err := fmt.Fprintln(w, sampleSummaryTextFormat)