Skip to content
Merged
Show file tree
Hide file tree
Changes from 42 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
21a61b3
Implement dynamic configuration for debugger - wip
dudikeleti Aug 7, 2025
4f6544a
do not send new config to intake
dudikeleti Aug 8, 2025
add49c9
delete LiveDebuggingEnabled config key
dudikeleti Aug 8, 2025
3e7d5be
refine debugger manager and di initialization
dudikeleti Aug 10, 2025
8582d3c
Do not use cancellation in dispose
dudikeleti Aug 12, 2025
563831c
Simplify DI initialization
dudikeleti Aug 13, 2025
72c276e
fix build
dudikeleti Aug 13, 2025
03c61a6
Update debugger tests and fix debugger update logic
dudikeleti Aug 13, 2025
249ca0f
remove ongoing cancelation from discovery service
dudikeleti Aug 13, 2025
a97002f
reduce logs and remove telemetries
dudikeleti Sep 1, 2025
6d34303
Update tracer/src/Datadog.Trace/Debugger/ExceptionAutoInstrumentation…
dudikeleti Sep 1, 2025
d93e321
Update tracer/src/Datadog.Trace/Debugger/DynamicInstrumentation.cs
dudikeleti Sep 1, 2025
9cb1162
naming
dudikeleti Sep 1, 2025
e708c80
guard against object disposed
dudikeleti Sep 1, 2025
22b3840
1. delete leftover telemetry record
dudikeleti Sep 1, 2025
93dce8c
Skip update if current == requested
dudikeleti Sep 1, 2025
452f5a0
make DebuggerManager thread safe when enable/disable di
dudikeleti Sep 1, 2025
e1b6cd0
delete unneeded parameters
dudikeleti Sep 1, 2025
97aa891
simplify configs and avoid initialize debugger in case products are e…
dudikeleti Sep 1, 2025
f651bae
fix di tests
dudikeleti Sep 1, 2025
9026854
make sure that we don't create di objects before we need them
dudikeleti Sep 2, 2025
b0b910c
fix race during di state change
dudikeleti Sep 2, 2025
cd23737
delete delay in tests
dudikeleti Sep 3, 2025
0b354eb
Don't use LongRunning and replace try\catch with ContinueWith
dudikeleti Sep 3, 2025
40dba26
Use TaskCompletionSource insteac of CancellationTokenSource
dudikeleti Sep 3, 2025
169f118
reduce logs
dudikeleti Sep 3, 2025
e7a649d
Delete unneeded Task.Run
dudikeleti Sep 3, 2025
6ad39ad
fix build
dudikeleti Sep 4, 2025
b9d83a2
improve how we handle debugger settings and make symdb default true …
dudikeleti Sep 4, 2025
3b01a27
Initialize at startup only when at least one product is enabled
dudikeleti Sep 4, 2025
4242120
Remove private fields from settings and use Enabled & CanBeEnabled
dudikeleti Sep 4, 2025
0c0211e
clean logs
dudikeleti Sep 4, 2025
9e4dba0
add tests
dudikeleti Sep 12, 2025
90e1e81
Fix code origin enabled logic
dudikeleti Sep 16, 2025
9809a3e
fix compilation
dudikeleti Sep 24, 2025
5acada6
Fix compilation
dudikeleti Sep 24, 2025
f9d6b23
Initialize SymbolUploader only if DI is explicitly enabled
dudikeleti Sep 25, 2025
5a773fc
Do not skip on .net8 x86
dudikeleti Sep 25, 2025
d99b07b
Update span decoration and dynamic span integration tests to include …
dudikeleti Sep 26, 2025
f9a87f6
Revert "Do not skip on .net8 x86"
dudikeleti Sep 26, 2025
d7957ca
Delete DynamicInstrumentationTests since all covered in the new Debug…
dudikeleti Sep 27, 2025
0808bc4
Skip memory assertion when there is a timeout
dudikeleti Sep 27, 2025
cb3e1da
Skip x86 .net 8 or greater, investigate in another pr
dudikeleti Sep 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1039,7 +1039,6 @@
<type fullname="System.Threading.Monitor" />
<type fullname="System.Threading.Mutex" />
<type fullname="System.Threading.ReaderWriterLockSlim" />
<type fullname="System.Threading.SemaphoreFullException" />
<type fullname="System.Threading.SemaphoreSlim" />
<type fullname="System.Threading.SpinLock" />
<type fullname="System.Threading.SpinWait" />
Expand Down
34 changes: 18 additions & 16 deletions tracer/src/Datadog.Trace/ClrProfiler/Instrumentation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -496,26 +496,28 @@ private static void StartDiagnosticManager()
private static void InitializeDebugger(TracerSettings tracerSettings)
{
var manager = DebuggerManager.Instance;
if (manager.DebuggerSettings.CodeOriginForSpansEnabled
|| manager.DebuggerSettings.DynamicInstrumentationEnabled
|| manager.ExceptionReplaySettings.Enabled)
var debuggerSettings = manager.DebuggerSettings;

if (!debuggerSettings.DynamicInstrumentationEnabled)
{
_ = Task.Run(
async () =>
{
try
{
await DebuggerManager.Instance.UpdateConfiguration(tracerSettings).ConfigureAwait(false);
}
catch (Exception ex)
{
Log.Error(ex, "Error initializing debugger");
}
});
// we need this line for tests
Log.Information("Dynamic Instrumentation is disabled. To enable it, please set DD_DYNAMIC_INSTRUMENTATION_ENABLED environment variable to 'true'.");
}

if (!debuggerSettings.DynamicInstrumentationEnabled
&& !debuggerSettings.CodeOriginForSpansEnabled
&& !manager.ExceptionReplaySettings.Enabled)
{
Log.Debug("Debugger products are not enabled");
}
else
{
Log.Information($"Dynamic Instrumentation is disabled. To enable it, please set {Datadog.Trace.Configuration.ConfigurationKeys.Debugger.DynamicInstrumentationEnabled} environment variable to 'true'.");
_ = manager.UpdateConfiguration(tracerSettings)
.ContinueWith(
t => Log.Error(t?.Exception, "Error initializing debugger"),
CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.Default);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,15 @@
using System.Collections.ObjectModel;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Datadog.Trace.Configuration.ConfigurationSources;
using Datadog.Trace.Configuration.Telemetry;
using Datadog.Trace.Debugger;
using Datadog.Trace.Debugger.Configurations;
using Datadog.Trace.Logging;
using Datadog.Trace.RemoteConfigurationManagement;
using Datadog.Trace.Telemetry;
using Datadog.Trace.Vendors.Serilog.Events;

namespace Datadog.Trace.Configuration
{
Expand All @@ -41,12 +45,16 @@ public void Start()
{
_subscriptionManager.SubscribeToChanges(_subscription!);

_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingCustomTags, true); // 15
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingHttpHeaderTags, true); // 14
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingLogsInjection, true); // 13
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingSampleRate, true); // 12
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingTracingEnabled, true); // 19
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingSampleRules, true); // 29
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingCustomTags, true); // 15
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingHttpHeaderTags, true); // 14
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingLogsInjection, true); // 13
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingSampleRate, true); // 12
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingTracingEnabled, true); // 19
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingSampleRules, true); // 29
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingEnabledDynamicInstrumentation, true); // 38
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingEnableExceptionReplay, true); // 39
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingEnableCodeOrigin, true); // 40
_subscriptionManager.SetCapability(RcmCapabilitiesIndices.ApmTracingEnableLiveDebugging, true); // 41
}
}

Expand Down Expand Up @@ -91,27 +99,60 @@ private static void OnConfigurationChanged(ConfigurationBuilder settings)
// Needs to be done before returning, to feed the value to the telemetry
// var debugLogsEnabled = settings.WithKeys(ConfigurationKeys.DebugEnabled).AsBool();

TracerSettings newSettings;
if (dynamicSettings.Equals(oldSettings.DynamicSettings))
{
Log.Debug("No changes detected in the new dynamic configuration");
return;
newSettings = oldSettings;
}
else
{
Log.Information("Applying new dynamic configuration");

newSettings = oldSettings with { DynamicSettings = dynamicSettings };

/*
if (debugLogsEnabled != null && debugLogsEnabled.Value != GlobalSettings.Instance.DebugEnabled)
{
GlobalSettings.SetDebugEnabled(debugLogsEnabled.Value);
Security.Instance.SetDebugEnabled(debugLogsEnabled.Value);

Log.Information("Applying new dynamic configuration");
NativeMethods.UpdateSettings(new[] { ConfigurationKeys.DebugEnabled }, new[] { debugLogsEnabled.Value ? "1" : "0" });
}
*/

var newSettings = oldSettings with { DynamicSettings = dynamicSettings };
Tracer.Configure(newSettings);
}

/*
if (debugLogsEnabled != null && debugLogsEnabled.Value != GlobalSettings.Instance.DebugEnabled)
var dynamicDebuggerSettings = new ImmutableDynamicDebuggerSettings
{
GlobalSettings.SetDebugEnabled(debugLogsEnabled.Value);
Security.Instance.SetDebugEnabled(debugLogsEnabled.Value);
DynamicInstrumentationEnabled = settings.WithKeys(ConfigurationKeys.Debugger.DynamicInstrumentationEnabled).AsBool(),
ExceptionReplayEnabled = settings.WithKeys(ConfigurationKeys.Debugger.ExceptionReplayEnabled).AsBool(),
CodeOriginEnabled = settings.WithKeys(ConfigurationKeys.Debugger.CodeOriginForSpansEnabled).AsBool(),
};

NativeMethods.UpdateSettings(new[] { ConfigurationKeys.DebugEnabled }, new[] { debugLogsEnabled.Value ? "1" : "0" });
var oldDebuggerSettings = DebuggerManager.Instance.DebuggerSettings;

if (dynamicDebuggerSettings.Equals(oldDebuggerSettings.DynamicSettings))
{
Log.Debug("No changes detected in the new dynamic debugger configuration");
return;
}
*/

Tracer.Configure(newSettings);
Log.Information("Applying new dynamic debugger configuration");
if (Log.IsEnabled(LogEventLevel.Debug))
{
Log.Debug(
"DynamicInstrumentationEnabled={DynamicInstrumentationEnabled}, ExceptionReplayEnabled={ExceptionReplayEnabled}, CodeOriginEnabled={CodeOriginEnabled}",
dynamicDebuggerSettings.DynamicInstrumentationEnabled,
dynamicDebuggerSettings.ExceptionReplayEnabled,
dynamicDebuggerSettings.CodeOriginEnabled);
}

var newDebuggerSettings = oldDebuggerSettings with { DynamicSettings = dynamicDebuggerSettings };

DebuggerManager.Instance.UpdateConfiguration(newSettings, newDebuggerSettings)
.ContinueWith(t => Log.Error(t?.Exception, "Error updating dynamic configuration for debugger"), TaskContinuationOptions.OnlyOnFaulted);
}

private ApplyDetails[] ConfigurationUpdated(Dictionary<string, List<RemoteConfiguration>> configByProduct, Dictionary<string, List<RemoteConfigurationPath>>? removedConfigByProduct)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// <copyright file="ImmutableDynamicDebuggerSettings.cs" company="Datadog">
// 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.
// </copyright>

#nullable enable

namespace Datadog.Trace.Debugger.Configurations
{
internal record ImmutableDynamicDebuggerSettings
{
public bool? DynamicInstrumentationEnabled { get; init; }

public bool? ExceptionReplayEnabled { get; init; }

public bool? CodeOriginEnabled { get; init; }
}
}
Loading
Loading