Skip to content

Commit a8227d2

Browse files
committed
Unit tests
Signed-off-by: Ruben Vargas <[email protected]>
1 parent 5c4b7c9 commit a8227d2

File tree

1 file changed

+239
-0
lines changed

1 file changed

+239
-0
lines changed

pkg/crdmetrics/collector_test.go

+239
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
package crdmetrics
2+
3+
import (
4+
"context"
5+
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
6+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
11+
"go.opentelemetry.io/otel"
12+
"go.opentelemetry.io/otel/attribute"
13+
"go.opentelemetry.io/otel/sdk/metric"
14+
"go.opentelemetry.io/otel/sdk/metric/metricdata"
15+
"k8s.io/apimachinery/pkg/runtime"
16+
"k8s.io/client-go/kubernetes/scheme"
17+
"sigs.k8s.io/controller-runtime/pkg/client/fake"
18+
19+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
20+
)
21+
22+
type expectedMetric struct {
23+
name string
24+
labels []attribute.KeyValue
25+
value int64
26+
}
27+
28+
func assertLabelAndValues(t *testing.T, name string, metrics metricdata.ResourceMetrics, expectedAttrs []attribute.KeyValue, expectedValue int64) {
29+
var matchingMetric metricdata.Metrics
30+
found := false
31+
for _, sm := range metrics.ScopeMetrics {
32+
for _, m := range sm.Metrics {
33+
if m.Name == name {
34+
matchingMetric = m
35+
found = true
36+
break
37+
}
38+
}
39+
}
40+
41+
assert.True(t, found, "Metric %s not found", name)
42+
43+
gauge, ok := matchingMetric.Data.(metricdata.Gauge[int64])
44+
assert.True(t, ok,
45+
"Metric %s doesn't have expected type %T, got %T", metricdata.Gauge[int64]{}, matchingMetric.Data,
46+
)
47+
48+
expectedAttrSet := attribute.NewSet(expectedAttrs...)
49+
var matchingDP metricdata.DataPoint[int64]
50+
found = false
51+
for _, dp := range gauge.DataPoints {
52+
if expectedAttrSet.Equals(&dp.Attributes) {
53+
matchingDP = dp
54+
found = true
55+
break
56+
}
57+
}
58+
59+
assert.True(t, found, "Metric %s doesn't have expected attributes %v", expectedAttrs)
60+
assert.Equal(t, expectedValue, matchingDP.Value,
61+
"Metric %s doesn't have expected value %d, got %d", name, expectedValue, matchingDP.Value)
62+
}
63+
64+
func newExpectedMetric(name string, keyPair attribute.KeyValue, value int64) expectedMetric {
65+
return expectedMetric{
66+
name: name,
67+
labels: []attribute.KeyValue{
68+
keyPair,
69+
},
70+
value: value,
71+
}
72+
}
73+
74+
func TestValueObservedMetrics(t *testing.T) {
75+
s := scheme.Scheme
76+
77+
// Add jaeger to schema
78+
s.AddKnownTypes(v1alpha1.GroupVersion,
79+
&v1alpha1.OpenTelemetryCollector{},
80+
&v1alpha1.OpenTelemetryCollectorList{},
81+
&v1beta1.OpenTelemetryCollector{},
82+
&v1beta1.OpenTelemetryCollectorList{},
83+
)
84+
85+
collector1 := v1alpha1.OpenTelemetryCollector{
86+
ObjectMeta: metav1.ObjectMeta{
87+
Name: "collector1",
88+
Namespace: "otel",
89+
},
90+
Spec: v1alpha1.OpenTelemetryCollectorSpec{
91+
92+
Mode: v1alpha1.ModeSidecar,
93+
Config: `
94+
receivers:
95+
otlp:
96+
protocols:
97+
grpc:
98+
http:
99+
processors:
100+
memory_limiter:
101+
check_interval: 1s
102+
limit_percentage: 75
103+
spike_limit_percentage: 15
104+
batch:
105+
send_batch_size: 10000
106+
timeout: 10s
107+
108+
exporters:
109+
debug:
110+
111+
service:
112+
pipelines:
113+
traces:
114+
receivers: [otlp]
115+
processors: []
116+
exporters: [debug]
117+
`,
118+
},
119+
}
120+
121+
collector2 := v1alpha1.OpenTelemetryCollector{
122+
ObjectMeta: metav1.ObjectMeta{
123+
Name: "collector1",
124+
Namespace: "otel",
125+
},
126+
Spec: v1alpha1.OpenTelemetryCollectorSpec{
127+
128+
Mode: v1alpha1.ModeSidecar,
129+
Config: `
130+
receivers:
131+
otlp:
132+
protocols:
133+
grpc:
134+
http:
135+
processors:
136+
memory_limiter:
137+
check_interval: 1s
138+
limit_percentage: 75
139+
spike_limit_percentage: 15
140+
batch:
141+
send_batch_size: 10000
142+
timeout: 10s
143+
144+
exporters:
145+
debug:
146+
147+
service:
148+
pipelines:
149+
traces:
150+
receivers: [otlp]
151+
processors: []
152+
exporters: [debug]
153+
`,
154+
},
155+
}
156+
157+
collector3 := v1beta1.OpenTelemetryCollector{
158+
ObjectMeta: metav1.ObjectMeta{
159+
Name: "collector1",
160+
Namespace: "otel",
161+
},
162+
Spec: v1beta1.OpenTelemetryCollectorSpec{
163+
164+
Mode: v1beta1.ModeSidecar,
165+
Config: v1beta1.Config{
166+
Receivers: v1beta1.AnyConfig{map[string]interface{}{
167+
""
168+
}},
169+
},
170+
},
171+
}
172+
173+
objs := []runtime.Object{
174+
&tempoGCS,
175+
&tempoS3,
176+
&tempoOtherS3,
177+
&tempoUnmanaged,
178+
&tempoUnmanaged2,
179+
&tempoTenantOpenshift,
180+
&tempoTenantStatic,
181+
}
182+
expected := []expectedMetric{
183+
newExpectedMetric(managedMetric, attribute.String("state", string(v1alpha1.ManagementStateManaged)), 5),
184+
newExpectedMetric(managedMetric, attribute.String("state", string(v1alpha1.ManagementStateUnmanaged)), 2),
185+
newExpectedMetric(storageBackendMetric, attribute.String("type", string(v1alpha1.ObjectStorageSecretGCS)), 1),
186+
newExpectedMetric(storageBackendMetric, attribute.String("type", string(v1alpha1.ObjectStorageSecretS3)), 4),
187+
newExpectedMetric(storageBackendMetric, attribute.String("type", string(v1alpha1.ObjectStorageSecretAzure)), 2),
188+
newExpectedMetric(multitenancy, attribute.String("type", "disabled"), 5),
189+
newExpectedMetric(multitenancy, attribute.String("type", string(v1alpha1.ModeOpenShift)), 1),
190+
newExpectedMetric(multitenancy, attribute.String("type", string(v1alpha1.ModeStatic)), 1),
191+
newExpectedMetric(jaegerUIUsage, attribute.String("enabled", "true"), 1),
192+
newExpectedMetric(jaegerUIUsage, attribute.String("enabled", "false"), 6),
193+
}
194+
195+
cl := fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(objs...).Build()
196+
197+
reader := metric.NewManualReader()
198+
provider := metric.NewMeterProvider(metric.WithReader(reader))
199+
otel.SetMeterProvider(provider)
200+
201+
instancesObservedValue := newTempoStackMetrics(cl)
202+
err := instancesObservedValue.Setup()
203+
require.NoError(t, err)
204+
205+
metrics := metricdata.ResourceMetrics{}
206+
err = reader.Collect(context.Background(), &metrics)
207+
require.NoError(t, err)
208+
209+
for _, e := range expected {
210+
assertLabelAndValues(t, e.name, metrics, e.labels, e.value)
211+
}
212+
213+
// Test deleting GCS storage
214+
err = cl.Delete(context.Background(), &tempoGCS)
215+
require.NoError(t, err)
216+
217+
// Reset measurement batches
218+
err = provider.ForceFlush(context.Background())
219+
require.NoError(t, err)
220+
metrics = metricdata.ResourceMetrics{}
221+
err = reader.Collect(context.Background(), &metrics)
222+
require.NoError(t, err)
223+
224+
// Set new numbers
225+
expected = []expectedMetric{
226+
newExpectedMetric(managedMetric, attribute.String("state", string(v1alpha1.ManagementStateManaged)), 4),
227+
newExpectedMetric(managedMetric, attribute.String("state", string(v1alpha1.ManagementStateUnmanaged)), 2),
228+
newExpectedMetric(storageBackendMetric, attribute.String("type", string(v1alpha1.ObjectStorageSecretGCS)), 0),
229+
newExpectedMetric(storageBackendMetric, attribute.String("type", string(v1alpha1.ObjectStorageSecretS3)), 4),
230+
newExpectedMetric(storageBackendMetric, attribute.String("type", string(v1alpha1.ObjectStorageSecretAzure)), 2),
231+
newExpectedMetric(multitenancy, attribute.String("type", string(v1alpha1.ModeOpenShift)), 1),
232+
newExpectedMetric(multitenancy, attribute.String("type", string(v1alpha1.ModeStatic)), 1),
233+
newExpectedMetric(jaegerUIUsage, attribute.String("enabled", "true"), 0),
234+
newExpectedMetric(jaegerUIUsage, attribute.String("enabled", "false"), 6),
235+
}
236+
for _, e := range expected {
237+
assertLabelAndValues(t, e.name, metrics, e.labels, e.value)
238+
}
239+
}

0 commit comments

Comments
 (0)