Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion tracer/missing-nullability-files.csv
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ src/Datadog.Trace/Configuration/ConfigurationKeys.Iast.cs
src/Datadog.Trace/Configuration/ConfigurationKeys.Logging.cs
src/Datadog.Trace/Configuration/ConfigurationKeys.Rcm.cs
src/Datadog.Trace/Configuration/DbmPropagationLevel.cs
src/Datadog.Trace/Configuration/DeprecationMessages.cs
src/Datadog.Trace/Configuration/DeprecationConstants.cs
src/Datadog.Trace/Configuration/IDynamicConfigurationManager.cs
src/Datadog.Trace/Configuration/IntegrationRegistry.cs
src/Datadog.Trace/Configuration/TracerSettingsConstants.cs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ public bool TraceEnabled
/// </summary>
/// <seealso cref="ConfigurationKeys.GlobalAnalyticsEnabled"/>
#pragma warning restore CS1574
[Obsolete(DeprecationMessages.AppAnalytics)]
[Obsolete(DeprecationConstants.AppAnalytics)]
public bool AnalyticsEnabled
{
[Instrumented]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ public string? ServiceVersion
/// <see cref="Configuration.IntegrationSettings.AnalyticsEnabled"/> on some predetermined integrations.
/// See the documentation for more details.
/// </summary>
[Obsolete(DeprecationMessages.AppAnalytics)]
[Obsolete(DeprecationConstants.AppAnalytics)]
public bool AnalyticsEnabled
{
[Instrumented]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@
<Compile Include="..\Datadog.Trace\Ci\TestStatus.cs" Link="Ci\%(Filename)%(Extension)" />
<Compile Include="..\Datadog.Trace\ClrProfiler\AutoInstrumentation\ManualInstrumentation\TracerSettingKeyConstants.cs" Link="Configuration\%(Filename)%(Extension)" />
<Compile Include="..\Datadog.Trace\ClrProfiler\AutoInstrumentation\ManualInstrumentation\IntegrationSettingsSerializationHelper.cs" Link="Configuration\%(Filename)%(Extension)" />
<Compile Include="..\Datadog.Trace\Configuration\DeprecationMessages.cs" Link="Configuration\%(Filename)%(Extension)" />
<Compile Include="..\Datadog.Trace\Configuration\DeprecationConstants.cs"
Link="Configuration\%(Filename)%(Extension)" />
<Compile Include="..\Datadog.Trace\DuckTyping\DuckAsClassAttribute.cs" Link="DuckTyping\%(Filename)%(Extension)" />
<Compile Include="..\Datadog.Trace\HttpHeaderNames.cs" />
<Compile Include="..\Datadog.Trace\IDatadogOpenTracingTracer.cs" />
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
// <copyright file="JsonReader.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>

using System;
using System.Collections.Generic;
using System.Text;

namespace Datadog.Trace.SourceGenerators.Configuration;

/// <summary>
/// Json reader as we can't really use vendored libraries here, for framework compatibility reasons
/// </summary>
internal static class JsonReader
{
internal static string ExtractJsonObjectSection(string json, string sectionName)
{
var searchPattern = $"\"{sectionName}\":";
var startIndex = json.IndexOf(searchPattern, StringComparison.Ordinal);
if (startIndex == -1)
{
return string.Empty;
}

// Move to the start of the object value
startIndex += searchPattern.Length;

// Skip whitespace to find the opening brace
while (startIndex < json.Length && char.IsWhiteSpace(json[startIndex]))
{
startIndex++;
}

if (startIndex >= json.Length || json[startIndex] != '{')
{
return string.Empty;
}

// Find the matching closing brace
var braceCount = 0;
var endIndex = startIndex;
var inString = false;
var escapeNext = false;

for (int i = startIndex; i < json.Length; i++)
{
var ch = json[i];

if (escapeNext)
{
escapeNext = false;
continue;
}

if (ch == '\\')
{
escapeNext = true;
continue;
}

if (ch == '"')
{
inString = !inString;
continue;
}

if (!inString)
{
if (ch == '{')
{
braceCount++;
}
else if (ch == '}')
{
braceCount--;
if (braceCount == 0)
{
endIndex = i;
break;
}
}
}
}

if (braceCount != 0)
{
return string.Empty;
}

return json.Substring(startIndex, endIndex - startIndex + 1);
}

internal static Dictionary<string, string[]> ParseAliasesFromJson(string aliasesJson)
{
var aliases = new Dictionary<string, string[]>();
var inString = false;
var escapeNext = false;
var currentToken = new StringBuilder();
var currentKey = string.Empty;
var currentAliases = new List<string>();
var inArray = false;
var collectingKey = true;

// Skip opening and closing braces
for (int i = 1; i < aliasesJson.Length - 1; i++)
{
var ch = aliasesJson[i];

if (escapeNext)
{
if (inString)
{
currentToken.Append(ch);
}

escapeNext = false;
continue;
}

if (ch == '\\')
{
if (inString)
{
currentToken.Append(ch);
}

escapeNext = true;
continue;
}

if (ch == '"')
{
if (!inString)
{
// Start of string
inString = true;
currentToken.Clear();
}
else
{
// End of string
inString = false;
var tokenValue = currentToken.ToString();

if (collectingKey)
{
currentKey = tokenValue;
collectingKey = false;
}
else if (inArray)
{
currentAliases.Add(tokenValue);
}
}

continue;
}

if (inString)
{
currentToken.Append(ch);
continue;
}

// Handle structural characters outside of strings
switch (ch)
{
case '[':
inArray = true;
currentAliases.Clear();
break;

case ']':
inArray = false;
if (!string.IsNullOrEmpty(currentKey) && currentAliases.Count > 0)
{
aliases[currentKey] = currentAliases.ToArray();
}

break;

case ',':
if (!inArray)
{
// End of key-value pair, reset for next key
collectingKey = true;
currentKey = string.Empty;
currentAliases.Clear();
}

break;
}
}

return aliases;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,10 @@ internal class TrackingNames
public const string AssemblyCallTargetDefinitionSource = nameof(AssemblyCallTargetDefinitionSource);
public const string AdoNetCallTargetDefinitionSource = nameof(AdoNetCallTargetDefinitionSource);
public const string AdoNetSignatures = nameof(AdoNetSignatures);

// Configuration key matcher
public const string ConfigurationKeysParseConfiguration = nameof(ConfigurationKeysParseConfiguration);
public const string ConfigurationKeyMatcherDiagnostics = nameof(ConfigurationKeyMatcherDiagnostics);
public const string ConfigurationKeyMatcherValidData = nameof(ConfigurationKeyMatcherValidData);
public const string ConfigurationKeysAdditionalText = nameof(ConfigurationKeysAdditionalText);
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,10 @@ internal static class ProcessConfiguration

if (logDirectory == null)
{
#pragma warning disable 618 // ProfilerLogPath is deprecated but still supported
var nativeLogFile = config.WithKeys(ConfigurationKeys.ProfilerLogPath).AsString();
#pragma warning restore 618
// ProfilerLogPath is deprecated but still supported. For now, we bypass the WithKeys analyzer, but later we want to pull deprecations differently as part of centralized file
#pragma warning disable DD0008, 618
var nativeLogFile = config.WithKeys(DeprecationConstants.ProfilerLogPath).AsString();
#pragma warning restore DD0008, 618
if (!string.IsNullOrEmpty(nativeLogFile))
{
logDirectory = Path.GetDirectoryName(nativeLogFile);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
<Compile Include="..\Datadog.Trace\Agent\TracesTransportType.cs" Link="TracesTransportType.cs" />
<Compile Include="..\Datadog.Trace\Configuration\ConfigurationKeys.cs" Link="ConfigurationKeys.cs" />
<Compile Include="..\Datadog.Trace\Configuration\ConfigurationKeys.Exporter.cs" Link="ConfigurationKeys.Exporter.cs" />
<Compile Include="..\Datadog.Trace\Configuration\DeprecationMessages.cs" Link="DeprecationMessages.cs" />
<Compile Include="..\Datadog.Trace\Configuration\DeprecationConstants.cs" Link="DeprecationMessages.cs" />
<Compile Include="..\Datadog.Trace\Configuration\ExporterSettings.Shared.cs" Link="ExporterSettings.Shared.cs" />
</ItemGroup>

Expand Down
2 changes: 1 addition & 1 deletion tracer/src/Datadog.Trace/AppSec/SecuritySettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ public SecuritySettings(IConfigurationSource? source, IConfigurationTelemetry te
UserEventsAutoInstrumentationMode = UserTrackingIdentMode;
}

ApiSecurityEnabled = config.WithKeys(ConfigurationKeys.AppSec.ApiSecurityEnabled, "DD_EXPERIMENTAL_API_SECURITY_ENABLED")
ApiSecurityEnabled = config.WithKeys(ConfigurationKeys.AppSec.ApiSecurityEnabled)
.AsBool(true);

ApiSecuritySampleDelay = config.WithKeys(ConfigurationKeys.AppSec.ApiSecuritySampleDelay)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,9 @@ internal static partial class ConfigurationKeys
/// </summary>
public const string LogRateLimit = "DD_TRACE_LOGGING_RATE";

/// <summary>
/// Configuration key for setting the path to the .NET Tracer native log file.
/// This also determines the output folder of the .NET Tracer managed log files.
/// Overridden by <see cref="LogDirectory"/> if present.
/// </summary>
[Obsolete(DeprecationMessages.LogPath)]
public const string ProfilerLogPath = "DD_TRACE_LOG_PATH";

/// <summary>
/// Configuration key for setting the directory of the .NET Tracer logs.
/// Overrides the value in <see cref="ProfilerLogPath"/> if present.
/// Overrides the value in <see cref="DeprecationConstants.ProfilerLogPath"/> if present.
/// Default value is "%ProgramData%"\Datadog .NET Tracer\logs\" on Windows
/// or "/var/log/datadog/dotnet/" on Linux.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ internal static partial class ConfigurationKeys
/// Configuration key for enabling or disabling default Analytics.
/// </summary>
/// <seealso cref="TracerSettings.AnalyticsEnabled"/>
[Obsolete(DeprecationMessages.AppAnalytics)]
[Obsolete(DeprecationConstants.AppAnalytics)]
public const string GlobalAnalyticsEnabled = "DD_TRACE_ANALYTICS_ENABLED";

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ public void Add(IConfigurationSource source)
[PublicApi]
IEnumerator IEnumerable.GetEnumerator() => _sources.GetEnumerator();

public bool IsPresent(string key) => _sources.Any(source => source.IsPresent(key));

/// <inheritdoc />
public ConfigurationResult<string> GetString(string key, IConfigurationTelemetry telemetry, Func<string, bool>? validator, bool recordValue)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ public DictionaryConfigurationSource(IReadOnlyDictionary<string, string> diction

public override ConfigurationOrigins Origin => ConfigurationOrigins.Code;

public override bool IsPresent(string key) => _dictionary.ContainsKey(key);

protected override string? GetString(string key)
{
_dictionary.TryGetValue(key, out var value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public DictionaryObjectConfigurationSource(IReadOnlyDictionary<string, object?>

protected IReadOnlyDictionary<string, object?> Dictionary { get; }

public bool IsPresent(string key) => Dictionary.ContainsKey(key);

protected virtual bool TryGetValue(string key, out object? value)
=> Dictionary.TryGetValue(key, out value);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,7 @@ internal class EnvironmentConfigurationSource : StringConfigurationSource

return null;
}

public override bool IsPresent(string key) => GetString(key) is not null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ internal static bool TryLoadJsonConfigurationFile(IConfigurationSource configura

// if environment variable is not set, look for default file name in the current directory
var configurationFileName = new ConfigurationBuilder(configurationSource, telemetry)
.WithKeys(ConfigurationKeys.ConfigurationFileName, "DD_DOTNET_TRACER_CONFIG_FILE")
.WithKeys(ConfigurationKeys.ConfigurationFileName)
.AsString(
getDefaultValue: () => Path.Combine(baseDirectory ?? GetCurrentDirectory(), "datadog.json"),
validator: null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ internal sealed class HandsOffConfigurationSource(Dictionary<string, string> con
_configurations.TryGetValue(key, out var value);
return value;
}

public override bool IsPresent(string key) => _configurations.ContainsKey(key);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ public interface IConfigurationSource
/// </summary>
public ConfigurationOrigins Origin { get; }

/// <summary>
/// Gets a value indicating whether the key is present in the configuration source.
/// </summary>
bool IsPresent(string key);

/// <summary>
/// Gets the <see cref="string"/> value of
/// the setting with the specified key.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ private protected JsonConfigurationSource(string json, ConfigurationOrigins orig

internal bool TreatNullDictionaryAsEmpty { get; set; } = true;

public bool IsPresent(string key) => SelectToken(key) is not null;

/// <summary>
/// Creates a new <see cref="JsonConfigurationSource"/> instance
/// by loading the JSON string from the specified file.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,7 @@ internal NameValueConfigurationSource(NameValueCollection nameValueCollection, C
{
return _nameValueCollection[key];
}

public override bool IsPresent(string key) => !string.IsNullOrEmpty(_nameValueCollection[key]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,6 @@ public ConfigurationResult<IDictionary<string, string>> GetDictionary(string key

public ConfigurationResult<T> GetAs<T>(string key, IConfigurationTelemetry telemetry, Func<string, ParsingResult<T>> converter, Func<T, bool>? validator, bool recordValue)
=> ConfigurationResult<T>.NotFound();

public bool IsPresent(string key) => false;
}
Loading
Loading