diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5e09b89bb463..19db8872d667 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -195,12 +195,9 @@ Datadog.Trace.Debugger.slnf @DataDog/debugger-dotnet /docs/Datadog.FeatureFlags.OpenFeature/ @DataDog/feature-flagging-and-experimentation-sdk @DataDog/tracing-dotnet /tracer/src/Datadog.FeatureFlags.OpenFeature/ @DataDog/feature-flagging-and-experimentation-sdk @DataDog/tracing-dotnet /tracer/src/Datadog.Trace/FeatureFlags/ @DataDog/feature-flagging-and-experimentation-sdk @DataDog/tracing-dotnet -/tracer/src/Datadog.Trace.Manual/FeatureFlags/ @DataDog/feature-flagging-and-experimentation-sdk @DataDog/tracing-dotnet -/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/ @DataDog/feature-flagging-and-experimentation-sdk @DataDog/tracing-dotnet /tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/OpenFeature/ @DataDog/feature-flagging-and-experimentation-sdk @DataDog/tracing-dotnet /tracer/test/Datadog.Trace.Tests/FeatureFlags/ @DataDog/feature-flagging-and-experimentation-sdk @DataDog/tracing-dotnet /tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/FeatureFlags/ @DataDog/feature-flagging-and-experimentation-sdk @DataDog/tracing-dotnet -/tracer/test/test-applications/integrations/Samples.FeatureFlags/ @DataDog/feature-flagging-and-experimentation-sdk @DataDog/tracing-dotnet /tracer/test/test-applications/integrations/Samples.OpenFeature/ @DataDog/feature-flagging-and-experimentation-sdk @DataDog/tracing-dotnet # CI diff --git a/Datadog.Trace.Samples.g.sln b/Datadog.Trace.Samples.g.sln index 8dd6eb9e92ad..c45f780eca9a 100644 --- a/Datadog.Trace.Samples.g.sln +++ b/Datadog.Trace.Samples.g.sln @@ -453,8 +453,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Quartz", "tracer\te EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.AzureFunctions.V4Isolated.HostLogsDisabled", "tracer\test\test-applications\azure-functions\Samples.AzureFunctions.V4Isolated.HostLogsDisabled\Samples.AzureFunctions.V4Isolated.HostLogsDisabled.csproj", "{C770F9F8-0430-587D-EB7A-8BEC2FE9B61C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.FeatureFlags", "tracer\test\test-applications\integrations\Samples.FeatureFlags\Samples.FeatureFlags.csproj", "{D5A8ABB9-CB23-974E-F338-5D9172D96CD8}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.OpenFeature", "tracer\test\test-applications\integrations\Samples.OpenFeature\Samples.OpenFeature.csproj", "{021D714E-1764-D76B-15B5-C9114FE934C2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.LifetimeManager.TerminationSignals", "tracer\test\test-applications\integrations\Samples.LifetimeManager.TerminationSignals\Samples.LifetimeManager.TerminationSignals.csproj", "{0E3E1069-80FF-99C9-D29F-936D96D5F516}" @@ -1107,10 +1105,6 @@ Global {C770F9F8-0430-587D-EB7A-8BEC2FE9B61C}.Debug|Any CPU.Build.0 = Debug|Any CPU {C770F9F8-0430-587D-EB7A-8BEC2FE9B61C}.Release|Any CPU.ActiveCfg = Release|Any CPU {C770F9F8-0430-587D-EB7A-8BEC2FE9B61C}.Release|Any CPU.Build.0 = Release|Any CPU - {D5A8ABB9-CB23-974E-F338-5D9172D96CD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5A8ABB9-CB23-974E-F338-5D9172D96CD8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5A8ABB9-CB23-974E-F338-5D9172D96CD8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5A8ABB9-CB23-974E-F338-5D9172D96CD8}.Release|Any CPU.Build.0 = Release|Any CPU {021D714E-1764-D76B-15B5-C9114FE934C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {021D714E-1764-D76B-15B5-C9114FE934C2}.Debug|Any CPU.Build.0 = Debug|Any CPU {021D714E-1764-D76B-15B5-C9114FE934C2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -1305,7 +1299,6 @@ Global {59A9EDCD-6892-4817-8957-54DE84BDCAFB} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} {CF69BC17-1527-425A-9B02-8E223BC31DB8} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} {C770F9F8-0430-587D-EB7A-8BEC2FE9B61C} = {C4C1E313-C7C1-4490-AECE-0DD0062380A4} - {D5A8ABB9-CB23-974E-F338-5D9172D96CD8} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} {021D714E-1764-D76B-15B5-C9114FE934C2} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} {0E3E1069-80FF-99C9-D29F-936D96D5F516} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} {08C6510D-42DC-C8B4-CC79-26349F2D6DBB} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} diff --git a/Datadog.Trace.sln b/Datadog.Trace.sln index 8dd1047bbd81..5125ee1a69b6 100644 --- a/Datadog.Trace.sln +++ b/Datadog.Trace.sln @@ -639,8 +639,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Quartz", "tracer\te EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.AzureFunctions.V4Isolated.HostLogsDisabled", "tracer\test\test-applications\azure-functions\Samples.AzureFunctions.V4Isolated.HostLogsDisabled\Samples.AzureFunctions.V4Isolated.HostLogsDisabled.csproj", "{C770F9F8-0430-587D-EB7A-8BEC2FE9B61C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.FeatureFlags", "tracer\test\test-applications\integrations\Samples.FeatureFlags\Samples.FeatureFlags.csproj", "{D5A8ABB9-CB23-974E-F338-5D9172D96CD8}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.OpenFeature", "tracer\test\test-applications\integrations\Samples.OpenFeature\Samples.OpenFeature.csproj", "{021D714E-1764-D76B-15B5-C9114FE934C2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Datadog.Trace.Tools.Analyzers.CodeFixes", "tracer\src\Datadog.Trace.Tools.Analyzers.CodeFixes\Datadog.Trace.Tools.Analyzers.CodeFixes.csproj", "{32521F0A-D52D-4DB1-86C4-3D72DEDA6E55}" @@ -1573,10 +1571,6 @@ Global {C770F9F8-0430-587D-EB7A-8BEC2FE9B61C}.Debug|Any CPU.Build.0 = Debug|Any CPU {C770F9F8-0430-587D-EB7A-8BEC2FE9B61C}.Release|Any CPU.ActiveCfg = Release|Any CPU {C770F9F8-0430-587D-EB7A-8BEC2FE9B61C}.Release|Any CPU.Build.0 = Release|Any CPU - {D5A8ABB9-CB23-974E-F338-5D9172D96CD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5A8ABB9-CB23-974E-F338-5D9172D96CD8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5A8ABB9-CB23-974E-F338-5D9172D96CD8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5A8ABB9-CB23-974E-F338-5D9172D96CD8}.Release|Any CPU.Build.0 = Release|Any CPU {021D714E-1764-D76B-15B5-C9114FE934C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {021D714E-1764-D76B-15B5-C9114FE934C2}.Debug|Any CPU.Build.0 = Debug|Any CPU {021D714E-1764-D76B-15B5-C9114FE934C2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -1862,7 +1856,6 @@ Global {59A9EDCD-6892-4817-8957-54DE84BDCAFB} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} {CF69BC17-1527-425A-9B02-8E223BC31DB8} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} {C770F9F8-0430-587D-EB7A-8BEC2FE9B61C} = {C4C1E313-C7C1-4490-AECE-0DD0062380A4} - {D5A8ABB9-CB23-974E-F338-5D9172D96CD8} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} {021D714E-1764-D76B-15B5-C9114FE934C2} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} {32521F0A-D52D-4DB1-86C4-3D72DEDA6E55} = {9E5F0022-0A50-40BF-AC6A-C3078585ECAB} {64258238-DE63-4A0F-A618-DF51735BA22A} = {8CEC2042-F11C-49F5-A674-2355793B600A} diff --git a/tracer/build/supported_calltargets.g.json b/tracer/build/supported_calltargets.g.json index 138a50a9b193..b67684b87fea 100644 --- a/tracer/build/supported_calltargets.g.json +++ b/tracer/build/supported_calltargets.g.json @@ -6810,80 +6810,6 @@ "IsAdoNetIntegration": false, "InstrumentationCategory": 1 }, - { - "IntegrationName": "DatadogTraceManual", - "AssemblyName": "Datadog.Trace.Manual", - "TargetTypeName": "Datadog.Trace.FeatureFlags.FeatureFlagsSdk", - "TargetMethodName": "Evaluate", - "TargetReturnType": "Datadog.Trace.FeatureFlags.IEvaluation", - "TargetParameterTypes": [ - "System.String", - "Datadog.Trace.FeatureFlags.ValueType", - "System.Object", - "System.String", - "System.Collections.Generic.IDictionary`2[System.String,System.Object]" - ], - "MinimumVersion": { - "Item1": 3, - "Item2": 31, - "Item3": 0 - }, - "MaximumVersion": { - "Item1": 3, - "Item2": 65535, - "Item3": 65535 - }, - "InstrumentationTypeName": "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkEvaluateIntegration", - "IntegrationKind": 0, - "IsAdoNetIntegration": false, - "InstrumentationCategory": 1 - }, - { - "IntegrationName": "DatadogTraceManual", - "AssemblyName": "Datadog.Trace.Manual", - "TargetTypeName": "Datadog.Trace.FeatureFlags.FeatureFlagsSdk", - "TargetMethodName": "IsAvailable", - "TargetReturnType": "System.Boolean", - "TargetParameterTypes": [], - "MinimumVersion": { - "Item1": 3, - "Item2": 31, - "Item3": 0 - }, - "MaximumVersion": { - "Item1": 3, - "Item2": 65535, - "Item3": 65535 - }, - "InstrumentationTypeName": "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkIsAvailableIntegration", - "IntegrationKind": 0, - "IsAdoNetIntegration": false, - "InstrumentationCategory": 1 - }, - { - "IntegrationName": "DatadogTraceManual", - "AssemblyName": "Datadog.Trace.Manual", - "TargetTypeName": "Datadog.Trace.FeatureFlags.FeatureFlagsSdk", - "TargetMethodName": "RegisterOnNewConfigEventHandler", - "TargetReturnType": "System.Void", - "TargetParameterTypes": [ - "System.Action" - ], - "MinimumVersion": { - "Item1": 3, - "Item2": 31, - "Item3": 0 - }, - "MaximumVersion": { - "Item1": 3, - "Item2": 65535, - "Item3": 65535 - }, - "InstrumentationTypeName": "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration", - "IntegrationKind": 0, - "IsAdoNetIntegration": false, - "InstrumentationCategory": 1 - }, { "IntegrationName": "DatadogTraceManual", "AssemblyName": "Datadog.Trace.Manual", diff --git a/tracer/src/Datadog.Trace.Manual/Datadog.Trace.Manual.csproj b/tracer/src/Datadog.Trace.Manual/Datadog.Trace.Manual.csproj index 3a424a0fd5c6..db50148270f1 100644 --- a/tracer/src/Datadog.Trace.Manual/Datadog.Trace.Manual.csproj +++ b/tracer/src/Datadog.Trace.Manual/Datadog.Trace.Manual.csproj @@ -29,9 +29,6 @@ - - - diff --git a/tracer/src/Datadog.Trace.Manual/FeatureFlags/EvaluationContext.cs b/tracer/src/Datadog.Trace.Manual/FeatureFlags/EvaluationContext.cs deleted file mode 100644 index c2b2ea1d8b64..000000000000 --- a/tracer/src/Datadog.Trace.Manual/FeatureFlags/EvaluationContext.cs +++ /dev/null @@ -1,22 +0,0 @@ -// -// 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. -// - -using System.ComponentModel; - -namespace Datadog.Trace.FeatureFlags; - -/// Standard implementation of a EvaluationContext -/// Targeting Key -/// Context optional parameters -[EditorBrowsable(EditorBrowsableState.Never)] -[Browsable(false)] -public sealed class EvaluationContext(string? key, IDictionary? values = null) -{ - /// Gets the Context Targeting Key - public string? TargetingKey { get; } = key; - - /// Gets the Context optional Values - public IDictionary? Attributes { get; } = values; -} diff --git a/tracer/src/Datadog.Trace.Manual/FeatureFlags/FeatureFlagsSdk.cs b/tracer/src/Datadog.Trace.Manual/FeatureFlags/FeatureFlagsSdk.cs deleted file mode 100644 index f6e880dcaa99..000000000000 --- a/tracer/src/Datadog.Trace.Manual/FeatureFlags/FeatureFlagsSdk.cs +++ /dev/null @@ -1,56 +0,0 @@ -// -// 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.ComponentModel; -using System.Runtime.CompilerServices; -using Datadog.Trace.SourceGenerators; - -namespace Datadog.Trace.FeatureFlags; - -/// -/// Functions to retrieve FeatureFlags from server -/// -[EditorBrowsable(EditorBrowsableState.Never)] -[Browsable(false)] -public static class FeatureFlagsSdk -{ - /// Gets a value indicating whether FeatureFlags framework is available or not - /// True if FeatureFlagsSDK is instrumented - [Instrumented] - [MethodImpl(MethodImplOptions.NoInlining)] - public static bool IsAvailable() => false; - - /// Installs an event handler to be fired when a new config has been received - /// Action to be called when the event is fired - [Instrumented] - [MethodImpl(MethodImplOptions.NoInlining)] - public static void RegisterOnNewConfigEventHandler(Action onNewConfig) - { - } - - /// - /// Returns the evaluation of the requested flag key - /// - /// Returns the evaluation result - /// The feature flag key to evaluate - /// The desired result type - /// The default value - /// The evaluation context - public static IEvaluation? Evaluate(string flagKey, ValueType targetType, object? defaultValue, EvaluationContext? context) - => Evaluate(flagKey, targetType, defaultValue, context?.TargetingKey, context?.Attributes); - - [Instrumented] - [MethodImpl(MethodImplOptions.NoInlining)] - private static IEvaluation? Evaluate(string flagKey, ValueType targetType, object? defaultValue, string? targetingKey, IDictionary? attributes) - { - if (flagKey is null) - { - throw new ArgumentNullException(nameof(flagKey)); - } - - return null; - } -} diff --git a/tracer/src/Datadog.Trace.Manual/FeatureFlags/IEvaluation.Manual.cs b/tracer/src/Datadog.Trace.Manual/FeatureFlags/IEvaluation.Manual.cs deleted file mode 100644 index daf3ed42d3b0..000000000000 --- a/tracer/src/Datadog.Trace.Manual/FeatureFlags/IEvaluation.Manual.cs +++ /dev/null @@ -1,15 +0,0 @@ -// -// 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. -// - -using Datadog.Trace.DuckTyping; - -namespace Datadog.Trace.FeatureFlags; - -/// A Evaluate result. -[DuckType("Datadog.Trace.FeatureFlags.Evaluation", "Datadog.Trace")] -[DuckAsClass] -public partial interface IEvaluation -{ -} diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkEvaluateIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkEvaluateIntegration.cs deleted file mode 100644 index ef658f6d5278..000000000000 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkEvaluateIntegration.cs +++ /dev/null @@ -1,73 +0,0 @@ -// -// 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.Collections.Generic; -using System.ComponentModel; -using Datadog.Trace.ClrProfiler.CallTarget; -using Datadog.Trace.Configuration; -using Datadog.Trace.DuckTyping; -using Datadog.Trace.FeatureFlags; - -namespace Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual; - -/// -/// Datadog.Trace.FeatureFlags.IEvaluation Datadog.Trace.FeatureFlags.FeatureFlagsSdk::Evaluate(System.String,System.Type,System.Object,Datadog.Trace.FeatureFlags.IEvaluationContext) calltarget instrumentation -/// -[InstrumentMethod( - AssemblyName = "Datadog.Trace.Manual", - TypeName = "Datadog.Trace.FeatureFlags.FeatureFlagsSdk", - MethodName = "Evaluate", - ReturnTypeName = "Datadog.Trace.FeatureFlags.IEvaluation", - ParameterTypeNames = [ClrNames.String, "Datadog.Trace.FeatureFlags.ValueType", ClrNames.Object, ClrNames.String, "System.Collections.Generic.IDictionary`2[System.String,System.Object]"], - MinimumVersion = "3.31.0", - MaximumVersion = "3.*.*", - IntegrationName = nameof(IntegrationId.DatadogTraceManual))] -[Browsable(false)] -[EditorBrowsable(EditorBrowsableState.Never)] -public sealed class FeatureFlagsSdkEvaluateIntegration -{ - internal static CallTargetState OnMethodBegin(ref string flagKey, FeatureFlags.ValueType targetType, ref object? defaultValue, ref string? targetingKey, ref IDictionary? attributes) - { - return new CallTargetState(null, new State(flagKey, targetType, defaultValue, targetingKey, attributes)); - } - - internal static CallTargetReturn OnMethodEnd(TReturn? returnValue, Exception? exception, in CallTargetState state) - { - if (exception is not null) - { - // invalid call to the API e.g. non-null args were null. Just let it bubble up. - return new CallTargetReturn(returnValue); - } - - var tracer = Datadog.Trace.Tracer.Instance; - if (tracer.TracerManager.FeatureFlags is not { } flags) - { - // Feature flags disabled: don't touch async-local scope state for a no-op. - return new CallTargetReturn(returnValue); - } - - // Manual API users may not call InitializeAsync before Evaluate. Activate delivery as a - // fallback so the agentless poller starts on first evaluation, not never. - flags.Activate(); - - var parameters = (State)state.State!; - var res = flags.Evaluate(parameters.FlagKey, parameters.TargetType, parameters.DefaultValue, parameters.TargetingKey ?? string.Empty, parameters.Attributes); - var traceContext = tracer.InternalActiveScope?.Span?.Context.TraceContext; - - // Skip creating per-trace state for evaluations that would record nothing. - if (traceContext is not null && SpanEnrichmentState.IsRecordable(res)) - { - traceContext.GetOrCreateFeatureFlagEnrichment()?.AccumulateEvaluation(res, parameters.TargetingKey); - } - - return new CallTargetReturn(res.DuckCast()); - } - - private sealed record State(string FlagKey, FeatureFlags.ValueType TargetType, object? DefaultValue, string? TargetingKey, IDictionary? Attributes) - { - } -} diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkIsAvailableIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkIsAvailableIntegration.cs deleted file mode 100644 index 244d9fedff32..000000000000 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkIsAvailableIntegration.cs +++ /dev/null @@ -1,34 +0,0 @@ -// -// 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 Datadog.Trace.ClrProfiler.CallTarget; -using Datadog.Trace.Configuration; - -namespace Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual; - -/// -/// System.Boolean Datadog.Trace.FeatureFlags.FeatureFlagsSdk::IsAvailable() calltarget instrumentation -/// -[InstrumentMethod( - AssemblyName = "Datadog.Trace.Manual", - TypeName = "Datadog.Trace.FeatureFlags.FeatureFlagsSdk", - MethodName = "IsAvailable", - ReturnTypeName = ClrNames.Bool, - ParameterTypeNames = [], - MinimumVersion = "3.31.0", - MaximumVersion = "3.*.*", - IntegrationName = nameof(IntegrationId.DatadogTraceManual))] -[Browsable(false)] -[EditorBrowsable(EditorBrowsableState.Never)] -public sealed class FeatureFlagsSdkIsAvailableIntegration -{ - internal static CallTargetReturn OnMethodEnd(bool returnValue, Exception? exception, in CallTargetState state) - { - return new CallTargetReturn(true); - } -} diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration.cs deleted file mode 100644 index bc042995a343..000000000000 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/ManualInstrumentation/FeatureFlags/FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration.cs +++ /dev/null @@ -1,35 +0,0 @@ -// -// 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 Datadog.Trace.ClrProfiler.CallTarget; -using Datadog.Trace.Configuration; - -namespace Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual; - -/// -/// System.Void Datadog.Trace.FeatureFlags.FeatureFlagsSdk::RegisterOnNewConfigEventHandler(System.Action) calltarget instrumentation -/// -[InstrumentMethod( - AssemblyName = "Datadog.Trace.Manual", - TypeName = "Datadog.Trace.FeatureFlags.FeatureFlagsSdk", - MethodName = "RegisterOnNewConfigEventHandler", - ReturnTypeName = ClrNames.Void, - ParameterTypeNames = ["System.Action"], - MinimumVersion = "3.31.0", - MaximumVersion = "3.*.*", - IntegrationName = nameof(IntegrationId.DatadogTraceManual))] -[Browsable(false)] -[EditorBrowsable(EditorBrowsableState.Never)] -public sealed class FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration -{ - internal static CallTargetState OnMethodBegin(ref Action? onNewConfig) - { - TracerManager.Instance.FeatureFlags?.RegisterOnNewConfigEventHandler(onNewConfig); - return CallTargetState.GetDefault(); - } -} 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 3de279a559ad..9f8e7630b90c 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,9 +312,6 @@ internal static bool IsInstrumentedAssembly(string assemblyName) or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Configuration.TracerSettings.DiagnosticSourceEnabledSetIntegration" 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.FeatureFlagsSdkIsAvailableIntegration" - or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorConstructorIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorExtractIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorExtractIncludingDsmIntegration" 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 018bd3e0dfb1..3642bb482210 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 @@ -328,9 +328,6 @@ internal static bool IsInstrumentedAssembly(string assemblyName) or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Configuration.TracerSettings.DiagnosticSourceEnabledSetIntegration" 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.FeatureFlagsSdkIsAvailableIntegration" - or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorConstructorIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorExtractIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorExtractIncludingDsmIntegration" 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 6d2af46d8c58..0ff4847ec233 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 @@ -323,9 +323,6 @@ internal static bool IsInstrumentedAssembly(string assemblyName) or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Configuration.TracerSettings.DiagnosticSourceEnabledSetIntegration" 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.FeatureFlagsSdkIsAvailableIntegration" - or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorConstructorIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorExtractIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorExtractIncludingDsmIntegration" 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 6d2af46d8c58..0ff4847ec233 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 @@ -323,9 +323,6 @@ internal static bool IsInstrumentedAssembly(string assemblyName) or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Configuration.TracerSettings.DiagnosticSourceEnabledSetIntegration" 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.FeatureFlagsSdkIsAvailableIntegration" - or "Datadog.Trace.ClrProfiler.AutoInstrumentation.Datadog_Trace_Manual.FeatureFlagsSdkRegisterOnNewConfigEventHandlerIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorConstructorIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorExtractIntegration" or "Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorExtractIncludingDsmIntegration" 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 fab3f2ca21d3..007a7d5d2e5a 100644 --- a/tracer/src/Datadog.Tracer.Native/Generated/generated_calltargets.g.cpp +++ b/tracer/src/Datadog.Tracer.Native/Generated/generated_calltargets.g.cpp @@ -729,9 +729,6 @@ std::vector callTargets = {(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.Configuration.TracerSettings"),(WCHAR*)WStr("set_DiagnosticSourceEnabled"),sig365,2,3,0,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Configuration.TracerSettings.DiagnosticSourceEnabledSetIntegration"),CallTargetKind::Default,1,15}, {(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.DataStreams"),(WCHAR*)WStr("TrackTransactionInternal"),sig408,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"),sig343,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("IsAvailable"),sig131,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"),sig363,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"),sig332,1,3,0,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorConstructorIntegration"),CallTargetKind::Default,1,15}, {(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.SpanContextExtractor"),(WCHAR*)WStr("Extract"),sig068,3,3,0,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorExtractIntegration"),CallTargetKind::Default,1,15}, {(WCHAR*)WStr("Datadog.Trace.Manual"),(WCHAR*)WStr("Datadog.Trace.SpanContextExtractor"),(WCHAR*)WStr("ExtractIncludingDsm"),sig069,5,3,0,0,3,65535,65535,assemblyName,(WCHAR*)WStr("Datadog.Trace.ClrProfiler.AutoInstrumentation.ManualInstrumentation.Propagators.SpanContextExtractorExtractIncludingDsmIntegration"),CallTargetKind::Default,1,15}, diff --git a/tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/FeatureFlags/FeatureFlagsTests.cs b/tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/FeatureFlags/FeatureFlagsTests.cs index 2a0e935f8a09..f9b92e1c8bb9 100644 --- a/tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/FeatureFlags/FeatureFlagsTests.cs +++ b/tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/FeatureFlags/FeatureFlagsTests.cs @@ -15,8 +15,6 @@ using Xunit; using Xunit.Abstractions; -#pragma warning disable SA1402 // File may only contain a single type - namespace Datadog.Trace.ClrProfiler.IntegrationTests.FeatureFlags; #if NETFRAMEWORK @@ -24,31 +22,12 @@ namespace Datadog.Trace.ClrProfiler.IntegrationTests.FeatureFlags; // Include these tests in the ManualInstrumentation batch [Collection(nameof(ManualInstrumentationTests))] #endif -public class FeatureFlagsTests : FeatureFlagsTestsBase +public class FeatureFlagsTests : TestHelper { public FeatureFlagsTests(ITestOutputHelper output) - : base("FeatureFlags", output) - { - } -} - -#if NETFRAMEWORK -[Collection(nameof(ManualInstrumentationTests))] -#endif -public class OpenFeatureFeatureFlagsTests : FeatureFlagsTestsBase -{ - public OpenFeatureFeatureFlagsTests(ITestOutputHelper output) : base("OpenFeature", output) { } -} - -public abstract class FeatureFlagsTestsBase : TestHelper -{ - public FeatureFlagsTestsBase(string sampleName, ITestOutputHelper output) - : base(sampleName, output) - { - } [SkippableFact] [Trait("RunOnWindows", "True")] @@ -82,6 +61,7 @@ public async Task FfeEnabled() Assert.NotNull(output); Assert.Contains("", output); + Assert.Contains("", output); Assert.Contains("Eval (nonexistent) : ", output); Assert.Contains("Eval (simple-string) : RunTest(MockTracerAgent agent, bool enabled = true, b return process.StandardOutput.ToString(); } } - -#pragma warning restore SA1402 // File may only contain a single type diff --git a/tracer/test/test-applications/integrations/Samples.FeatureFlags/Evaluator.cs b/tracer/test/test-applications/integrations/Samples.FeatureFlags/Evaluator.cs deleted file mode 100644 index c9bd864e6201..000000000000 --- a/tracer/test/test-applications/integrations/Samples.FeatureFlags/Evaluator.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using Datadog.Trace.FeatureFlags; - -namespace Samples.FeatureFlags; -class Evaluator -{ - static Action? _onNewConfig = null; - - public static bool Init() - { - Console.WriteLine("FeatureFlags SDK Sample"); - if (FeatureFlagsSdk.IsAvailable()) - { - Datadog.Trace.FeatureFlags.FeatureFlagsSdk.RegisterOnNewConfigEventHandler(() => _onNewConfig?.Invoke()); - return true; - } - - return false; - } - - public static void RegisterOnNewConfigEventHandler(Action onNewConfig) - { - _onNewConfig = onNewConfig; - } - - public static (string? Value, string? Error)? Evaluate(string key) - { - var evaluation = Datadog.Trace.FeatureFlags.FeatureFlagsSdk.Evaluate(key, Datadog.Trace.FeatureFlags.ValueType.String, "Not found", new EvaluationContext(key)); - - if (evaluation is null) - { - Console.WriteLine($"Eval ({key}) : (FeatureFlagsSdk is disabled)"); - return null; - } - - if (evaluation.Error is not null) - { - Console.WriteLine($"Eval ({key}) : "); - } - else - { - Console.WriteLine($"Eval ({key}) : "}>"); - } - - return (evaluation.Value as string, evaluation.Error); - } - - public static void ExtraChecks() - { - } -} diff --git a/tracer/test/test-applications/integrations/Samples.FeatureFlags/Samples.FeatureFlags.csproj b/tracer/test/test-applications/integrations/Samples.FeatureFlags/Samples.FeatureFlags.csproj deleted file mode 100644 index 2c1d924f1d89..000000000000 --- a/tracer/test/test-applications/integrations/Samples.FeatureFlags/Samples.FeatureFlags.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - - false - false - enable - - - - - - - - - - diff --git a/tracer/test/test-applications/integrations/Samples.OpenFeature/Evaluator.cs b/tracer/test/test-applications/integrations/Samples.OpenFeature/Evaluator.cs index 9a4b7bd59466..4ae361eb4ff8 100644 --- a/tracer/test/test-applications/integrations/Samples.OpenFeature/Evaluator.cs +++ b/tracer/test/test-applications/integrations/Samples.OpenFeature/Evaluator.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using System.Threading.Tasks; using OpenFeature.Model; namespace Samples.FeatureFlags; @@ -9,20 +10,20 @@ class Evaluator static global::OpenFeature.FeatureClient client = null!; // assigned by Init() static Action? _onNewConfig = null; - public static bool Init() + public static async Task Init() { Console.WriteLine("OpenFeature FeatureFlags SDK Sample"); - if (Datadog.FeatureFlags.OpenFeature.DatadogProvider.IsAvailable) + if (!Datadog.FeatureFlags.OpenFeature.DatadogProvider.IsAvailable) { - - global::OpenFeature.Api.Instance.SetProviderAsync(new Datadog.FeatureFlags.OpenFeature.DatadogProvider()).Wait(); - client = global::OpenFeature.Api.Instance.GetClient(); - Datadog.FeatureFlags.OpenFeature.DatadogProvider.RegisterOnNewConfigEventHandler(() => _onNewConfig?.Invoke()); - return true; + return false; } - return false; - + // SetProviderAsync awaits the provider's InitializeAsync, which starts agentless delivery + // and waits for the first configuration. + await global::OpenFeature.Api.Instance.SetProviderAsync(new Datadog.FeatureFlags.OpenFeature.DatadogProvider()); + client = global::OpenFeature.Api.Instance.GetClient(); + Datadog.FeatureFlags.OpenFeature.DatadogProvider.RegisterOnNewConfigEventHandler(() => _onNewConfig?.Invoke()); + return true; } public static void RegisterOnNewConfigEventHandler(Action onNewConfig) diff --git a/tracer/test/test-applications/integrations/Samples.FeatureFlags/Program.cs b/tracer/test/test-applications/integrations/Samples.OpenFeature/Program.cs similarity index 90% rename from tracer/test/test-applications/integrations/Samples.FeatureFlags/Program.cs rename to tracer/test/test-applications/integrations/Samples.OpenFeature/Program.cs index 156c9da29e7b..7408d1eb7c0d 100644 --- a/tracer/test/test-applications/integrations/Samples.FeatureFlags/Program.cs +++ b/tracer/test/test-applications/integrations/Samples.OpenFeature/Program.cs @@ -19,7 +19,7 @@ private async static Task Main(string[] args) int configUpdates = 0; Evaluator.RegisterOnNewConfigEventHandler(() => Interlocked.Increment(ref configUpdates)); - if (!Evaluator.Init()) + if (!await Evaluator.Init()) { Console.WriteLine($""); return; @@ -27,6 +27,11 @@ private async static Task Main(string[] args) Console.WriteLine($""); + // Init() has awaited InitializeAsync, so a known flag resolves now. If the CallTarget stops + // substituting the real task, this prints NOT_READY. + var probe = Evaluator.Evaluate("simple-string"); + Console.WriteLine($""); + var ev = Evaluator.Evaluate("nonexistent"); if (ev == null || ev.Value.Error is "FeatureFlagsSdk is disabled") { diff --git a/tracer/test/test-applications/integrations/Samples.OpenFeature/Samples.OpenFeature.csproj b/tracer/test/test-applications/integrations/Samples.OpenFeature/Samples.OpenFeature.csproj index c5facbd97664..6fa7f23ba66a 100644 --- a/tracer/test/test-applications/integrations/Samples.OpenFeature/Samples.OpenFeature.csproj +++ b/tracer/test/test-applications/integrations/Samples.OpenFeature/Samples.OpenFeature.csproj @@ -8,10 +8,6 @@ 2.3.0 - - - -