Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions enrichments/trace/internal/elastic/span.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"go.opentelemetry.io/collector/pdata/pcommon"
"go.opentelemetry.io/collector/pdata/ptrace"
semconv "go.opentelemetry.io/collector/semconv/v1.25.0"
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
"google.golang.org/grpc/codes"
)

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

func isElasticTransaction(span ptrace.Span) bool {
if span.ParentSpanID().IsEmpty() ||
span.Kind() == ptrace.SpanKindServer ||
span.Kind() == ptrace.SpanKindConsumer {
flags := tracepb.SpanFlags(span.Flags())
switch {
case span.ParentSpanID().IsEmpty():
return true
case (flags & tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) == 0:
// span parent is unknown, fall back to span kind
return span.Kind() == ptrace.SpanKindServer || span.Kind() == ptrace.SpanKindConsumer
case (flags & tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) != 0:
// span parent is remote
return true
}
return false
Comment on lines +273 to 284
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perfect, thank you!

Expand Down
98 changes: 98 additions & 0 deletions enrichments/trace/internal/elastic/span_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"github.com/stretchr/testify/assert"
"go.opentelemetry.io/collector/pdata/ptrace"
semconv "go.opentelemetry.io/collector/semconv/v1.25.0"
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
"google.golang.org/grpc/codes"
)

Expand Down Expand Up @@ -427,3 +428,100 @@ func TestElasticSpanEnrich(t *testing.T) {
})
}
}

func TestIsElasticTransaction(t *testing.T) {
for _, tc := range []struct {
name string
input ptrace.Span
isTxn bool
}{
{
name: "no_parent_span",
input: ptrace.NewSpan(),
isTxn: true,
},
{
name: "parent_span",
input: func() ptrace.Span {
span := ptrace.NewSpan()
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
return span
}(),
isTxn: false,
},
{
name: "remote_parent_span",
input: func() ptrace.Span {
span := ptrace.NewSpan()
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
flags := tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK
flags = flags | tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK
span.SetFlags(uint32(flags))
return span
}(),
isTxn: true,
},
{
name: "local_parent_span",
input: func() ptrace.Span {
span := ptrace.NewSpan()
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
flags := tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK
span.SetFlags(uint32(flags))
return span
}(),
isTxn: false,
},
{
name: "unknown_parent_span_kind_server",
input: func() ptrace.Span {
span := ptrace.NewSpan()
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
span.SetKind(ptrace.SpanKindServer)
return span
}(),
isTxn: true,
},
{
name: "unknown_parent_span_kind_consumer",
input: func() ptrace.Span {
span := ptrace.NewSpan()
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
span.SetKind(ptrace.SpanKindConsumer)
return span
}(),
isTxn: true,
},
{
name: "unknown_parent_span_kind_producer",
input: func() ptrace.Span {
span := ptrace.NewSpan()
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
span.SetKind(ptrace.SpanKindProducer)
return span
}(),
isTxn: false,
},
{
name: "unknown_parent_span_kind_unspecified",
input: func() ptrace.Span {
span := ptrace.NewSpan()
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
return span
}(),
isTxn: false,
},
{
name: "unknown_parent_span_kind_internal",
input: func() ptrace.Span {
span := ptrace.NewSpan()
span.SetParentSpanID([8]byte{8, 9, 10, 11, 12, 13, 14})
span.SetKind(ptrace.SpanKindInternal)
return span
}(),
isTxn: false,
},
} {
assert.Equal(t, tc.isTxn, isElasticTransaction(tc.input))
}
}
5 changes: 3 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ require (
github.com/stretchr/testify v1.9.0
go.opentelemetry.io/collector/pdata v1.11.0
go.opentelemetry.io/collector/semconv v0.104.0
go.opentelemetry.io/proto/otlp v1.3.1
go.uber.org/zap v1.27.0
google.golang.org/grpc v1.64.0
)
Expand All @@ -24,8 +25,8 @@ require (
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/net v0.23.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect
golang.org/x/text v0.15.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
10 changes: 6 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ go.opentelemetry.io/collector/pdata v1.11.0 h1:rzYyV1zfTQQz1DI9hCiaKyyaczqawN75X
go.opentelemetry.io/collector/pdata v1.11.0/go.mod h1:IHxHsp+Jq/xfjORQMDJjSH6jvedOSTOyu3nbxqhWSYE=
go.opentelemetry.io/collector/semconv v0.104.0 h1:dUvajnh+AYJLEW/XOPk0T0BlwltSdi3vrjO7nSOos3k=
go.opentelemetry.io/collector/semconv v0.104.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
Expand Down Expand Up @@ -66,8 +68,8 @@ golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
Expand All @@ -76,8 +78,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 h1:mxSlqyb8ZAHsYDCfiXN1EDdNTdvjUJSLY+OnAUtYNYA=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM=
google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=
google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
Expand Down