Ctrl K
ComunidadGuías…

coderd/nats/metrics_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package nats_test

import (
	"context"
	"testing"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"

	"github.com/coder/coder/v2/coderd/database/pubsub"
	"github.com/coder/coder/v2/coderd/nats"
	"github.com/coder/coder/v2/testutil"
)

func TestPubsub_Metrics(t *testing.T) {
	t.Parallel()

	ctx := testutil.Context(t, testutil.WaitLong)
	registry := prometheus.NewRegistry()
	uut := newPubsub(t, nats.Options{Metrics: pubsub.NewMetrics(registry)})

	// Counters use lower-bound assertions because the exact values depend on
	// live traffic timing. The precise probe-exclusion behavior is covered by
	// TestMetrics_CountersExcludeLatencyChannel in the pubsub package.
	const backend = "nats"
	positive := func(in float64) bool { return in > 0 }

	metrics, err := registry.Gather()
	require.NoError(t, err)
	require.True(t, testutil.PromGaugeHasValue(t, metrics, 0, "coder_pubsub_current_events", backend))
	require.True(t, testutil.PromGaugeHasValue(t, metrics, 0, "coder_pubsub_current_subscribers", backend))

	event := "test"
	data := "testing"
	messageChannel := make(chan []byte)
	unsub0, err := uut.Subscribe(event, func(_ context.Context, message []byte) {
		messageChannel <- message
	})
	require.NoError(t, err)
	go func() {
		err := uut.Publish(event, []byte(data))
		assert.NoError(t, err)
	}()
	_ = testutil.TryReceive(ctx, t, messageChannel)

	require.Eventually(t, func() bool {
		metrics, err = registry.Gather()
		assert.NoError(t, err)
		return testutil.PromGaugeHasValue(t, metrics, 1, "coder_pubsub_current_events", backend) &&
			testutil.PromGaugeHasValue(t, metrics, 1, "coder_pubsub_current_subscribers", backend) &&
			testutil.PromGaugeHasValue(t, metrics, 1, "coder_pubsub_connected", backend) &&
			testutil.PromCounterAssertion(t, metrics, positive, "coder_pubsub_publishes_total", backend, "true") &&
			testutil.PromCounterAssertion(t, metrics, positive, "coder_pubsub_subscribes_total", backend, "true") &&
			testutil.PromCounterAssertion(t, metrics, positive, "coder_pubsub_messages_total", backend, "normal") &&
			testutil.PromCounterAssertion(t, metrics, positive, "coder_pubsub_received_bytes_total", backend) &&
			testutil.PromCounterAssertion(t, metrics, positive, "coder_pubsub_published_bytes_total", backend) &&
			testutil.PromHistogramSampleCount(t, metrics, "coder_pubsub_send_duration_seconds", backend) > 0 &&
			testutil.PromHistogramSampleCount(t, metrics, "coder_pubsub_receive_duration_seconds", backend) > 0 &&
			testutil.PromCounterAssertion(t, metrics, positive, "coder_pubsub_latency_measures_total", backend) &&
			testutil.PromCounterHasValue(t, metrics, 0, "coder_pubsub_latency_measure_errs_total", backend)
	}, testutil.WaitShort, testutil.IntervalFast)

	colossalSize := 7600
	colossalData := make([]byte, colossalSize)
	for i := range colossalData {
		colossalData[i] = 'q'
	}
	unsub1, err := uut.Subscribe(event, func(_ context.Context, message []byte) {
		messageChannel <- message
	})
	require.NoError(t, err)
	go func() {
		err := uut.Publish(event, colossalData)
		assert.NoError(t, err)
	}()
	// should get 2 messages because we have 2 subs
	_ = testutil.TryReceive(ctx, t, messageChannel)
	_ = testutil.TryReceive(ctx, t, messageChannel)

	require.Eventually(t, func() bool {
		metrics, err = registry.Gather()
		assert.NoError(t, err)
		return testutil.PromGaugeHasValue(t, metrics, 1, "coder_pubsub_current_events", backend) &&
			testutil.PromGaugeHasValue(t, metrics, 2, "coder_pubsub_current_subscribers", backend) &&
			testutil.PromGaugeHasValue(t, metrics, 1, "coder_pubsub_connected", backend) &&
			testutil.PromCounterHasValue(t, metrics, 1, "coder_pubsub_messages_total", backend, "colossal")
	}, testutil.WaitShort, testutil.IntervalFast)

	// Unsubscribing both local subscribers should decrement the subscriber
	// gauge back to 0, and removing the last subscriber on the event should
	// decrement the event gauge back to 0.
	unsub0()
	unsub1()

	require.Eventually(t, func() bool {
		metrics, err = registry.Gather()
		assert.NoError(t, err)
		return testutil.PromGaugeHasValue(t, metrics, 0, "coder_pubsub_current_events", backend) &&
			testutil.PromGaugeHasValue(t, metrics, 0, "coder_pubsub_current_subscribers", backend)
	}, testutil.WaitShort, testutil.IntervalFast)
}