fix(inputs.prometheus): Set the timeout for slow running API endpoints correctly (#12559)
This commit is contained in:
parent
2529d5fa16
commit
dc9eb02301
|
|
@ -163,6 +163,7 @@ func (p *Prometheus) Init() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
p.HTTPClientConfig.Timeout = p.ResponseTimeout
|
||||||
client, err := p.HTTPClientConfig.CreateClient(ctx, p.Log)
|
client, err := p.HTTPClientConfig.CreateClient(ctx, p.Log)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
package prometheus
|
package prometheus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/influxdata/telegraf/config"
|
||||||
"math"
|
"math"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
|
@ -137,6 +139,63 @@ func TestPrometheusGeneratesMetricsAlthoughFirstDNSFailsIntegration(t *testing.T
|
||||||
require.True(t, acc.HasTimestamp("test_metric", time.Unix(1490802350, 0)))
|
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) {
|
func TestPrometheusGeneratesSummaryMetricsV2(t *testing.T) {
|
||||||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
_, err := fmt.Fprintln(w, sampleSummaryTextFormat)
|
_, err := fmt.Fprintln(w, sampleSummaryTextFormat)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue