MCPcopy Index your code
hub / github.com/coder/coder / TestPrometheus

Function TestPrometheus

coderd/httpmw/prometheus_test.go:23–208  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

21)
22
23func TestPrometheus(t *testing.T) {
24 t.Parallel()
25
26 t.Run("All", func(t *testing.T) {
27 t.Parallel()
28 req := httptest.NewRequest("GET", "/", nil)
29 req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, chi.NewRouteContext()))
30 res := &tracing.StatusWriter{ResponseWriter: httptest.NewRecorder()}
31 reg := prometheus.NewRegistry()
32 httpmw.HTTPRoute(httpmw.Prometheus(reg)(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
33 w.WriteHeader(http.StatusOK)
34 }))).ServeHTTP(res, req)
35 metrics, err := reg.Gather()
36 require.NoError(t, err)
37 require.Greater(t, len(metrics), 0)
38 })
39
40 t.Run("Concurrent", func(t *testing.T) {
41 t.Parallel()
42 ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
43 defer cancel()
44
45 reg := prometheus.NewRegistry()
46 promMW := httpmw.Prometheus(reg)
47
48 // Create a test handler to simulate a WebSocket connection
49 testHandler := http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
50 conn, err := websocket.Accept(rw, r, nil)
51 if !assert.NoError(t, err, "failed to accept websocket") {
52 return
53 }
54 defer conn.Close(websocket.StatusGoingAway, "")
55 })
56
57 wrappedHandler := promMW(testHandler)
58
59 r := chi.NewRouter()
60 r.Use(tracing.StatusWriterMiddleware, httpmw.HTTPRoute, promMW)
61 r.Get("/api/v2/build/{build}/logs", func(rw http.ResponseWriter, r *http.Request) {
62 wrappedHandler.ServeHTTP(rw, r)
63 })
64
65 srv := httptest.NewServer(r)
66 defer srv.Close()
67 // nolint: bodyclose
68 conn, _, err := websocket.Dial(ctx, srv.URL+"/api/v2/build/1/logs", nil)
69 require.NoError(t, err, "failed to dial WebSocket")
70 defer conn.Close(websocket.StatusNormalClosure, "")
71
72 metrics, err := reg.Gather()
73 require.NoError(t, err)
74 require.Greater(t, len(metrics), 0)
75 metricLabels := getMetricLabels(metrics)
76
77 concurrentWebsockets, ok := metricLabels["coderd_api_concurrent_websockets"]
78 require.True(t, ok, "coderd_api_concurrent_websockets metric not found")
79 require.Equal(t, "/api/v2/build/{build}/logs", concurrentWebsockets["path"])
80 })

Callers

nothing calls this directly

Calls 15

CloseMethod · 0.95
HTTPRouteFunction · 0.92
PrometheusFunction · 0.92
getMetricLabelsFunction · 0.85
WithContextMethod · 0.80
RunMethod · 0.65
ContextMethod · 0.65
CloseMethod · 0.65
GetMethod · 0.65
DialMethod · 0.65
ServeHTTPMethod · 0.45
WriteHeaderMethod · 0.45

Tested by

no test coverage detected