Skip to content

Commit e88edbe

Browse files
committed
#1034: added sqs messages contexts as activity links
1 parent bdb0077 commit e88edbe

3 files changed

Lines changed: 35 additions & 14 deletions

File tree

src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaWrapper.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// </copyright>
1616

1717
using System;
18+
using System.Collections.Generic;
1819
using System.Diagnostics;
1920
using System.Diagnostics.CodeAnalysis;
2021
using System.Linq;
@@ -170,9 +171,10 @@ public static Task<TResult> TraceAsync<TInput, TResult>(
170171

171172
internal static Activity OnFunctionStart<TInput>(TInput input, ILambdaContext context, ActivityContext parentContext = default)
172173
{
174+
IEnumerable<ActivityLink> links = null;
173175
if (parentContext == default)
174176
{
175-
parentContext = AWSLambdaUtils.ExtractParentContext(input);
177+
(parentContext, links) = AWSLambdaUtils.ExtractParentContext(input);
176178
if (parentContext == default && !DisableAwsXRayContextExtraction)
177179
{
178180
parentContext = AWSLambdaUtils.GetXRayParentContext();
@@ -184,7 +186,7 @@ internal static Activity OnFunctionStart<TInput>(TInput input, ILambdaContext co
184186

185187
// We assume that functionTags and httpTags have no intersection.
186188
var activityName = AWSLambdaUtils.GetFunctionName(context) ?? "AWS Lambda Invoke";
187-
var activity = AWSLambdaActivitySource.StartActivity(activityName, ActivityKind.Server, parentContext, functionTags.Concat(httpTags));
189+
var activity = AWSLambdaActivitySource.StartActivity(activityName, ActivityKind.Server, parentContext, functionTags.Concat(httpTags), links);
188190

189191
return activity;
190192
}

src/OpenTelemetry.Instrumentation.AWSLambda/Implementation/AWSLambdaUtils.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,32 +65,33 @@ internal static ActivityContext GetXRayParentContext()
6565
return activityContext;
6666
}
6767

68-
internal static ActivityContext ExtractParentContext<TInput>(TInput input)
68+
internal static (ActivityContext ParentContext, IEnumerable<ActivityLink> Links) ExtractParentContext<TInput>(TInput input)
6969
{
70-
PropagationContext propagationContext = default;
70+
PropagationContext parentContext = default;
71+
IEnumerable<ActivityLink> links = null;
7172
switch (input)
7273
{
7374
case APIGatewayProxyRequest apiGatewayProxyRequest:
74-
propagationContext = Propagators.DefaultTextMapPropagator.Extract(default, apiGatewayProxyRequest, GetHeaderValues);
75+
parentContext = Propagators.DefaultTextMapPropagator.Extract(default, apiGatewayProxyRequest, GetHeaderValues);
7576
break;
7677
case APIGatewayHttpApiV2ProxyRequest apiGatewayHttpApiV2ProxyRequest:
77-
propagationContext = Propagators.DefaultTextMapPropagator.Extract(default, apiGatewayHttpApiV2ProxyRequest, GetHeaderValues);
78+
parentContext = Propagators.DefaultTextMapPropagator.Extract(default, apiGatewayHttpApiV2ProxyRequest, GetHeaderValues);
7879
break;
7980
case SQSEvent sqsEvent:
80-
propagationContext = AWSMessagingUtils.ExtractParentContext(sqsEvent);
81+
(parentContext, links) = AWSMessagingUtils.ExtractParentContext(sqsEvent);
8182
break;
8283
case SQSEvent.SQSMessage sqsMessage:
83-
propagationContext = AWSMessagingUtils.ExtractParentContext(sqsMessage);
84+
parentContext = AWSMessagingUtils.ExtractParentContext(sqsMessage);
8485
break;
8586
case SNSEvent snsEvent:
86-
propagationContext = AWSMessagingUtils.ExtractParentContext(snsEvent);
87+
parentContext = AWSMessagingUtils.ExtractParentContext(snsEvent);
8788
break;
8889
case SNSEvent.SNSRecord snsRecord:
89-
propagationContext = AWSMessagingUtils.ExtractParentContext(snsRecord);
90+
parentContext = AWSMessagingUtils.ExtractParentContext(snsRecord);
9091
break;
9192
}
9293

93-
return propagationContext.ActivityContext;
94+
return (parentContext.ActivityContext, links);
9495
}
9596

9697
internal static string GetCloudProvider()

src/OpenTelemetry.Instrumentation.AWSLambda/Implementation/AWSMessagingUtils.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
using System;
1818
using System.Collections.Generic;
19+
using System.Diagnostics;
1920
using System.Linq;
2021
using Amazon.Lambda.SNSEvents;
2122
using Amazon.Lambda.SQSEvents;
@@ -31,11 +32,28 @@ internal class AWSMessagingUtils
3132
private const string SnsAttributeTypeStringArray = "String.Array";
3233
private const string SnsMessageAttributes = "MessageAttributes";
3334

34-
internal static PropagationContext ExtractParentContext(SQSEvent sqsEvent)
35+
internal static (PropagationContext ParentContext, IEnumerable<ActivityLink> Links) ExtractParentContext(SQSEvent sqsEvent)
3536
{
37+
if (sqsEvent?.Records == null)
38+
{
39+
return (default, null);
40+
}
41+
3642
// We assume there can be only one parent that's why we consider only a single (the last) record as the carrier.
37-
var message = sqsEvent?.Records?.LastOrDefault();
38-
return ExtractParentContext(message);
43+
var parentRecord = sqsEvent.Records.LastOrDefault();
44+
var parentContext = ExtractParentContext(parentRecord);
45+
46+
var links = new List<ActivityLink>();
47+
foreach (var record in sqsEvent.Records)
48+
{
49+
var context = ExtractParentContext(record);
50+
if (context != default)
51+
{
52+
links.Add(new ActivityLink(context.ActivityContext));
53+
}
54+
}
55+
56+
return (parentContext, links);
3957
}
4058

4159
internal static PropagationContext ExtractParentContext(SQSEvent.SQSMessage sqsMessage)

0 commit comments

Comments
 (0)