diff --git a/tracer/build/supported_calltargets.g.json b/tracer/build/supported_calltargets.g.json
index ee02f8645bcb..fcfaf9eaef22 100644
--- a/tracer/build/supported_calltargets.g.json
+++ b/tracer/build/supported_calltargets.g.json
@@ -6810,6 +6810,30 @@
"IsAdoNetIntegration": false,
"InstrumentationCategory": 1
},
+ {
+ "IntegrationName": "DatadogTraceManual",
+ "AssemblyName": "Datadog.Trace.Manual",
+ "TargetTypeName": "Datadog.Trace.FeatureFlags.FeatureFlagsSdk",
+ "TargetMethodName": "InitializeAsync",
+ "TargetReturnType": "System.Threading.Tasks.Task",
+ "TargetParameterTypes": [
+ "System.Threading.CancellationToken"
+ ],
+ "MinimumVersion": {
+ "Item1": 3,
+ "Item2": 31,
+ "Item3": 0
+ },
+ "MaximumVersion": {
+ "Item1": 3,
+ "Item2": 65535,
+ "Item3": 65535
+ },
+ "InstrumentationTypeName": "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkInitializeAsyncIntegration",
+ "IntegrationKind": 0,
+ "IsAdoNetIntegration": false,
+ "InstrumentationCategory": 1
+ },
{
"IntegrationName": "DatadogTraceManual",
"AssemblyName": "Datadog.Trace.Manual",
diff --git a/tracer/src/Datadog.Trace.Manual/FeatureFlags/FeatureFlagsSdk.cs b/tracer/src/Datadog.Trace.Manual/FeatureFlags/FeatureFlagsSdk.cs
index f6e880dcaa99..c03e3c7bfabd 100644
--- a/tracer/src/Datadog.Trace.Manual/FeatureFlags/FeatureFlagsSdk.cs
+++ b/tracer/src/Datadog.Trace.Manual/FeatureFlags/FeatureFlagsSdk.cs
@@ -6,6 +6,8 @@
#nullable enable
using System.ComponentModel;
using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
using Datadog.Trace.SourceGenerators;
namespace Datadog.Trace.FeatureFlags;
@@ -23,6 +25,17 @@ public static class FeatureFlagsSdk
[MethodImpl(MethodImplOptions.NoInlining)]
public static bool IsAvailable() => false;
+ ///
+ /// Activates flag configuration delivery and waits for the first configuration to arrive.
+ /// Delivery only starts here, because requesting configuration is billable and installing the
+ /// tracer alone must not do it.
+ ///
+ /// Cancellation token
+ /// A task that completes once configuration has arrived, or the initialization timeout has elapsed
+ [Instrumented]
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ public static Task InitializeAsync(CancellationToken cancellationToken) => Task.CompletedTask;
+
/// Installs an event handler to be fired when a new config has been received
/// Action to be called when the event is fired
[Instrumented]
diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkInitializeAsyncIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkInitializeAsyncIntegration.cs
new file mode 100644
index 000000000000..4905e708193a
--- /dev/null
+++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkInitializeAsyncIntegration.cs
@@ -0,0 +1,52 @@
+//
+// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License.
+// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc.
+//
+#nullable enable
+
+using System;
+using System.ComponentModel;
+using System.Threading;
+using System.Threading.Tasks;
+using Datadog.Trace.ClrProfiler.CallTarget;
+using Datadog.Trace.Configuration;
+
+namespace Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual;
+
+///
+/// System.Threading.Tasks.Task Datadog.Trace.FeatureFlags.FeatureFlagsSdk::InitializeAsync(System.Threading.CancellationToken) calltarget instrumentation
+///
+[InstrumentMethod(
+ AssemblyName = "Datadog.Trace.Manual",
+ TypeName = "Datadog.Trace.FeatureFlags.FeatureFlagsSdk",
+ MethodName = "InitializeAsync",
+ ReturnTypeName = ClrNames.Task,
+ ParameterTypeNames = [ClrNames.CancellationToken],
+ MinimumVersion = "3.31.0",
+ MaximumVersion = "3.*.*",
+ IntegrationName = nameof(IntegrationId.DatadogTraceManual))]
+[Browsable(false)]
+[EditorBrowsable(EditorBrowsableState.Never)]
+public sealed class FeatureFlagsSdkInitializeAsyncIntegration
+{
+ internal static CallTargetState OnMethodBegin(ref CancellationToken cancellationToken)
+ => new CallTargetState(scope: null, state: cancellationToken);
+
+ internal static CallTargetReturn OnMethodEnd(Task returnValue, Exception? exception, in CallTargetState state)
+ {
+ if (exception is not null)
+ {
+ return new CallTargetReturn(returnValue);
+ }
+
+ // Delivery only starts here, because requesting configuration is billable, and the tracer
+ // must not start until application code adopts the provider.
+ if (TracerManager.Instance.FeatureFlags is { } featureFlags)
+ {
+ var cancellationToken = state.State is CancellationToken token ? token : default;
+ return new CallTargetReturn(featureFlags.InitializeAsync(cancellationToken));
+ }
+
+ return new CallTargetReturn(returnValue);
+ }
+}
diff --git a/tracer/src/Datadog.Trace/Generated/net461/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs b/tracer/src/Datadog.Trace/Generated/net461/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
index da754bf817a9..8fba34b26af7 100644
--- a/tracer/src/Datadog.Trace/Generated/net461/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
+++ b/tracer/src/Datadog.Trace/Generated/net461/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
@@ -312,6 +312,7 @@ internal static bool IsInstrumentedAssembly(string assemblyName)
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.DataStreams.DataStreamsTrackTransactionIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Extensions.SpanExtensionsSetTraceSamplingPriorityIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkEvaluateIntegration"
+ or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkInitializeAsyncIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkIsAvailableIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorConstructorIntegration"
diff --git a/tracer/src/Datadog.Trace/Generated/net6.0/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs b/tracer/src/Datadog.Trace/Generated/net6.0/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
index 1683faa598c2..076fcac12a5e 100644
--- a/tracer/src/Datadog.Trace/Generated/net6.0/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
+++ b/tracer/src/Datadog.Trace/Generated/net6.0/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
@@ -329,6 +329,7 @@ internal static bool IsInstrumentedAssembly(string assemblyName)
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.DataStreams.DataStreamsTrackTransactionIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Extensions.SpanExtensionsSetTraceSamplingPriorityIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkEvaluateIntegration"
+ or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkInitializeAsyncIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkIsAvailableIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorConstructorIntegration"
diff --git a/tracer/src/Datadog.Trace/Generated/netcoreapp3.1/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs b/tracer/src/Datadog.Trace/Generated/netcoreapp3.1/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
index 3798b9500361..207edb8d4ce0 100644
--- a/tracer/src/Datadog.Trace/Generated/netcoreapp3.1/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
+++ b/tracer/src/Datadog.Trace/Generated/netcoreapp3.1/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
@@ -324,6 +324,7 @@ internal static bool IsInstrumentedAssembly(string assemblyName)
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.DataStreams.DataStreamsTrackTransactionIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Extensions.SpanExtensionsSetTraceSamplingPriorityIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkEvaluateIntegration"
+ or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkInitializeAsyncIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkIsAvailableIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorConstructorIntegration"
diff --git a/tracer/src/Datadog.Trace/Generated/netstandard2.0/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs b/tracer/src/Datadog.Trace/Generated/netstandard2.0/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
index 3798b9500361..207edb8d4ce0 100644
--- a/tracer/src/Datadog.Trace/Generated/netstandard2.0/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
+++ b/tracer/src/Datadog.Trace/Generated/netstandard2.0/Datadog.Trace.SourceGenerators/InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs
@@ -324,6 +324,7 @@ internal static bool IsInstrumentedAssembly(string assemblyName)
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.DataStreams.DataStreamsTrackTransactionIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Extensions.SpanExtensionsSetTraceSamplingPriorityIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkEvaluateIntegration"
+ or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkInitializeAsyncIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkIsAvailableIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration"
or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorConstructorIntegration"
diff --git a/tracer/src/Datadog.Tracer.Native/Generated/generated_calltargets.g.cpp b/tracer/src/Datadog.Tracer.Native/Generated/generated_calltargets.g.cpp
index deb5d2182031..9469dfebe32d 100644
--- a/tracer/src/Datadog.Tracer.Native/Generated/generated_calltargets.g.cpp
+++ b/tracer/src/Datadog.Tracer.Native/Generated/generated_calltargets.g.cpp
@@ -722,6 +722,7 @@ std::vector callTargets =
{(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.DataStreams"),(WCHAR*)WStr("TrackTransactionInternal"),sig401,3,3,43,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.DataStreams.DataStreamsTrackTransactionIntegration"),CallTargetKind::Default,1,15},
{(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.ExtensionMethods.SpanExtensions"),(WCHAR*)WStr("SetTraceSamplingPriority"),sig336,3,3,0,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Extensions.SpanExtensionsSetTraceSamplingPriorityIntegration"),CallTargetKind::Default,1,15},
{(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.FeatureFlags.FeatureFlagsSdk"),(WCHAR*)WStr("Evaluate"),sig061,6,3,31,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkEvaluateIntegration"),CallTargetKind::Default,1,15},
+{(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.FeatureFlags.FeatureFlagsSdk"),(WCHAR*)WStr("InitializeAsync"),sig217,2,3,31,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkInitializeAsyncIntegration"),CallTargetKind::Default,1,15},
{(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.FeatureFlags.FeatureFlagsSdk"),(WCHAR*)WStr("IsAvailable"),sig129,1,3,31,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkIsAvailableIntegration"),CallTargetKind::Default,1,15},
{(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.FeatureFlags.FeatureFlagsSdk"),(WCHAR*)WStr("RegisterOnNewConfigEventHandler"),sig356,2,3,31,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration"),CallTargetKind::Default,1,15},
{(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.SpanContextExtractor"),(WCHAR*)WStr(".ctor"),sig326,1,3,0,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorConstructorIntegration"),CallTargetKind::Default,1,15},