@@ -2,15 +2,19 @@ package opentelemetry_test
22
33import (
44 "testing"
5+ "time"
56
7+ "github.com/stretchr/testify/assert"
68 "github.com/stretchr/testify/require"
9+ "go.opentelemetry.io/otel/codes"
710 sdktrace "go.opentelemetry.io/otel/sdk/trace"
811 "go.opentelemetry.io/otel/sdk/trace/tracetest"
912 "go.opentelemetry.io/otel/trace"
1013
1114 "go.temporal.io/sdk/contrib/opentelemetry"
1215 "go.temporal.io/sdk/interceptor"
1316 "go.temporal.io/sdk/internal/interceptortest"
17+ "go.temporal.io/sdk/temporal"
1418)
1519
1620func TestSpanPropagation (t * testing.T ) {
@@ -42,3 +46,109 @@ func spanChildren(spans []sdktrace.ReadOnlySpan, parentID trace.SpanID) (ret []*
4246 }
4347 return
4448}
49+
50+ func TestSpanKind (t * testing.T ) {
51+ tests := []struct {
52+ operation string
53+ toHeader bool
54+ fromHeader bool
55+ expectedKind trace.SpanKind
56+ }{
57+ {
58+ operation : "StartWorkflow" ,
59+ toHeader : true ,
60+ fromHeader : false ,
61+ expectedKind : trace .SpanKindClient ,
62+ },
63+ {
64+ operation : "RunWorkflow" ,
65+ toHeader : false ,
66+ fromHeader : true ,
67+ expectedKind : trace .SpanKindServer ,
68+ },
69+ }
70+
71+ for _ , tt := range tests {
72+ t .Run (tt .operation , func (t * testing.T ) {
73+ rec := tracetest .NewSpanRecorder ()
74+ tracer , err := opentelemetry .NewTracer (opentelemetry.TracerOptions {
75+ Tracer : sdktrace .NewTracerProvider (sdktrace .WithSpanProcessor (rec )).Tracer ("" ),
76+ })
77+ require .NoError (t , err )
78+
79+ span , err := tracer .StartSpan (& interceptor.TracerStartSpanOptions {
80+ Operation : tt .operation ,
81+ Name : "test-span" ,
82+ ToHeader : tt .toHeader ,
83+ FromHeader : tt .fromHeader ,
84+ })
85+ require .NoError (t , err )
86+
87+ span .Finish (& interceptor.TracerFinishSpanOptions {})
88+
89+ spans := rec .Ended ()
90+ require .Equal (t , len (spans ), 1 )
91+
92+ foundSpan := spans [0 ]
93+ assert .Equal (t , tt .expectedKind , foundSpan .SpanKind (),
94+ "Expected span kind %v but got %v for operation %s" ,
95+ tt .expectedKind , foundSpan .SpanKind (), tt .operation )
96+ })
97+ }
98+ }
99+
100+ func TestBenignErrorSpanStatus (t * testing.T ) {
101+ tests := []struct {
102+ name string
103+ err error
104+ expectError bool
105+ expectStatus codes.Code
106+ }{
107+ {
108+ name : "benign application error should not set error status" ,
109+ err : temporal .NewApplicationErrorWithOptions ("benign error" , "TestType" , temporal.ApplicationErrorOptions {Category : temporal .ApplicationErrorCategoryBenign }),
110+ expectError : false ,
111+ expectStatus : codes .Unset ,
112+ },
113+ {
114+ name : "regular application error should set error status" ,
115+ err : temporal .NewApplicationError ("regular error" , "TestType" ),
116+ expectError : true ,
117+ expectStatus : codes .Error ,
118+ },
119+ }
120+
121+ for _ , tt := range tests {
122+ t .Run (tt .name , func (t * testing.T ) {
123+ rec := tracetest .NewSpanRecorder ()
124+ tracer , err := opentelemetry .NewTracer (opentelemetry.TracerOptions {
125+ Tracer : sdktrace .NewTracerProvider (sdktrace .WithSpanProcessor (rec )).Tracer ("" ),
126+ })
127+ require .NoError (t , err )
128+
129+ span , err := tracer .StartSpan (& interceptor.TracerStartSpanOptions {
130+ Operation : "TestOperation" ,
131+ Name : "TestSpan" ,
132+ Time : time .Now (),
133+ })
134+ require .NoError (t , err )
135+
136+ span .Finish (& interceptor.TracerFinishSpanOptions {
137+ Error : tt .err ,
138+ })
139+
140+ // Check recorded spans
141+ spans := rec .Ended ()
142+ require .Len (t , spans , 1 )
143+
144+ recordedSpan := spans [0 ]
145+ assert .Equal (t , tt .expectStatus , recordedSpan .Status ().Code )
146+
147+ if tt .expectError {
148+ assert .NotEmpty (t , recordedSpan .Status ().Description )
149+ } else {
150+ assert .Empty (t , recordedSpan .Status ().Description )
151+ }
152+ })
153+ }
154+ }
0 commit comments