Skip to content

Commit 56f9935

Browse files
authored
Improve txn check based on remote flag for parent span (#48)
1 parent 8db2f04 commit 56f9935

File tree

4 files changed

+117
-9
lines changed

4 files changed

+117
-9
lines changed

enrichments/trace/internal/elastic/span.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"go.opentelemetry.io/collector/pdata/pcommon"
2828
"go.opentelemetry.io/collector/pdata/ptrace"
2929
semconv "go.opentelemetry.io/collector/semconv/v1.25.0"
30+
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
3031
"google.golang.org/grpc/codes"
3132
)
3233

@@ -269,9 +270,15 @@ func (s *spanEnrichmentContext) setServiceTarget(span ptrace.Span) {
269270
}
270271

271272
func isElasticTransaction(span ptrace.Span) bool {
272-
if span.ParentSpanID().IsEmpty() ||
273-
span.Kind() == ptrace.SpanKindServer ||
274-
span.Kind() == ptrace.SpanKindConsumer {
273+
flags := tracepb.SpanFlags(span.Flags())
274+
switch {
275+
case span.ParentSpanID().IsEmpty():
276+
return true
277+
case (flags & tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) == 0:
278+
// span parent is unknown, fall back to span kind
279+
return span.Kind() == ptrace.SpanKindServer || span.Kind() == ptrace.SpanKindConsumer
280+
case (flags & tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) != 0:
281+
// span parent is remote
275282
return true
276283
}
277284
return false

enrichments/trace/internal/elastic/span_test.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/stretchr/testify/assert"
2626
"go.opentelemetry.io/collector/pdata/ptrace"
2727
semconv "go.opentelemetry.io/collector/semconv/v1.25.0"
28+
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
2829
"google.golang.org/grpc/codes"
2930
)
3031

@@ -427,3 +428,100 @@ func TestElasticSpanEnrich(t *testing.T) {
427428
})
428429
}
429430
}
431+
432+
func TestIsElasticTransaction(t *testing.T) {
433+
for _, tc := range []struct {
434+
name string
435+
input ptrace.Span
436+
isTxn bool
437+
}{
438+
{
439+
name: "no_parent_span",
440+
input: ptrace.NewSpan(),
441+
isTxn: true,
442+
},
443+
{
444+
name: "parent_span",
445+
input: func() ptrace.Span {
446+
span := ptrace.NewSpan()
447+
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
448+
return span
449+
}(),
450+
isTxn: false,
451+
},
452+
{
453+
name: "remote_parent_span",
454+
input: func() ptrace.Span {
455+
span := ptrace.NewSpan()
456+
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
457+
flags := tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK
458+
flags = flags | tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK
459+
span.SetFlags(uint32(flags))
460+
return span
461+
}(),
462+
isTxn: true,
463+
},
464+
{
465+
name: "local_parent_span",
466+
input: func() ptrace.Span {
467+
span := ptrace.NewSpan()
468+
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
469+
flags := tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK
470+
span.SetFlags(uint32(flags))
471+
return span
472+
}(),
473+
isTxn: false,
474+
},
475+
{
476+
name: "unknown_parent_span_kind_server",
477+
input: func() ptrace.Span {
478+
span := ptrace.NewSpan()
479+
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
480+
span.SetKind(ptrace.SpanKindServer)
481+
return span
482+
}(),
483+
isTxn: true,
484+
},
485+
{
486+
name: "unknown_parent_span_kind_consumer",
487+
input: func() ptrace.Span {
488+
span := ptrace.NewSpan()
489+
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
490+
span.SetKind(ptrace.SpanKindConsumer)
491+
return span
492+
}(),
493+
isTxn: true,
494+
},
495+
{
496+
name: "unknown_parent_span_kind_producer",
497+
input: func() ptrace.Span {
498+
span := ptrace.NewSpan()
499+
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
500+
span.SetKind(ptrace.SpanKindProducer)
501+
return span
502+
}(),
503+
isTxn: false,
504+
},
505+
{
506+
name: "unknown_parent_span_kind_unspecified",
507+
input: func() ptrace.Span {
508+
span := ptrace.NewSpan()
509+
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
510+
return span
511+
}(),
512+
isTxn: false,
513+
},
514+
{
515+
name: "unknown_parent_span_kind_internal",
516+
input: func() ptrace.Span {
517+
span := ptrace.NewSpan()
518+
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
519+
span.SetKind(ptrace.SpanKindInternal)
520+
return span
521+
}(),
522+
isTxn: false,
523+
},
524+
} {
525+
assert.Equal(t, tc.isTxn, isElasticTransaction(tc.input))
526+
}
527+
}

go.mod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
github.com/stretchr/testify v1.9.0
99
go.opentelemetry.io/collector/pdata v1.11.0
1010
go.opentelemetry.io/collector/semconv v0.104.0
11+
go.opentelemetry.io/proto/otlp v1.3.1
1112
go.uber.org/zap v1.27.0
1213
google.golang.org/grpc v1.64.0
1314
)
@@ -24,8 +25,8 @@ require (
2425
go.uber.org/multierr v1.11.0 // indirect
2526
golang.org/x/net v0.23.0 // indirect
2627
golang.org/x/sys v0.18.0 // indirect
27-
golang.org/x/text v0.14.0 // indirect
28-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect
28+
golang.org/x/text v0.15.0 // indirect
29+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect
2930
google.golang.org/protobuf v1.34.2 // indirect
3031
gopkg.in/yaml.v3 v3.0.1 // indirect
3132
)

go.sum

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ go.opentelemetry.io/collector/pdata v1.11.0 h1:rzYyV1zfTQQz1DI9hCiaKyyaczqawN75X
3939
go.opentelemetry.io/collector/pdata v1.11.0/go.mod h1:IHxHsp+Jq/xfjORQMDJjSH6jvedOSTOyu3nbxqhWSYE=
4040
go.opentelemetry.io/collector/semconv v0.104.0 h1:dUvajnh+AYJLEW/XOPk0T0BlwltSdi3vrjO7nSOos3k=
4141
go.opentelemetry.io/collector/semconv v0.104.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw=
42+
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
43+
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
4244
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
4345
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
4446
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
@@ -66,8 +68,8 @@ golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
6668
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
6769
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
6870
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
69-
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
70-
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
71+
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
72+
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
7173
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
7274
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
7375
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -76,8 +78,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
7678
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7779
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7880
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
79-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc=
80-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
81+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 h1:mxSlqyb8ZAHsYDCfiXN1EDdNTdvjUJSLY+OnAUtYNYA=
82+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM=
8183
google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=
8284
google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg=
8385
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=

0 commit comments

Comments
 (0)