Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/traces/traces_test.go
4094 views
1
package traces
2
3
import (
4
"fmt"
5
"strings"
6
"testing"
7
"time"
8
9
"github.com/grafana/agent/pkg/server"
10
"github.com/grafana/agent/pkg/traces/internal/traceutils"
11
"github.com/grafana/agent/pkg/util"
12
"github.com/opentracing/opentracing-go"
13
"github.com/prometheus/client_golang/prometheus"
14
"github.com/stretchr/testify/require"
15
jaegercfg "github.com/uber/jaeger-client-go/config"
16
"github.com/weaveworks/common/logging"
17
"go.opentelemetry.io/collector/pdata/ptrace"
18
"gopkg.in/yaml.v2"
19
)
20
21
func TestTraces(t *testing.T) {
22
tracesCh := make(chan ptrace.Traces)
23
tracesAddr := traceutils.NewTestServer(t, func(t ptrace.Traces) {
24
tracesCh <- t
25
})
26
27
tracesCfgText := util.Untab(fmt.Sprintf(`
28
configs:
29
- name: default
30
receivers:
31
jaeger:
32
protocols:
33
thrift_compact:
34
remote_write:
35
- endpoint: %s
36
insecure: true
37
batch:
38
timeout: 100ms
39
send_batch_size: 1
40
`, tracesAddr))
41
42
var cfg Config
43
dec := yaml.NewDecoder(strings.NewReader(tracesCfgText))
44
dec.SetStrict(true)
45
err := dec.Decode(&cfg)
46
require.NoError(t, err)
47
48
var loggingLevel logging.Level
49
require.NoError(t, loggingLevel.Set("debug"))
50
51
traces, err := New(nil, nil, prometheus.NewRegistry(), cfg, &server.HookLogger{})
52
require.NoError(t, err)
53
t.Cleanup(traces.Stop)
54
55
tr := testJaegerTracer(t)
56
span := tr.StartSpan("test-span")
57
span.Finish()
58
59
select {
60
case <-time.After(30 * time.Second):
61
require.Fail(t, "failed to receive a span after 30 seconds")
62
case tr := <-tracesCh:
63
require.Equal(t, 1, tr.SpanCount())
64
// Nothing to do, send succeeded.
65
}
66
}
67
68
func TestTraceWithSpanmetricsConfig(t *testing.T) {
69
tracesCfgText := util.Untab(`
70
configs:
71
- name: test
72
receivers:
73
zipkin:
74
endpoint: 0.0.0.0:9999
75
remote_write:
76
- endpoint: 0.0.0.0:5555
77
insecure: false
78
tls_config:
79
insecure_skip_verify: true
80
spanmetrics:
81
handler_endpoint: 0.0.0.0:9090
82
const_labels:
83
key1: "value1"
84
key2: "value2"
85
`)
86
87
var cfg Config
88
dec := yaml.NewDecoder(strings.NewReader(tracesCfgText))
89
dec.SetStrict(true)
90
err := dec.Decode(&cfg)
91
require.NoError(t, err)
92
93
var loggingLevel logging.Level
94
require.NoError(t, loggingLevel.Set("debug"))
95
96
traces, err := New(nil, nil, prometheus.NewRegistry(), cfg, &server.HookLogger{})
97
require.NoError(t, err)
98
t.Cleanup(traces.Stop)
99
}
100
101
func TestTrace_ApplyConfig(t *testing.T) {
102
tracesCh := make(chan ptrace.Traces)
103
tracesAddr := traceutils.NewTestServer(t, func(t ptrace.Traces) {
104
tracesCh <- t
105
})
106
107
tracesCfgText := util.Untab(`
108
configs:
109
- name: default
110
receivers:
111
jaeger:
112
protocols:
113
thrift_compact:
114
remote_write:
115
- endpoint: 127.0.0.1:80 # deliberately the wrong endpoint
116
insecure: true
117
batch:
118
timeout: 100ms
119
send_batch_size: 1
120
service_graphs:
121
enabled: true
122
`)
123
124
var cfg Config
125
dec := yaml.NewDecoder(strings.NewReader(tracesCfgText))
126
dec.SetStrict(true)
127
err := dec.Decode(&cfg)
128
require.NoError(t, err)
129
130
traces, err := New(nil, nil, prometheus.NewRegistry(), cfg, &server.HookLogger{})
131
require.NoError(t, err)
132
t.Cleanup(traces.Stop)
133
134
// Fix the config and apply it before sending spans.
135
tracesCfgText = util.Untab(fmt.Sprintf(`
136
configs:
137
- name: default
138
receivers:
139
jaeger:
140
protocols:
141
thrift_compact:
142
remote_write:
143
- endpoint: %s
144
insecure: true
145
batch:
146
timeout: 100ms
147
send_batch_size: 1
148
`, tracesAddr))
149
150
var fixedConfig Config
151
dec = yaml.NewDecoder(strings.NewReader(tracesCfgText))
152
dec.SetStrict(true)
153
err = dec.Decode(&fixedConfig)
154
require.NoError(t, err)
155
156
err = traces.ApplyConfig(nil, nil, fixedConfig)
157
require.NoError(t, err)
158
159
tr := testJaegerTracer(t)
160
span := tr.StartSpan("test-span")
161
span.Finish()
162
163
select {
164
case <-time.After(30 * time.Second):
165
require.Fail(t, "failed to receive a span after 30 seconds")
166
case tr := <-tracesCh:
167
require.Equal(t, 1, tr.SpanCount())
168
// Nothing to do, send succeeded.
169
}
170
}
171
172
func testJaegerTracer(t *testing.T) opentracing.Tracer {
173
t.Helper()
174
175
jaegerConfig := jaegercfg.Configuration{
176
ServiceName: "TestTraces",
177
Sampler: &jaegercfg.SamplerConfig{
178
Type: "const",
179
Param: 1,
180
},
181
Reporter: &jaegercfg.ReporterConfig{
182
LocalAgentHostPort: "127.0.0.1:6831",
183
LogSpans: true,
184
},
185
}
186
tr, closer, err := jaegerConfig.NewTracer()
187
require.NoError(t, err)
188
t.Cleanup(func() {
189
require.NoError(t, closer.Close())
190
})
191
192
return tr
193
}
194
195