diff --git a/prometheus/promhttp/instrument_client.go b/prometheus/promhttp/instrument_client.go index 097aff2..57bb5f9 100644 --- a/prometheus/promhttp/instrument_client.go +++ b/prometheus/promhttp/instrument_client.go @@ -78,7 +78,6 @@ func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.Rou 1, rtOpts.getExemplarFn(r.Context()), ) - counter.With(labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...)).Inc() } return resp, err } diff --git a/prometheus/promhttp/instrument_client_test.go b/prometheus/promhttp/instrument_client_test.go index 98667e8..ce7c4da 100644 --- a/prometheus/promhttp/instrument_client_test.go +++ b/prometheus/promhttp/instrument_client_test.go @@ -25,6 +25,7 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/testutil" dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" @@ -250,6 +251,19 @@ func TestClientMiddlewareAPI_WithRequestContext(t *testing.T) { t.Errorf("metric family %s must not be empty", mf.GetName()) } } + + // make sure counters aren't double-incremented (see #1117) + expected := ` + # HELP client_api_requests_total A counter for requests from the wrapped client. + # TYPE client_api_requests_total counter + client_api_requests_total{code="200",method="get"} 1 + ` + + if err := testutil.GatherAndCompare(reg, strings.NewReader(expected), + "client_api_requests_total", + ); err != nil { + t.Fatal(err) + } } func TestClientMiddlewareAPIWithRequestContextTimeout(t *testing.T) {