1 package client
2
3 import (
4 "context"
5 "net/http"
6 "testing"
7
8 "github.com/go-openapi/runtime"
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/codes"
14 "go.opentelemetry.io/otel/propagation"
15 tracesdk "go.opentelemetry.io/otel/sdk/trace"
16 "go.opentelemetry.io/otel/sdk/trace/tracetest"
17 "go.opentelemetry.io/otel/trace"
18 )
19
20 func Test_OpenTelemetryRuntime_submit(t *testing.T) {
21 t.Parallel()
22
23 exporter := tracetest.NewInMemoryExporter()
24
25 tp := tracesdk.NewTracerProvider(
26 tracesdk.WithSampler(tracesdk.AlwaysSample()),
27 tracesdk.WithSyncer(exporter),
28 )
29
30 otel.SetTracerProvider(tp)
31
32 tracer := tp.Tracer("go-runtime")
33 ctx, span := tracer.Start(context.Background(), "op")
34 defer span.End()
35
36 assertOpenTelemetrySubmit(t, testOperation(ctx), exporter, 1)
37 }
38
39 func Test_OpenTelemetryRuntime_submit_nilAuthInfo(t *testing.T) {
40 t.Parallel()
41
42 exporter := tracetest.NewInMemoryExporter()
43
44 tp := tracesdk.NewTracerProvider(
45 tracesdk.WithSampler(tracesdk.AlwaysSample()),
46 tracesdk.WithSyncer(exporter),
47 )
48
49 otel.SetTracerProvider(tp)
50
51 tracer := tp.Tracer("go-runtime")
52 ctx, span := tracer.Start(context.Background(), "op")
53 defer span.End()
54
55 operation := testOperation(ctx)
56 operation.AuthInfo = nil
57 assertOpenTelemetrySubmit(t, operation, exporter, 1)
58 }
59
60 func Test_OpenTelemetryRuntime_submit_nilContext(t *testing.T) {
61 exporter := tracetest.NewInMemoryExporter()
62
63 tp := tracesdk.NewTracerProvider(
64 tracesdk.WithSampler(tracesdk.AlwaysSample()),
65 tracesdk.WithSyncer(exporter),
66 )
67
68 otel.SetTracerProvider(tp)
69
70 tracer := tp.Tracer("go-runtime")
71 ctx, span := tracer.Start(context.Background(), "op")
72 defer span.End()
73 operation := testOperation(ctx)
74 operation.Context = nil
75
76 assertOpenTelemetrySubmit(t, operation, exporter, 0)
77 }
78
79 func Test_injectOpenTelemetrySpanContext(t *testing.T) {
80 t.Parallel()
81
82 exporter := tracetest.NewInMemoryExporter()
83
84 tp := tracesdk.NewTracerProvider(
85 tracesdk.WithSampler(tracesdk.AlwaysSample()),
86 tracesdk.WithSyncer(exporter),
87 )
88
89 otel.SetTracerProvider(tp)
90
91 tracer := tp.Tracer("go-runtime")
92 ctx, span := tracer.Start(context.Background(), "op")
93 defer span.End()
94 operation := testOperation(ctx)
95
96 header := map[string][]string{}
97 tr := newOpenTelemetryTransport(&mockRuntime{runtime.TestClientRequest{Headers: header}}, "", nil)
98 tr.config.Propagator = propagation.TraceContext{}
99 _, err := tr.Submit(operation)
100 require.NoError(t, err)
101
102 assert.Len(t, header, 1)
103 }
104
105 func assertOpenTelemetrySubmit(t *testing.T, operation *runtime.ClientOperation, exporter *tracetest.InMemoryExporter, expectedSpanCount int) {
106 header := map[string][]string{}
107 tr := newOpenTelemetryTransport(&mockRuntime{runtime.TestClientRequest{Headers: header}}, "remote_host", nil)
108
109 _, err := tr.Submit(operation)
110 require.NoError(t, err)
111
112 spans := exporter.GetSpans()
113 assert.Len(t, spans, expectedSpanCount)
114
115 if expectedSpanCount != 1 {
116 return
117 }
118
119 span := spans[0]
120 assert.Equal(t, "getCluster", span.Name)
121 assert.Equal(t, "go-openapi", span.InstrumentationLibrary.Name)
122 assert.Equal(t, codes.Error, span.Status.Code)
123 assert.Equal(t, []attribute.KeyValue{
124 attribute.String("net.peer.name", "remote_host"),
125 attribute.String("http.route", "/kubernetes-clusters/{cluster_id}"),
126 attribute.String("http.method", http.MethodGet),
127 attribute.String("span.kind", trace.SpanKindClient.String()),
128 attribute.String("http.scheme", schemeHTTPS),
129
130 attribute.Int("http.status_code", 490),
131 }, span.Attributes)
132 }
133
View as plain text