5
5
"testing"
6
6
7
7
"github.com/stretchr/testify/assert"
8
+ "github.com/stretchr/testify/require"
8
9
"go.opentelemetry.io/collector/pdata/pcommon"
9
10
"go.opentelemetry.io/collector/pdata/ptrace"
10
11
)
@@ -31,23 +32,66 @@ func TestTemplatedGenerator_Traces(t *testing.T) {
31
32
gen , err := NewTemplatedGenerator (& template )
32
33
assert .NoError (t , err )
33
34
34
- for i := 0 ; i < testRounds ; i ++ {
35
- traces := gen .Traces ()
36
- spans := collectSpansFromTrace (traces )
37
-
38
- assert .Len (t , spans , len (template .Spans ))
39
- for i , span := range spans {
40
- assert .GreaterOrEqual (t , attributesWithPrefix (span , "k6." ), template .Defaults .RandomAttributes .Count )
35
+ for range testRounds {
36
+ count := 0
37
+ for i , span := range iterSpans (gen .Traces ()) {
38
+ count ++
39
+ requireAttributeCountGreaterOrEqual (t , span .Attributes (), 3 , "k6." )
41
40
if template .Spans [i ].Name != nil {
42
41
assert .Equal (t , * template .Spans [i ].Name , span .Name ())
43
42
}
44
43
if span .Kind () != ptrace .SpanKindInternal {
45
- assert . GreaterOrEqual (t , attributesWithPrefix ( span , "net." ), 3 )
44
+ requireAttributeCountGreaterOrEqual (t , span . Attributes (), 3 , "net." )
46
45
if * template .Defaults .AttributeSemantics == SemanticsHTTP {
47
- assert . GreaterOrEqual (t , attributesWithPrefix ( span , "http." ), 5 )
46
+ requireAttributeCountGreaterOrEqual (t , span . Attributes (), 5 , "http." )
48
47
}
49
48
}
50
49
}
50
+ assert .Equal (t , len (template .Spans ), count , "unexpected number of spans" )
51
+ }
52
+ }
53
+ }
54
+
55
+ func TestTemplatedGenerator_Resource (t * testing.T ) {
56
+ template := TraceTemplate {
57
+ Defaults : SpanDefaults {
58
+ Attributes : map [string ]interface {}{"span-attr" : "val-01" },
59
+ Resource : & ResourceTemplate {RandomAttributes : & AttributeParams {Count : 2 }},
60
+ },
61
+ Spans : []SpanTemplate {
62
+ {Service : "test-service-a" , Name : ptr ("action-a-a" ), Resource : & ResourceTemplate {
63
+ Attributes : map [string ]interface {}{"res-attr-01" : "res-val-01" },
64
+ RandomAttributes : & AttributeParams {Count : 5 },
65
+ }},
66
+ {Service : "test-service-a" , Name : ptr ("action-a-b" ), Resource : & ResourceTemplate {
67
+ Attributes : map [string ]interface {}{"res-attr-02" : "res-val-02" },
68
+ }},
69
+ {Service : "test-service-b" , Name : ptr ("action-b-a" ), Resource : & ResourceTemplate {
70
+ Attributes : map [string ]interface {}{"res-attr-03" : "res-val-03" },
71
+ }},
72
+ {Service : "test-service-b" , Name : ptr ("action-b-b" )},
73
+ },
74
+ }
75
+
76
+ gen , err := NewTemplatedGenerator (& template )
77
+ require .NoError (t , err )
78
+
79
+ for range testRounds {
80
+ for _ , res := range iterResources (gen .Traces ()) {
81
+ srv , found := res .Attributes ().Get ("service.name" )
82
+ require .True (t , found , "service.name not found" )
83
+
84
+ switch srv .Str () {
85
+ case "test-service-a" :
86
+ requireAttributeCountEqual (t , res .Attributes (), 5 , "k6." )
87
+ requireAttributeEqual (t , res .Attributes (), "res-attr-01" , "res-val-01" )
88
+ requireAttributeEqual (t , res .Attributes (), "res-attr-02" , "res-val-02" )
89
+ case "test-service-b" :
90
+ requireAttributeCountEqual (t , res .Attributes (), 3 , "k6." )
91
+ requireAttributeEqual (t , res .Attributes (), "res-attr-03" , "res-val-03" )
92
+ default :
93
+ require .Fail (t , "unexpected service name %s" , srv .Str ())
94
+ }
51
95
}
52
96
}
53
97
}
@@ -76,12 +120,10 @@ func TestTemplatedGenerator_EventsLinks(t *testing.T) {
76
120
gen , err := NewTemplatedGenerator (& template )
77
121
assert .NoError (t , err )
78
122
79
- for i := 0 ; i < testRounds ; i ++ {
80
- traces := gen .Traces ()
81
- spans := collectSpansFromTrace (traces )
82
-
83
- assert .Len (t , spans , len (template .Spans ))
84
- for _ , span := range spans {
123
+ for range testRounds {
124
+ count := 0
125
+ for _ , span := range iterSpans (gen .Traces ()) {
126
+ count ++
85
127
events := span .Events ()
86
128
links := span .Links ()
87
129
checkEventsLinksLength := func (expectedTemplate , expectedRandom int , spanName string ) {
@@ -144,33 +186,79 @@ func TestTemplatedGenerator_EventsLinks(t *testing.T) {
144
186
assert .True (t , found , "exception event not found" )
145
187
}
146
188
}
189
+ assert .Equal (t , len (template .Spans ), count , "unexpected number of spans" )
147
190
}
148
191
}
149
192
}
150
193
151
- func attributesWithPrefix (span ptrace.Span , prefix string ) int {
152
- var count int
153
- span .Attributes ().Range (func (k string , _ pcommon.Value ) bool {
154
- if strings .HasPrefix (k , prefix ) {
155
- count ++
194
+ func iterSpans (traces ptrace.Traces ) func (func (i int , e ptrace.Span ) bool ) {
195
+ count := 0
196
+ return func (f func (i int , e ptrace.Span ) bool ) {
197
+ var elem ptrace.Span
198
+ for i := 0 ; i < traces .ResourceSpans ().Len (); i ++ {
199
+ rs := traces .ResourceSpans ().At (i )
200
+ for j := 0 ; j < rs .ScopeSpans ().Len (); j ++ {
201
+ ss := rs .ScopeSpans ().At (j )
202
+ for k := 0 ; k < ss .Spans ().Len (); k ++ {
203
+ elem = ss .Spans ().At (k )
204
+ if ! f (count , elem ) {
205
+ return
206
+ }
207
+ count ++
208
+ }
209
+ }
156
210
}
157
- return true
158
- })
159
- return count
211
+ }
160
212
}
161
213
162
- func collectSpansFromTrace (traces ptrace.Traces ) []ptrace. Span {
163
- var spans []ptrace. Span
164
- for i := 0 ; i < traces . ResourceSpans (). Len (); i ++ {
165
- rs := traces .ResourceSpans ().At ( i )
166
- for j := 0 ; j < rs . ScopeSpans ().Len (); j ++ {
167
- ss : = rs .ScopeSpans (). At ( j )
168
- for k := 0 ; k < ss . Spans (). Len (); k ++ {
169
- spans = append ( spans , ss . Spans (). At ( k ))
214
+ func iterResources (traces ptrace.Traces ) func ( func ( i int , e pcommon. Resource ) bool ) {
215
+ return func ( f func ( i int , e pcommon. Resource ) bool ) {
216
+ var elem pcommon. Resource
217
+ for i := 0 ; i < traces .ResourceSpans ().Len (); i ++ {
218
+ rs := traces . ResourceSpans ().At ( i )
219
+ elem = rs .Resource ( )
220
+ if ! f ( i , elem ) {
221
+ return
170
222
}
171
223
}
172
224
}
173
- return spans
225
+ }
226
+
227
+ func requireAttributeCountGreaterOrEqual (t * testing.T , attributes pcommon.Map , compare int , prefixes ... string ) {
228
+ t .Helper ()
229
+ count := countAttributes (attributes , prefixes ... )
230
+ require .GreaterOrEqual (t , count , compare , "expected at least %d attributes, got %d" , compare , count )
231
+ }
232
+
233
+ func requireAttributeCountEqual (t * testing.T , attributes pcommon.Map , expected int , prefixes ... string ) {
234
+ t .Helper ()
235
+ count := countAttributes (attributes , prefixes ... )
236
+ require .GreaterOrEqual (t , expected , count , "expected at least %d attributes, got %d" , expected , count )
237
+ }
238
+
239
+ func requireAttributeEqual (t * testing.T , attributes pcommon.Map , key string , expected any ) {
240
+ t .Helper ()
241
+ val , found := attributes .Get (key )
242
+ require .True (t , found , "attribute %s not found" , key )
243
+ require .Equal (t , expected , val .AsRaw (), "value %v expected for attribute %s but was %v" , expected , key , val .AsRaw ())
244
+ }
245
+
246
+ func countAttributes (attributes pcommon.Map , prefixes ... string ) int {
247
+ var count int
248
+ attributes .Range (func (k string , _ pcommon.Value ) bool {
249
+ if len (prefixes ) == 0 {
250
+ count ++
251
+ return true
252
+ }
253
+
254
+ for _ , prefix := range prefixes {
255
+ if strings .HasPrefix (k , prefix ) {
256
+ count ++
257
+ }
258
+ }
259
+ return true
260
+ })
261
+ return count
174
262
}
175
263
176
264
func ptr [T any ](v T ) * T {
0 commit comments