Skip to content

Commit e95cdf9

Browse files
committed
lambda: use _X_AMZN_TRACE_ID trace context as a Link not parent
See open-telemetry/opentelemetry-specification#3166
1 parent d9b1211 commit e95cdf9

File tree

8 files changed

+479
-46
lines changed

8 files changed

+479
-46
lines changed

instrumentation/github.com/aws/aws-lambda-go/otellambda/go.mod

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,30 @@ go 1.18
55
require (
66
github.com/aws/aws-lambda-go v1.37.0
77
github.com/stretchr/testify v1.8.1
8+
go.opentelemetry.io/contrib/propagators/aws v1.14.0
89
go.opentelemetry.io/otel v1.13.0
910
go.opentelemetry.io/otel/trace v1.13.0
1011
)
1112

1213
require (
14+
github.com/cenkalti/backoff/v4 v4.2.0 // indirect
1315
github.com/davecgh/go-spew v1.1.1 // indirect
1416
github.com/go-logr/logr v1.2.3 // indirect
1517
github.com/go-logr/stdr v1.2.2 // indirect
18+
github.com/golang/protobuf v1.5.2 // indirect
19+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
1620
github.com/pmezard/go-difflib v1.0.0 // indirect
21+
go.opentelemetry.io/contrib/detectors/aws/lambda v0.39.0 // indirect
22+
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.13.0 // indirect
23+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.13.0 // indirect
24+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0 // indirect
25+
go.opentelemetry.io/otel/sdk v1.13.0 // indirect
26+
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
27+
golang.org/x/net v0.5.0 // indirect
28+
golang.org/x/sys v0.4.0 // indirect
29+
golang.org/x/text v0.6.0 // indirect
30+
google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6 // indirect
31+
google.golang.org/grpc v1.52.3 // indirect
32+
google.golang.org/protobuf v1.28.1 // indirect
1733
gopkg.in/yaml.v3 v3.0.1 // indirect
1834
)

instrumentation/github.com/aws/aws-lambda-go/otellambda/go.sum

Lines changed: 427 additions & 0 deletions
Large diffs are not rendered by default.

instrumentation/github.com/aws/aws-lambda-go/otellambda/lambda.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ import (
2121
"strings"
2222

2323
"github.com/aws/aws-lambda-go/lambdacontext"
24-
2524
"go.opentelemetry.io/otel"
25+
"go.opentelemetry.io/contrib/propagators/aws/xray"
26+
"go.opentelemetry.io/otel/propagation"
2627
"go.opentelemetry.io/otel/attribute"
2728
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
2829
"go.opentelemetry.io/otel/trace"
@@ -56,6 +57,23 @@ func newInstrumentor(opts ...Option) instrumentor {
5657
resAttrs: []attribute.KeyValue{}}
5758
}
5859

60+
func xrayEnvToLinks() []trace.Link {
61+
xrayTraceID := os.Getenv("_X_AMZN_TRACE_ID")
62+
63+
if xrayTraceID != "" {
64+
carrier := propagation.HeaderCarrier{"X-Amzn-Trace-Id": []string{xrayTraceID}}
65+
66+
xray := xray.Propagator{}
67+
ctx := xray.Extract(context.Background(), carrier)
68+
69+
link := trace.LinkFromContext(ctx, attribute.String("source", "x-ray-env"))
70+
71+
return []trace.Link{link}
72+
}
73+
74+
return []trace.Link{}
75+
}
76+
5977
// Logic to start OTel Tracing.
6078
func (i *instrumentor) tracingBegin(ctx context.Context, eventJSON []byte) (context.Context, trace.Span) {
6179
// Add trace id to context
@@ -89,7 +107,9 @@ func (i *instrumentor) tracingBegin(ctx context.Context, eventJSON []byte) (cont
89107
attributes = append(attributes, i.resAttrs...)
90108
}
91109

92-
ctx, span = i.tracer.Start(ctx, spanName, trace.WithSpanKind(trace.SpanKindServer), trace.WithAttributes(attributes...))
110+
links := xrayEnvToLinks()
111+
112+
ctx, span = i.tracer.Start(ctx, spanName, trace.WithSpanKind(trace.SpanKindServer), trace.WithAttributes(attributes...), trace.WithLinks(links...))
93113

94114
return ctx, span
95115
}

instrumentation/github.com/aws/aws-lambda-go/otellambda/test/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ require (
2424
github.com/go-logr/logr v1.2.3 // indirect
2525
github.com/go-logr/stdr v1.2.2 // indirect
2626
github.com/pmezard/go-difflib v1.0.0 // indirect
27-
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect
27+
golang.org/x/sys v0.4.0 // indirect
2828
gopkg.in/yaml.v3 v3.0.1 // indirect
2929
)

instrumentation/github.com/aws/aws-lambda-go/otellambda/test/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ go.opentelemetry.io/otel/sdk v1.13.0 h1:BHib5g8MvdqS65yo2vV1s6Le42Hm6rrw08qU6yz5
2424
go.opentelemetry.io/otel/sdk v1.13.0/go.mod h1:YLKPx5+6Vx/o1TCUYYs+bpymtkmazOMT6zoRrC7AQ7I=
2525
go.opentelemetry.io/otel/trace v1.13.0 h1:CBgRZ6ntv+Amuj1jDsMhZtlAPT6gbyIRdaIzFhfBSdY=
2626
go.opentelemetry.io/otel/trace v1.13.0/go.mod h1:muCvmmO9KKpvuXSf3KKAXXB2ygNYHQ+ZfI5X08d3tds=
27-
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc=
28-
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
27+
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
28+
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
2929
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
3030
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
3131
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

instrumentation/github.com/aws/aws-lambda-go/otellambda/test/lambda_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ var (
140140
attribute.String("faas.id", "arn:partition:service:region:account-id:resource-type:resource-id"),
141141
attribute.String("cloud.account.id", "account-id")},
142142
Events: nil,
143-
Links: nil,
143+
Links: []sdktrace.Link{sdktrace.Link{SpanContext: trace.SpanContextFromContext(mockContext), Attributes: []attribute.KeyValue{attribute.String("source", "x-ray-env")}}},
144144
Status: sdktrace.Status{},
145145
DroppedAttributes: 0,
146146
DroppedEvents: 0,
@@ -330,7 +330,7 @@ var (
330330
attribute.String("faas.id", "arn:partition:service:region:account-id:resource-type:resource-id"),
331331
attribute.String("cloud.account.id", "account-id")},
332332
Events: nil,
333-
Links: nil,
333+
Links: []sdktrace.Link{sdktrace.Link{SpanContext: trace.SpanContextFromContext(mockContext), Attributes: []attribute.KeyValue{attribute.String("source", "x-ray-env")}}},
334334
Status: sdktrace.Status{},
335335
DroppedAttributes: 0,
336336
DroppedEvents: 0,

instrumentation/github.com/aws/aws-lambda-go/otellambda/xrayconfig/xrayconfig.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ package xrayconfig // import "go.opentelemetry.io/contrib/instrumentation/github
1616

1717
import (
1818
"context"
19-
"os"
2019

2120
lambdadetector "go.opentelemetry.io/contrib/detectors/aws/lambda"
2221
"go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-lambda-go/otellambda"
@@ -26,9 +25,10 @@ import (
2625
sdktrace "go.opentelemetry.io/otel/sdk/trace"
2726
)
2827

28+
// TODO: Currently does nothing but should support pulling the propagated
29+
// trace context from attributes depending on the type of Lambda event
2930
func xrayEventToCarrier([]byte) propagation.TextMapCarrier {
30-
xrayTraceID := os.Getenv("_X_AMZN_TRACE_ID")
31-
return propagation.HeaderCarrier{"X-Amzn-Trace-Id": []string{xrayTraceID}}
31+
return propagation.HeaderCarrier{}
3232
}
3333

3434
// NewTracerProvider returns a TracerProvider configured with an exporter,

instrumentation/github.com/aws/aws-lambda-go/otellambda/xrayconfig/xrayconfig_test.go

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -28,41 +28,11 @@ import (
2828
"go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-lambda-go/otellambda"
2929
"go.opentelemetry.io/contrib/propagators/aws/xray"
3030
"go.opentelemetry.io/otel/propagation"
31-
"go.opentelemetry.io/otel/trace"
3231
v1common "go.opentelemetry.io/proto/otlp/common/v1"
3332
v1resource "go.opentelemetry.io/proto/otlp/resource/v1"
3433
v1trace "go.opentelemetry.io/proto/otlp/trace/v1"
3534
)
3635

37-
func TestEventToCarrier(t *testing.T) {
38-
os.Clearenv()
39-
40-
_ = os.Setenv("_X_AMZN_TRACE_ID", "traceID")
41-
carrier := xrayEventToCarrier([]byte{})
42-
43-
assert.Equal(t, "traceID", carrier.Get("X-Amzn-Trace-Id"))
44-
}
45-
46-
func TestEventToCarrierWithPropagator(t *testing.T) {
47-
os.Clearenv()
48-
49-
_ = os.Setenv("_X_AMZN_TRACE_ID", "Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1")
50-
carrier := xrayEventToCarrier([]byte{})
51-
ctx := xray.Propagator{}.Extract(context.Background(), carrier)
52-
53-
expectedTraceID, _ := trace.TraceIDFromHex("5759e988bd862e3fe1be46a994272793")
54-
expectedSpanID, _ := trace.SpanIDFromHex("53995c3f42cd8ad8")
55-
expectedCtx := trace.ContextWithRemoteSpanContext(context.Background(), trace.NewSpanContext(trace.SpanContextConfig{
56-
TraceID: expectedTraceID,
57-
SpanID: expectedSpanID,
58-
TraceFlags: trace.FlagsSampled,
59-
TraceState: trace.TraceState{},
60-
Remote: true,
61-
}))
62-
63-
assert.Equal(t, expectedCtx, ctx)
64-
}
65-
6636
func setEnvVars() {
6737
_ = os.Setenv("AWS_LAMBDA_FUNCTION_NAME", "testFunction")
6838
_ = os.Setenv("AWS_REGION", "us-texas-1")
@@ -88,16 +58,16 @@ var (
8858
}
8959
mockContext = xray.Propagator{}.Extract(lambdacontext.NewContext(context.Background(), &mockLambdaContext),
9060
propagation.HeaderCarrier{
91-
"X-Amzn-Trace-Id": []string{"Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1"},
61+
"X-Amzn-Trace-Id": []string{"Root=1-6769e988-bd862e3fe1be46a994272793;Parent=63996c3f42cd8ad8;Sampled=1"},
9262
})
9363

9464
expectedSpans = v1trace.ScopeSpans{
9565
Scope: &v1common.InstrumentationScope{Name: "go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-lambda-go/otellambda", Version: otellambda.SemVersion()},
9666
Spans: []*v1trace.Span{{
97-
TraceId: []byte{0x57, 0x59, 0xe9, 0x88, 0xbd, 0x86, 0x2e, 0x3f, 0xe1, 0xbe, 0x46, 0xa9, 0x94, 0x27, 0x27, 0x93},
67+
TraceId: []byte{0x67, 0x69, 0xe9, 0x88, 0xbd, 0x86, 0x2e, 0x3f, 0xe1, 0xbe, 0x46, 0xa9, 0x94, 0x27, 0x27, 0x93},
9868
SpanId: nil,
9969
TraceState: "",
100-
ParentSpanId: []byte{0x53, 0x99, 0x5c, 0x3f, 0x42, 0xcd, 0x8a, 0xd8},
70+
ParentSpanId: []byte{0x63, 0x99, 0x6c, 0x3f, 0x42, 0xcd, 0x8a, 0xd8},
10171
Name: "testFunction",
10272
Kind: v1trace.Span_SPAN_KIND_SERVER,
10373
StartTimeUnixNano: 0,
@@ -108,7 +78,7 @@ var (
10878
DroppedAttributesCount: 0,
10979
Events: nil,
11080
DroppedEventsCount: 0,
111-
Links: nil,
81+
Links: []*v1trace.Span_Link{{TraceId: []byte{0x57, 0x59, 0xe9, 0x88, 0xbd, 0x86, 0x2e, 0x3f, 0xe1, 0xbe, 0x46, 0xa9, 0x94, 0x27, 0x27, 0x93}, SpanId: []byte{0x53, 0x99, 0x5c, 0x3f, 0x42, 0xcd, 0x8a, 0xd8}, Attributes: []*v1common.KeyValue{{Key: "source", Value: &v1common.AnyValue{Value: &v1common.AnyValue_StringValue{StringValue: "x-ray-env"}}}}}},
11282
DroppedLinksCount: 0,
11383
Status: &v1trace.Status{Code: v1trace.Status_STATUS_CODE_UNSET},
11484
}},
@@ -145,7 +115,7 @@ func assertResourceEquals(t *testing.T, expected *v1resource.Resource, actual *v
145115

146116
// ignore timestamps and SpanID since time is obviously variable,
147117
// and SpanID is randomized when using xray IDGenerator.
148-
func assertSpanEqualsIgnoreTimeAndSpanID(t *testing.T, expected *v1trace.ResourceSpans, actual *v1trace.ResourceSpans) {
118+
func assertSpanEqualsIgnoreTimeAndTraceIDAndSpanID(t *testing.T, expected *v1trace.ResourceSpans, actual *v1trace.ResourceSpans) {
149119
assert.Equal(t, expected.ScopeSpans[0].Scope, actual.ScopeSpans[0].Scope)
150120

151121
actualSpan := actual.ScopeSpans[0].Spans[0]
@@ -189,5 +159,5 @@ func TestWrapEndToEnd(t *testing.T) {
189159

190160
resSpans := mockCollector.getResourceSpans()
191161
assert.Len(t, resSpans, 1)
192-
assertSpanEqualsIgnoreTimeAndSpanID(t, &expectedResourceSpans, resSpans[0])
162+
assertSpanEqualsIgnoreTimeAndTraceIDAndSpanID(t, &expectedResourceSpans, resSpans[0])
193163
}

0 commit comments

Comments
 (0)