grafana_bak/pkg/infra/httpclient/httpclientprovider/prometheus_metrics_middleware_test.go
2025-04-01 10:38:02 +09:00

95 lines
3.1 KiB
Go

package httpclientprovider
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
"github.com/prometheus/client_golang/prometheus/testutil"
"github.com/stretchr/testify/require"
)
func TestPrometheusMetricsMiddleware(t *testing.T) {
noOpHandlerFunc := func(writer http.ResponseWriter, request *http.Request) {}
for _, tc := range []struct {
name string
handler http.HandlerFunc
assert func(t *testing.T, metrics *PrometheusMetrics)
}{
{
name: "successful",
assert: func(t *testing.T, metrics *PrometheusMetrics) {
require.Equal(t, float64(0), testutil.ToFloat64(metrics.inFlightGauge))
require.Equal(t, float64(1), testutil.ToFloat64(metrics.requestsCounter))
require.Equal(t, float64(0), testutil.ToFloat64(metrics.failureCounter))
},
},
{
name: "failure",
handler: func(writer http.ResponseWriter, request *http.Request) {
writer.WriteHeader(http.StatusInternalServerError)
},
assert: func(t *testing.T, metrics *PrometheusMetrics) {
require.Equal(t, float64(0), testutil.ToFloat64(metrics.inFlightGauge))
require.Equal(t, float64(1), testutil.ToFloat64(metrics.requestsCounter))
require.Equal(t, float64(1), testutil.ToFloat64(metrics.failureCounter))
},
},
} {
t.Run(tc.name, func(t *testing.T) {
// Create metrics and make sure they are 0
metrics := NewPrometheusMetricsMiddleware("test")
require.Equal(t, float64(0), testutil.ToFloat64(metrics.inFlightGauge))
require.Equal(t, float64(0), testutil.ToFloat64(metrics.requestsCounter))
require.Equal(t, float64(0), testutil.ToFloat64(metrics.failureCounter))
// Set up test server
// Default to noOpHandlerFunc if it's not provided in test case
h := tc.handler
if h == nil {
h = noOpHandlerFunc
}
srv := httptest.NewServer(h)
t.Cleanup(srv.Close)
// Make request with the prometheus handling middleware
cl, err := httpclient.New(httpclient.Options{
Middlewares: []httpclient.Middleware{PrometheusMetricsMiddleware(metrics)},
})
require.NoError(t, err)
resp, err := cl.Get(srv.URL)
defer func() { _ = resp.Body.Close() }()
require.NoError(t, err)
require.NotNil(t, resp)
// Run test-case-specific assertions
tc.assert(t, metrics)
})
}
t.Run("in flight", func(t *testing.T) {
metrics := NewPrometheusMetricsMiddleware("test")
require.Equal(t, float64(0), testutil.ToFloat64(metrics.inFlightGauge))
srv := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
// Assert in-flight requests
require.Equal(t, float64(1), testutil.ToFloat64(metrics.inFlightGauge), "in flight should increase during request")
}))
t.Cleanup(srv.Close)
cl, err := httpclient.New(httpclient.Options{
Middlewares: []httpclient.Middleware{PrometheusMetricsMiddleware(metrics)},
})
require.NoError(t, err)
resp, err := cl.Get(srv.URL)
defer func() { _ = resp.Body.Close() }()
require.NoError(t, err)
require.NotNil(t, resp)
require.Equal(t, float64(0), testutil.ToFloat64(metrics.inFlightGauge), "in flight should decrease after response")
})
}