Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/traces/servicegraphprocessor/processor_test.go
4095 views
1
package servicegraphprocessor
2
3
import (
4
"bytes"
5
"context"
6
"os"
7
"testing"
8
"time"
9
10
"github.com/grafana/agent/pkg/traces/contextkeys"
11
"github.com/prometheus/client_golang/prometheus"
12
"github.com/prometheus/client_golang/prometheus/testutil"
13
"github.com/stretchr/testify/assert"
14
"github.com/stretchr/testify/require"
15
"go.opentelemetry.io/collector/consumer"
16
"go.opentelemetry.io/collector/pdata/ptrace"
17
)
18
19
const (
20
traceSamplePath = "testdata/trace-sample.json"
21
unpairedTraceSamplePath = "testdata/unpaired-trace-sample.json"
22
)
23
24
func TestConsumeMetrics(t *testing.T) {
25
for _, tc := range []struct {
26
name string
27
sampleDataPath string
28
cfg *Config
29
expectedMetrics string
30
}{
31
{
32
name: "happy case",
33
sampleDataPath: traceSamplePath,
34
cfg: &Config{
35
Wait: time.Hour,
36
},
37
expectedMetrics: happyCaseExpectedMetrics,
38
},
39
{
40
name: "unpaired spans",
41
sampleDataPath: unpairedTraceSamplePath,
42
cfg: &Config{
43
Wait: -time.Millisecond,
44
},
45
expectedMetrics: `
46
# HELP traces_service_graph_unpaired_spans_total Total count of unpaired spans
47
# TYPE traces_service_graph_unpaired_spans_total counter
48
traces_service_graph_unpaired_spans_total{client="",server="db"} 2
49
traces_service_graph_unpaired_spans_total{client="app",server=""} 3
50
traces_service_graph_unpaired_spans_total{client="lb",server=""} 3
51
`,
52
},
53
{
54
name: "max items in storeMap is reached",
55
sampleDataPath: traceSamplePath,
56
cfg: &Config{
57
Wait: -time.Millisecond,
58
MaxItems: 1, // Configure max number of items in storeMap to 1. Only one edge will be processed.
59
},
60
expectedMetrics: droppedSpansCaseMetrics,
61
},
62
{
63
name: `success codes`,
64
sampleDataPath: traceSamplePath,
65
cfg: &Config{
66
Wait: -time.Millisecond,
67
SuccessCodes: &successCodes{
68
http: []int64{404},
69
},
70
},
71
expectedMetrics: successCodesCaseMetrics,
72
},
73
} {
74
t.Run(tc.name, func(t *testing.T) {
75
p := newProcessor(&mockConsumer{}, tc.cfg)
76
close(p.closeCh) // Don't collect any edges, leave that to the test.
77
78
reg := prometheus.NewRegistry()
79
ctx := context.WithValue(context.Background(), contextkeys.PrometheusRegisterer, reg)
80
81
err := p.Start(ctx, nil)
82
require.NoError(t, err)
83
84
traces := traceSamples(t, tc.sampleDataPath)
85
err = p.ConsumeTraces(context.Background(), traces)
86
require.NoError(t, err)
87
88
collectMetrics(p)
89
90
assert.Eventually(t, func() bool {
91
return testutil.GatherAndCompare(reg, bytes.NewBufferString(tc.expectedMetrics)) == nil
92
}, time.Second, time.Millisecond*100)
93
err = testutil.GatherAndCompare(reg, bytes.NewBufferString(tc.expectedMetrics))
94
require.NoError(t, err)
95
})
96
}
97
}
98
99
func traceSamples(t *testing.T, path string) ptrace.Traces {
100
b, err := os.ReadFile(path)
101
require.NoError(t, err)
102
103
decoder := &ptrace.JSONUnmarshaler{}
104
traces, err := decoder.UnmarshalTraces(b)
105
require.NoError(t, err)
106
107
return traces
108
}
109
110
// helper function to force collection of all metrics
111
func collectMetrics(p *processor) {
112
p.store.mtx.Lock()
113
defer p.store.mtx.Unlock()
114
115
for h := p.store.l.Front(); h != nil; h = p.store.l.Front() {
116
edge := h.Value.(*edge)
117
p.collectEdge(edge)
118
delete(p.store.m, edge.key)
119
p.store.l.Remove(h)
120
}
121
}
122
123
type mockConsumer struct{}
124
125
func (m *mockConsumer) Capabilities() consumer.Capabilities { return consumer.Capabilities{} }
126
127
func (m *mockConsumer) ConsumeTraces(context.Context, ptrace.Traces) error { return nil }
128
129
const (
130
happyCaseExpectedMetrics = `
131
# HELP traces_service_graph_request_client_seconds Time for a request between two nodes as seen from the client
132
# TYPE traces_service_graph_request_client_seconds histogram
133
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.01"} 0
134
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.02"} 0
135
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.04"} 0
136
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.08"} 0
137
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.16"} 0
138
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.32"} 0
139
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.64"} 0
140
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="1.28"} 2
141
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="2.56"} 3
142
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="5.12"} 3
143
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="10.24"} 3
144
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="20.48"} 3
145
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="+Inf"} 3
146
traces_service_graph_request_client_seconds_sum{client="app",server="db"} 4.4
147
traces_service_graph_request_client_seconds_count{client="app",server="db"} 3
148
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.01"} 0
149
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.02"} 0
150
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.04"} 0
151
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.08"} 0
152
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.16"} 0
153
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.32"} 0
154
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.64"} 0
155
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="1.28"} 0
156
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="2.56"} 2
157
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="5.12"} 3
158
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="10.24"} 3
159
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="20.48"} 3
160
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="+Inf"} 3
161
traces_service_graph_request_client_seconds_sum{client="lb",server="app"} 7.8
162
traces_service_graph_request_client_seconds_count{client="lb",server="app"} 3
163
# HELP traces_service_graph_request_failed_total Total count of failed requests between two nodes
164
# TYPE traces_service_graph_request_failed_total counter
165
traces_service_graph_request_failed_total{client="lb",server="app"} 2
166
# HELP traces_service_graph_request_server_seconds Time for a request between two nodes as seen from the server
167
# TYPE traces_service_graph_request_server_seconds histogram
168
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.01"} 0
169
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.02"} 0
170
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.04"} 0
171
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.08"} 0
172
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.16"} 0
173
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.32"} 0
174
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.64"} 0
175
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="1.28"} 1
176
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="2.56"} 3
177
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="5.12"} 3
178
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="10.24"} 3
179
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="20.48"} 3
180
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="+Inf"} 3
181
traces_service_graph_request_server_seconds_sum{client="app",server="db"} 5
182
traces_service_graph_request_server_seconds_count{client="app",server="db"} 3
183
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.01"} 0
184
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.02"} 0
185
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.04"} 0
186
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.08"} 0
187
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.16"} 0
188
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.32"} 0
189
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.64"} 0
190
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="1.28"} 1
191
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="2.56"} 2
192
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="5.12"} 3
193
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="10.24"} 3
194
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="20.48"} 3
195
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="+Inf"} 3
196
traces_service_graph_request_server_seconds_sum{client="lb",server="app"} 6.2
197
traces_service_graph_request_server_seconds_count{client="lb",server="app"} 3
198
# HELP traces_service_graph_request_total Total count of requests between two nodes
199
# TYPE traces_service_graph_request_total counter
200
traces_service_graph_request_total{client="app",server="db"} 3
201
traces_service_graph_request_total{client="lb",server="app"} 3
202
`
203
droppedSpansCaseMetrics = `
204
# HELP traces_service_graph_dropped_spans_total Total count of dropped spans
205
# TYPE traces_service_graph_dropped_spans_total counter
206
traces_service_graph_dropped_spans_total{client="",server="app"} 2
207
traces_service_graph_dropped_spans_total{client="",server="db"} 3
208
traces_service_graph_dropped_spans_total{client="app",server=""} 3
209
traces_service_graph_dropped_spans_total{client="lb",server=""} 2
210
# HELP traces_service_graph_request_client_seconds Time for a request between two nodes as seen from the client
211
# TYPE traces_service_graph_request_client_seconds histogram
212
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.01"} 0
213
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.02"} 0
214
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.04"} 0
215
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.08"} 0
216
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.16"} 0
217
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.32"} 0
218
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.64"} 0
219
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="1.28"} 0
220
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="2.56"} 1
221
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="5.12"} 1
222
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="10.24"} 1
223
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="20.48"} 1
224
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="+Inf"} 1
225
traces_service_graph_request_client_seconds_sum{client="lb",server="app"} 2.5
226
traces_service_graph_request_client_seconds_count{client="lb",server="app"} 1
227
# HELP traces_service_graph_request_failed_total Total count of failed requests between two nodes
228
# TYPE traces_service_graph_request_failed_total counter
229
traces_service_graph_request_failed_total{client="lb",server="app"} 1
230
# HELP traces_service_graph_request_server_seconds Time for a request between two nodes as seen from the server
231
# TYPE traces_service_graph_request_server_seconds histogram
232
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.01"} 0
233
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.02"} 0
234
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.04"} 0
235
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.08"} 0
236
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.16"} 0
237
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.32"} 0
238
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.64"} 0
239
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="1.28"} 1
240
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="2.56"} 1
241
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="5.12"} 1
242
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="10.24"} 1
243
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="20.48"} 1
244
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="+Inf"} 1
245
traces_service_graph_request_server_seconds_sum{client="lb",server="app"} 1
246
traces_service_graph_request_server_seconds_count{client="lb",server="app"} 1
247
# HELP traces_service_graph_request_total Total count of requests between two nodes
248
# TYPE traces_service_graph_request_total counter
249
traces_service_graph_request_total{client="lb",server="app"} 1
250
`
251
// has only one failed span instead of 2
252
successCodesCaseMetrics = `
253
# HELP traces_service_graph_request_client_seconds Time for a request between two nodes as seen from the client
254
# TYPE traces_service_graph_request_client_seconds histogram
255
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.01"} 0
256
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.02"} 0
257
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.04"} 0
258
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.08"} 0
259
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.16"} 0
260
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.32"} 0
261
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="0.64"} 0
262
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="1.28"} 2
263
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="2.56"} 3
264
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="5.12"} 3
265
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="10.24"} 3
266
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="20.48"} 3
267
traces_service_graph_request_client_seconds_bucket{client="app",server="db",le="+Inf"} 3
268
traces_service_graph_request_client_seconds_sum{client="app",server="db"} 4.4
269
traces_service_graph_request_client_seconds_count{client="app",server="db"} 3
270
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.01"} 0
271
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.02"} 0
272
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.04"} 0
273
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.08"} 0
274
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.16"} 0
275
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.32"} 0
276
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="0.64"} 0
277
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="1.28"} 0
278
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="2.56"} 2
279
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="5.12"} 3
280
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="10.24"} 3
281
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="20.48"} 3
282
traces_service_graph_request_client_seconds_bucket{client="lb",server="app",le="+Inf"} 3
283
traces_service_graph_request_client_seconds_sum{client="lb",server="app"} 7.8
284
traces_service_graph_request_client_seconds_count{client="lb",server="app"} 3
285
# HELP traces_service_graph_request_failed_total Total count of failed requests between two nodes
286
# TYPE traces_service_graph_request_failed_total counter
287
traces_service_graph_request_failed_total{client="lb",server="app"} 1
288
# HELP traces_service_graph_request_server_seconds Time for a request between two nodes as seen from the server
289
# TYPE traces_service_graph_request_server_seconds histogram
290
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.01"} 0
291
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.02"} 0
292
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.04"} 0
293
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.08"} 0
294
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.16"} 0
295
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.32"} 0
296
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="0.64"} 0
297
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="1.28"} 1
298
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="2.56"} 3
299
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="5.12"} 3
300
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="10.24"} 3
301
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="20.48"} 3
302
traces_service_graph_request_server_seconds_bucket{client="app",server="db",le="+Inf"} 3
303
traces_service_graph_request_server_seconds_sum{client="app",server="db"} 5
304
traces_service_graph_request_server_seconds_count{client="app",server="db"} 3
305
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.01"} 0
306
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.02"} 0
307
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.04"} 0
308
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.08"} 0
309
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.16"} 0
310
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.32"} 0
311
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="0.64"} 0
312
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="1.28"} 1
313
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="2.56"} 2
314
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="5.12"} 3
315
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="10.24"} 3
316
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="20.48"} 3
317
traces_service_graph_request_server_seconds_bucket{client="lb",server="app",le="+Inf"} 3
318
traces_service_graph_request_server_seconds_sum{client="lb",server="app"} 6.2
319
traces_service_graph_request_server_seconds_count{client="lb",server="app"} 3
320
# HELP traces_service_graph_request_total Total count of requests between two nodes
321
# TYPE traces_service_graph_request_total counter
322
traces_service_graph_request_total{client="app",server="db"} 3
323
traces_service_graph_request_total{client="lb",server="app"} 3
324
`
325
)
326
327