Skip to content

Commit 8dc8808

Browse files
nhulstonbouwkast
andauthored
[serverless] Create EventBridge Instrumentation and Inject Trace Context (#6096)
## Summary of changes This creates a new instrumentation for EventBridge and intercepts `PutEvents` and `PutEventsAsync` to inject trace context. This allows the agent to combine spans from a distributed (serverless) architecture into a single trace. This PR only injects trace context. I'm working on [PR 1](DataDog/datadog-agent#29414) and [PR 2](DataDog/datadog-agent#29551) to update the Lambda extension to use this trace context to create EventBridge spans. I am also working on a similar PR in [dd-trace-java](DataDog/dd-trace-java#7613) and dd-trace-go. ## Reason for change SNS and SQS are already supported, and the tracer currently injects trace context into message attributes fields for them. However, EventBridge wasn't supported, and this PR aims to fix this problem. ## Implementation details I followed the [documentation](https://github.com/DataDog/dd-trace-dotnet/blob/master/docs/development/AutomaticInstrumentation.md) to create an instrumentation. Much of the logic was mirrored from the [existing implementation](https://github.com/DataDog/dd-trace-dotnet/tree/master/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AWS/SNS) of SNS, since EventBridge and SNS are extremely similar. Overall, AWS's EventBridge API is lacking some features, so we have to do some hacky solutions. - SNS and SQS call their custom input field messageAttributes, and EventBridge calls it detail - Unlike SNS and SQS, the detail field is given as a raw string. Therefore, we have to manually modify the detail string using StringBuilder. - The agent has no reliable way of getting the start time of the EventBridge span, so the tracer has to put the current time into `detail[_datadog]` under the header `x-datadog-start-time` - The EventBridge API has no way of getting the EventBridge bus name, so the tracer has to put the bus name (which is used to create the span resource name) into `detail[_datadog]` under the header `x-datadog-resource-name` ## Test coverage I added system tests for SNS/SQS: DataDog/system-tests#3204 I added [unit tests](d05eb4c) and [integration tests](5ccd8b7). Unit tests can be ran with: ``` cd tracer dotnet test ./test/Datadog.Trace.ClrProfiler.Managed.Tests ``` Integration tests can be ran with these commands: ``` cd tracer # Start docker localstock docker run --rm -it -p 4566:4566 -p 4571:4571 -e SERVICES=events localstack/localstack # Run integation tests ./build.sh BuildAndRunOSxIntegrationTests -buildConfiguration Debug -framework net6.0 -Filter AwsEventBridgeTests -SampleName Samples.AWS.EventBridge ``` I also did manual testing: <img width="505" alt="Screenshot 2024-09-30 at 11 00 47 AM" src="https://github.com/user-attachments/assets/bdf5d516-8b46-4138-ac25-c45d1822dc56"> ## Other details There are lots of diffs and files changed. I recommend reviewers to review the PR commit by commit. All the autogenerated files were added in a single commit, which should make the review process less overwhelming. <!-- ⚠️ Note: where possible, please obtain 2 approvals prior to merging. Unless CODEOWNERS specifies otherwise, for external teams it is typically best to have one review from a team member, and one review from apm-dotnet. Trivial changes do not require 2 reviews. --> --------- Co-authored-by: Steven Bouwkamp <[email protected]>
1 parent aa5cedc commit 8dc8808

File tree

71 files changed

+3413
-351
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+3413
-351
lines changed

Datadog.Trace.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Generated", "Generated", "{
589589
tracer\build\PackageVersionsLatestSpecific.g.props = tracer\build\PackageVersionsLatestSpecific.g.props
590590
EndProjectSection
591591
EndProject
592+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.AWS.EventBridge", "tracer\test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj", "{D6155F26-8245-4B66-8944-79C3DF9F9DA3}"
593+
EndProject
592594
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AssemblyLoadContextResolve", "tracer\test\test-applications\regression\AssemblyLoadContextResolve\AssemblyLoadContextResolve.csproj", "{8B1AF6A7-DD41-4347-B637-90C23D69B50E}"
593595
EndProject
594596
Global
@@ -1411,6 +1413,10 @@ Global
14111413
{2CA0D70C-DFC1-458A-871B-328AB6E87E3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
14121414
{2CA0D70C-DFC1-458A-871B-328AB6E87E3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
14131415
{2CA0D70C-DFC1-458A-871B-328AB6E87E3A}.Release|Any CPU.Build.0 = Release|Any CPU
1416+
{D6155F26-8245-4B66-8944-79C3DF9F9DA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1417+
{D6155F26-8245-4B66-8944-79C3DF9F9DA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
1418+
{D6155F26-8245-4B66-8944-79C3DF9F9DA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
1419+
{D6155F26-8245-4B66-8944-79C3DF9F9DA3}.Release|Any CPU.Build.0 = Release|Any CPU
14141420
{8B1AF6A7-DD41-4347-B637-90C23D69B50E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
14151421
{8B1AF6A7-DD41-4347-B637-90C23D69B50E}.Debug|Any CPU.Build.0 = Debug|Any CPU
14161422
{8B1AF6A7-DD41-4347-B637-90C23D69B50E}.Release|Any CPU.ActiveCfg = Release|Any CPU

docker-compose.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ services:
44
localstack_arm64:
55
image: localstack/localstack
66
environment:
7-
- SERVICES=sns,sqs,kinesis,dynamodb
7+
- SERVICES=sns,sqs,kinesis,dynamodb,events
88
- DEBUG=1
99
- DATA_DIR=/tmp/localstack/data
1010
- DEFAULT_REGION=us-east-1
@@ -93,7 +93,7 @@ services:
9393
localstack:
9494
image: localstack/localstack
9595
environment:
96-
- SERVICES=sns,sqs,kinesis,dynamodb
96+
- SERVICES=sns,sqs,kinesis,dynamodb,events
9797
- DEBUG=1
9898
- DATA_DIR=/tmp/localstack/data
9999
- DEFAULT_REGION=us-east-1
@@ -1112,7 +1112,7 @@ services:
11121112
localstack_osx_arm64:
11131113
image: localstack/localstack
11141114
environment:
1115-
- SERVICES=sns,sqs,kinesis,dynamodb
1115+
- SERVICES=sns,sqs,kinesis,dynamodb,events
11161116
- DEBUG=1
11171117
- DATA_DIR=/tmp/localstack/data
11181118
- DEFAULT_REGION=us-east-1

tracer/build/PackageVersionsGeneratorDefinitions.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,24 @@
7979
}
8080
]
8181
},
82+
{
83+
"IntegrationName": "AwsEventBridge",
84+
"SampleProjectName": "Samples.AWS.EventBridge",
85+
"NugetPackageSearchName": "AWSSDK.EventBridge",
86+
"MinVersion": "3.3.100",
87+
"MaxVersionExclusive": "4.0.0",
88+
"SpecificVersions": [
89+
"3.3.*",
90+
"3.5.*",
91+
"3.7.*"
92+
],
93+
"VersionConditions": [
94+
{
95+
"MaxVersionExclusive": "3.3.0",
96+
"IncludeOnlyTargetFrameworks": ["net462"]
97+
}
98+
]
99+
},
82100
{
83101
"IntegrationName": "MongoDB",
84102
"SampleProjectName": "Samples.MongoDB",

tracer/build/PackageVersionsLatestMajors.g.props

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,48 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
222222
<RequiresDockerDependency>All</RequiresDockerDependency>
223223
<SampleName>Samples.AWS.SimpleNotificationService</SampleName>
224224
</PackageVersionSample>
225+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
226+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
227+
<TargetFramework>netcoreapp2.1</TargetFramework>
228+
<RequiresDockerDependency>All</RequiresDockerDependency>
229+
<SampleName>Samples.AWS.EventBridge</SampleName>
230+
</PackageVersionSample>
231+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
232+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
233+
<TargetFramework>netcoreapp3.0</TargetFramework>
234+
<RequiresDockerDependency>All</RequiresDockerDependency>
235+
<SampleName>Samples.AWS.EventBridge</SampleName>
236+
</PackageVersionSample>
237+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
238+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
239+
<TargetFramework>netcoreapp3.1</TargetFramework>
240+
<RequiresDockerDependency>All</RequiresDockerDependency>
241+
<SampleName>Samples.AWS.EventBridge</SampleName>
242+
</PackageVersionSample>
243+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
244+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
245+
<TargetFramework>net5.0</TargetFramework>
246+
<RequiresDockerDependency>All</RequiresDockerDependency>
247+
<SampleName>Samples.AWS.EventBridge</SampleName>
248+
</PackageVersionSample>
249+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
250+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
251+
<TargetFramework>net6.0</TargetFramework>
252+
<RequiresDockerDependency>All</RequiresDockerDependency>
253+
<SampleName>Samples.AWS.EventBridge</SampleName>
254+
</PackageVersionSample>
255+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
256+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
257+
<TargetFramework>net7.0</TargetFramework>
258+
<RequiresDockerDependency>All</RequiresDockerDependency>
259+
<SampleName>Samples.AWS.EventBridge</SampleName>
260+
</PackageVersionSample>
261+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
262+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
263+
<TargetFramework>net8.0</TargetFramework>
264+
<RequiresDockerDependency>All</RequiresDockerDependency>
265+
<SampleName>Samples.AWS.EventBridge</SampleName>
266+
</PackageVersionSample>
225267
<PackageVersionSample Include="test\test-applications\integrations\Samples.MongoDB\Samples.MongoDB.csproj">
226268
<Properties>ApiVersion=2.29.0;RestoreRecursive=false;BuildProjectReferences=false</Properties>
227269
<TargetFramework>net462</TargetFramework>

tracer/build/PackageVersionsLatestMinors.g.props

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,132 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
756756
<RequiresDockerDependency>All</RequiresDockerDependency>
757757
<SampleName>Samples.AWS.SimpleNotificationService</SampleName>
758758
</PackageVersionSample>
759+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
760+
<Properties>ApiVersion=3.3.102.16;RestoreRecursive=false;BuildProjectReferences=false</Properties>
761+
<TargetFramework>netcoreapp2.1</TargetFramework>
762+
<RequiresDockerDependency>All</RequiresDockerDependency>
763+
<SampleName>Samples.AWS.EventBridge</SampleName>
764+
</PackageVersionSample>
765+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
766+
<Properties>ApiVersion=3.5.6.5;RestoreRecursive=false;BuildProjectReferences=false</Properties>
767+
<TargetFramework>netcoreapp2.1</TargetFramework>
768+
<RequiresDockerDependency>All</RequiresDockerDependency>
769+
<SampleName>Samples.AWS.EventBridge</SampleName>
770+
</PackageVersionSample>
771+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
772+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
773+
<TargetFramework>netcoreapp2.1</TargetFramework>
774+
<RequiresDockerDependency>All</RequiresDockerDependency>
775+
<SampleName>Samples.AWS.EventBridge</SampleName>
776+
</PackageVersionSample>
777+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
778+
<Properties>ApiVersion=3.3.102.16;RestoreRecursive=false;BuildProjectReferences=false</Properties>
779+
<TargetFramework>netcoreapp3.0</TargetFramework>
780+
<RequiresDockerDependency>All</RequiresDockerDependency>
781+
<SampleName>Samples.AWS.EventBridge</SampleName>
782+
</PackageVersionSample>
783+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
784+
<Properties>ApiVersion=3.5.6.5;RestoreRecursive=false;BuildProjectReferences=false</Properties>
785+
<TargetFramework>netcoreapp3.0</TargetFramework>
786+
<RequiresDockerDependency>All</RequiresDockerDependency>
787+
<SampleName>Samples.AWS.EventBridge</SampleName>
788+
</PackageVersionSample>
789+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
790+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
791+
<TargetFramework>netcoreapp3.0</TargetFramework>
792+
<RequiresDockerDependency>All</RequiresDockerDependency>
793+
<SampleName>Samples.AWS.EventBridge</SampleName>
794+
</PackageVersionSample>
795+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
796+
<Properties>ApiVersion=3.3.102.16;RestoreRecursive=false;BuildProjectReferences=false</Properties>
797+
<TargetFramework>netcoreapp3.1</TargetFramework>
798+
<RequiresDockerDependency>All</RequiresDockerDependency>
799+
<SampleName>Samples.AWS.EventBridge</SampleName>
800+
</PackageVersionSample>
801+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
802+
<Properties>ApiVersion=3.5.6.5;RestoreRecursive=false;BuildProjectReferences=false</Properties>
803+
<TargetFramework>netcoreapp3.1</TargetFramework>
804+
<RequiresDockerDependency>All</RequiresDockerDependency>
805+
<SampleName>Samples.AWS.EventBridge</SampleName>
806+
</PackageVersionSample>
807+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
808+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
809+
<TargetFramework>netcoreapp3.1</TargetFramework>
810+
<RequiresDockerDependency>All</RequiresDockerDependency>
811+
<SampleName>Samples.AWS.EventBridge</SampleName>
812+
</PackageVersionSample>
813+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
814+
<Properties>ApiVersion=3.3.102.16;RestoreRecursive=false;BuildProjectReferences=false</Properties>
815+
<TargetFramework>net5.0</TargetFramework>
816+
<RequiresDockerDependency>All</RequiresDockerDependency>
817+
<SampleName>Samples.AWS.EventBridge</SampleName>
818+
</PackageVersionSample>
819+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
820+
<Properties>ApiVersion=3.5.6.5;RestoreRecursive=false;BuildProjectReferences=false</Properties>
821+
<TargetFramework>net5.0</TargetFramework>
822+
<RequiresDockerDependency>All</RequiresDockerDependency>
823+
<SampleName>Samples.AWS.EventBridge</SampleName>
824+
</PackageVersionSample>
825+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
826+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
827+
<TargetFramework>net5.0</TargetFramework>
828+
<RequiresDockerDependency>All</RequiresDockerDependency>
829+
<SampleName>Samples.AWS.EventBridge</SampleName>
830+
</PackageVersionSample>
831+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
832+
<Properties>ApiVersion=3.3.102.16;RestoreRecursive=false;BuildProjectReferences=false</Properties>
833+
<TargetFramework>net6.0</TargetFramework>
834+
<RequiresDockerDependency>All</RequiresDockerDependency>
835+
<SampleName>Samples.AWS.EventBridge</SampleName>
836+
</PackageVersionSample>
837+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
838+
<Properties>ApiVersion=3.5.6.5;RestoreRecursive=false;BuildProjectReferences=false</Properties>
839+
<TargetFramework>net6.0</TargetFramework>
840+
<RequiresDockerDependency>All</RequiresDockerDependency>
841+
<SampleName>Samples.AWS.EventBridge</SampleName>
842+
</PackageVersionSample>
843+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
844+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
845+
<TargetFramework>net6.0</TargetFramework>
846+
<RequiresDockerDependency>All</RequiresDockerDependency>
847+
<SampleName>Samples.AWS.EventBridge</SampleName>
848+
</PackageVersionSample>
849+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
850+
<Properties>ApiVersion=3.3.102.16;RestoreRecursive=false;BuildProjectReferences=false</Properties>
851+
<TargetFramework>net7.0</TargetFramework>
852+
<RequiresDockerDependency>All</RequiresDockerDependency>
853+
<SampleName>Samples.AWS.EventBridge</SampleName>
854+
</PackageVersionSample>
855+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
856+
<Properties>ApiVersion=3.5.6.5;RestoreRecursive=false;BuildProjectReferences=false</Properties>
857+
<TargetFramework>net7.0</TargetFramework>
858+
<RequiresDockerDependency>All</RequiresDockerDependency>
859+
<SampleName>Samples.AWS.EventBridge</SampleName>
860+
</PackageVersionSample>
861+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
862+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
863+
<TargetFramework>net7.0</TargetFramework>
864+
<RequiresDockerDependency>All</RequiresDockerDependency>
865+
<SampleName>Samples.AWS.EventBridge</SampleName>
866+
</PackageVersionSample>
867+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
868+
<Properties>ApiVersion=3.3.102.16;RestoreRecursive=false;BuildProjectReferences=false</Properties>
869+
<TargetFramework>net8.0</TargetFramework>
870+
<RequiresDockerDependency>All</RequiresDockerDependency>
871+
<SampleName>Samples.AWS.EventBridge</SampleName>
872+
</PackageVersionSample>
873+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
874+
<Properties>ApiVersion=3.5.6.5;RestoreRecursive=false;BuildProjectReferences=false</Properties>
875+
<TargetFramework>net8.0</TargetFramework>
876+
<RequiresDockerDependency>All</RequiresDockerDependency>
877+
<SampleName>Samples.AWS.EventBridge</SampleName>
878+
</PackageVersionSample>
879+
<PackageVersionSample Include="test\test-applications\integrations\Samples.AWS.EventBridge\Samples.AWS.EventBridge.csproj">
880+
<Properties>ApiVersion=3.7.401.25;RestoreRecursive=false;BuildProjectReferences=false</Properties>
881+
<TargetFramework>net8.0</TargetFramework>
882+
<RequiresDockerDependency>All</RequiresDockerDependency>
883+
<SampleName>Samples.AWS.EventBridge</SampleName>
884+
</PackageVersionSample>
759885
<PackageVersionSample Include="test\test-applications\integrations\Samples.MongoDB\Samples.MongoDB.csproj">
760886
<Properties>ApiVersion=2.0.2;RestoreRecursive=false;BuildProjectReferences=false</Properties>
761887
<TargetFramework>net462</TargetFramework>

0 commit comments

Comments
 (0)