1package telemetry
2
3import (
4 "context"
5 "errors"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10 "go.opentelemetry.io/otel"
11 sdkmetric "go.opentelemetry.io/otel/sdk/metric"
12 "go.opentelemetry.io/otel/sdk/metric/metricdata"
13)
14
15func collectManaged(t *testing.T, reader *sdkmetric.ManualReader) (int64, bool) {
16 t.Helper()
17 var rm metricdata.ResourceMetrics
18 require.NoError(t, reader.Collect(context.Background(), &rm))
19 for _, sm := range rm.ScopeMetrics {
20 for _, m := range sm.Metrics {
21 if m.Name != "gordon.container.managed" {
22 continue
23 }
24 gauge, ok := m.Data.(metricdata.Gauge[int64])
25 require.True(t, ok)
26 require.Len(t, gauge.DataPoints, 1)
27 assert.Equal(t, 0, gauge.DataPoints[0].Attributes.Len(), "gauge must stay label-free")
28 return gauge.DataPoints[0].Value, true
29 }
30 }
31 return 0, false
32}
33
34func TestObserveManagedContainers(t *testing.T) {
35 reader := sdkmetric.NewManualReader()
36 prev := otel.GetMeterProvider()
37 otel.SetMeterProvider(sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)))
38 t.Cleanup(func() { otel.SetMeterProvider(prev) })
39
40 m, err := NewMetrics()
41 require.NoError(t, err)
42
43 current := int64(3)
44 var countErr error
45 require.NoError(t, m.ObserveManagedContainers(func(context.Context) (int64, error) {
46 return current, countErr
47 }))
48
49 v, ok := collectManaged(t, reader)
50 require.True(t, ok)
51 assert.Equal(t, int64(3), v)
52
53 current = 1
54 v, ok = collectManaged(t, reader)
55 require.True(t, ok)
56 assert.Equal(t, int64(1), v)
57
58 // A failed count skips the observation instead of exporting a wrong value.
59 countErr = errors.New("state unavailable")
60 var rm metricdata.ResourceMetrics
61 _ = reader.Collect(context.Background(), &rm)
62 for _, sm := range rm.ScopeMetrics {
63 for _, metric := range sm.Metrics {
64 assert.NotEqual(t, "gordon.container.managed", metric.Name)
65 }
66 }
67}