feat: add coderd_api_websocket_probes_total metric (#25012)

Relates to CODAGT-115

Adds metric `coderd_api_websocket_probes_total`. Every successful
heartbeat for a given path will increment the metric.

Comparing this with `coderd_api_concurrent_websockets` will give an
indication of how many websocket connections are open but in a 'wedged'
state (when heartbeats stopped versus when we closed the connection).
This commit is contained in:
Cian Johnston
2026-06-03 10:46:07 +01:00
committed by GitHub
parent 7703e7a26e
commit 8b058dc949
22 changed files with 596 additions and 171 deletions
+13 -6
View File
@@ -22,6 +22,7 @@ import (
"github.com/coder/coder/v2/coderd/httpapi"
"github.com/coder/coder/v2/codersdk"
"github.com/coder/coder/v2/testutil"
"github.com/coder/quartz"
)
func TestInternalServerError(t *testing.T) {
@@ -245,7 +246,7 @@ func TestOneWayWebSocketEventSender(t *testing.T) {
req.Proto = p.proto
writer := newOneWayWriter(t)
_, _, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil))(writer, req)
_, _, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil), nil)(writer, req)
require.ErrorContains(t, err, p.proto)
}
})
@@ -254,9 +255,11 @@ func TestOneWayWebSocketEventSender(t *testing.T) {
t.Parallel()
ctx := testutil.Context(t, testutil.WaitShort)
wsw := httpapi.NewWSWatcher(quartz.NewReal(), nil)
req := newBaseRequest(ctx)
writer := newOneWayWriter(t)
send, _, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil))(writer, req)
send, _, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil), wsw)(writer, req)
require.NoError(t, err)
serverPayload := codersdk.ServerSentEvent{
@@ -280,9 +283,10 @@ func TestOneWayWebSocketEventSender(t *testing.T) {
t.Parallel()
ctx, cancel := context.WithCancel(testutil.Context(t, testutil.WaitShort))
wsw := httpapi.NewWSWatcher(quartz.NewReal(), nil)
req := newBaseRequest(ctx)
writer := newOneWayWriter(t)
_, done, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil))(writer, req)
_, done, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil), wsw)(writer, req)
require.NoError(t, err)
successC := make(chan bool)
@@ -304,9 +308,10 @@ func TestOneWayWebSocketEventSender(t *testing.T) {
t.Parallel()
ctx := testutil.Context(t, testutil.WaitShort)
wsw := httpapi.NewWSWatcher(quartz.NewReal(), nil)
req := newBaseRequest(ctx)
writer := newOneWayWriter(t)
_, done, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil))(writer, req)
_, done, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil), wsw)(writer, req)
require.NoError(t, err)
successC := make(chan bool)
@@ -334,9 +339,10 @@ func TestOneWayWebSocketEventSender(t *testing.T) {
t.Parallel()
ctx, cancel := context.WithCancel(testutil.Context(t, testutil.WaitShort))
wsw := httpapi.NewWSWatcher(quartz.NewReal(), nil)
req := newBaseRequest(ctx)
writer := newOneWayWriter(t)
send, done, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil))(writer, req)
send, done, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil), wsw)(writer, req)
require.NoError(t, err)
successC := make(chan bool)
@@ -375,9 +381,10 @@ func TestOneWayWebSocketEventSender(t *testing.T) {
timeout := hbDuration + (5 * time.Second)
ctx := testutil.Context(t, timeout)
wsw := httpapi.NewWSWatcher(quartz.NewReal(), nil)
req := newBaseRequest(ctx)
writer := newOneWayWriter(t)
_, _, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil))(writer, req)
_, _, err := httpapi.OneWayWebSocketEventSender(slogtest.Make(t, nil), wsw)(writer, req)
require.NoError(t, err)
type Result struct {