Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/otelcol/exporter/otlphttp/otlphttp_test.go
4096 views
1
package otlphttp_test
2
3
import (
4
"fmt"
5
"io"
6
"net/http"
7
"net/http/httptest"
8
"testing"
9
"time"
10
11
"github.com/go-kit/log/level"
12
"github.com/grafana/agent/component/otelcol"
13
"github.com/grafana/agent/component/otelcol/exporter/otlphttp"
14
"github.com/grafana/agent/pkg/flow/componenttest"
15
"github.com/grafana/agent/pkg/river"
16
"github.com/grafana/agent/pkg/util"
17
"github.com/grafana/dskit/backoff"
18
"github.com/stretchr/testify/require"
19
"go.opentelemetry.io/collector/pdata/ptrace"
20
)
21
22
// Test performs a basic integration test which runs the
23
// otelcol.exporter.otlphttp component and ensures that it can pass data to an
24
// OTLP HTTP server.
25
func Test(t *testing.T) {
26
ch := make(chan ptrace.Traces)
27
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
28
b, _ := io.ReadAll(r.Body)
29
decoder := &ptrace.ProtoUnmarshaler{}
30
trace, _ := decoder.UnmarshalTraces(b)
31
require.Equal(t, 1, trace.SpanCount())
32
name := trace.ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0).Name()
33
require.Equal(t, "TestSpan", name)
34
ch <- trace
35
w.WriteHeader(http.StatusOK)
36
}))
37
defer srv.Close()
38
39
ctx := componenttest.TestContext(t)
40
l := util.TestLogger(t)
41
42
ctrl, err := componenttest.NewControllerFromID(l, "otelcol.exporter.otlphttp")
43
require.NoError(t, err)
44
45
cfg := fmt.Sprintf(`
46
client {
47
endpoint = "%s"
48
49
compression = "none"
50
51
tls {
52
insecure = true
53
insecure_skip_verify = true
54
}
55
}
56
`, srv.URL)
57
var args otlphttp.Arguments
58
require.NoError(t, river.Unmarshal([]byte(cfg), &args))
59
60
go func() {
61
err := ctrl.Run(ctx, args)
62
require.NoError(t, err)
63
}()
64
65
require.NoError(t, ctrl.WaitRunning(time.Second), "component never started")
66
require.NoError(t, ctrl.WaitExports(time.Second), "component never exported anything")
67
68
// Send traces in the background to our exporter.
69
go func() {
70
exports := ctrl.Exports().(otelcol.ConsumerExports)
71
72
bo := backoff.New(ctx, backoff.Config{
73
MinBackoff: 10 * time.Millisecond,
74
MaxBackoff: 100 * time.Millisecond,
75
})
76
for bo.Ongoing() {
77
err := exports.Input.ConsumeTraces(ctx, createTestTraces())
78
if err != nil {
79
level.Error(l).Log("msg", "failed to send traces", "err", err)
80
bo.Wait()
81
continue
82
}
83
84
return
85
}
86
}()
87
88
// Wait for our exporter to finish and pass data to our HTTP server.
89
select {
90
case <-time.After(time.Second):
91
require.FailNow(t, "failed waiting for traces")
92
case tr := <-ch:
93
require.Equal(t, 1, tr.SpanCount())
94
}
95
}
96
97
func createTestTraces() ptrace.Traces {
98
// Matches format from the protobuf definition:
99
// https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/trace/v1/trace.proto
100
var bb = `{
101
"resource_spans": [{
102
"scope_spans": [{
103
"spans": [{
104
"name": "TestSpan"
105
}]
106
}]
107
}]
108
}`
109
110
decoder := &ptrace.JSONUnmarshaler{}
111
data, err := decoder.UnmarshalTraces([]byte(bb))
112
if err != nil {
113
panic(err)
114
}
115
return data
116
}
117
118