Files
netbird/proxy/internal/metrics/client_metrics_test.go
T

50 lines
1.5 KiB
Go

package metrics_test
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/metric/metricdata"
"github.com/netbirdio/netbird/proxy/internal/metrics"
)
func TestRegisterClientObserver(t *testing.T) {
reader := sdkmetric.NewManualReader()
provider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader))
m, err := metrics.New(context.Background(), provider.Meter("test"))
require.NoError(t, err)
clients := 2
require.NoError(t, m.RegisterClientObserver(func() int { return clients }))
var rm metricdata.ResourceMetrics
require.NoError(t, reader.Collect(context.Background(), &rm))
assert.Equal(t, int64(2), gaugeValue(t, rm, "proxy.clients.count"), "gauge must report the current client count")
clients = 1
require.NoError(t, reader.Collect(context.Background(), &rm))
assert.Equal(t, int64(1), gaugeValue(t, rm, "proxy.clients.count"), "gauge must follow the client count on the next collection")
}
func gaugeValue(t *testing.T, rm metricdata.ResourceMetrics, name string) int64 {
t.Helper()
for _, sm := range rm.ScopeMetrics {
for _, mtr := range sm.Metrics {
if mtr.Name != name {
continue
}
gauge, ok := mtr.Data.(metricdata.Gauge[int64])
require.True(t, ok, "%s must be an int64 gauge", name)
require.Len(t, gauge.DataPoints, 1, "%s must have a single data point", name)
return gauge.DataPoints[0].Value
}
}
t.Fatalf("gauge %s not found", name)
return 0
}