Skip to content

Commit

Permalink
[Tracing] sampling code cleanup (#5477)
Browse files Browse the repository at this point in the history
  • Loading branch information
lucaspimentel authored May 2, 2024
1 parent 1ddd576 commit f4ba821
Show file tree
Hide file tree
Showing 47 changed files with 349 additions and 284 deletions.
9 changes: 0 additions & 9 deletions tracer/missing-nullability-files.csv
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ src/Datadog.Trace/OSPlatformName.cs
src/Datadog.Trace/ProcessArchitecture.cs
src/Datadog.Trace/PropagationErrorTagValues.cs
src/Datadog.Trace/ReadOnlySpanContext.cs
src/Datadog.Trace/SamplingPriority.cs
src/Datadog.Trace/SamplingPriorityValues.cs
src/Datadog.Trace/Scope.cs
src/Datadog.Trace/Scope.IScope.cs
src/Datadog.Trace/Span.cs
Expand Down Expand Up @@ -85,7 +83,6 @@ src/Datadog.Trace/Ci/IEvent.cs
src/Datadog.Trace/ClrProfiler/AutomaticTracer.cs
src/Datadog.Trace/ClrProfiler/CallTargetKind.cs
src/Datadog.Trace/ClrProfiler/ClrNames.cs
src/Datadog.Trace/ClrProfiler/CommonTracer.cs
src/Datadog.Trace/ClrProfiler/DistributedTracer.cs
src/Datadog.Trace/ClrProfiler/IAutomaticTracer.cs
src/Datadog.Trace/ClrProfiler/ICommonTracer.cs
Expand Down Expand Up @@ -198,20 +195,14 @@ src/Datadog.Trace/RuntimeMetrics/PerformanceCounterWrapper.cs
src/Datadog.Trace/RuntimeMetrics/RuntimeEventListener.cs
src/Datadog.Trace/RuntimeMetrics/RuntimeMetricsWriter.cs
src/Datadog.Trace/RuntimeMetrics/Timing.cs
src/Datadog.Trace/Sampling/CustomSamplingRule.cs
src/Datadog.Trace/Sampling/DefaultSamplingRule.cs
src/Datadog.Trace/Sampling/GlobalSamplingRule.cs
src/Datadog.Trace/Sampling/IRateLimiter.cs
src/Datadog.Trace/Sampling/ISamplingRule.cs
src/Datadog.Trace/Sampling/ISpanSamplingRule.cs
src/Datadog.Trace/Sampling/ITraceSampler.cs
src/Datadog.Trace/Sampling/OverheadController.cs
src/Datadog.Trace/Sampling/RateLimiter.cs
src/Datadog.Trace/Sampling/SamplingMechanism.cs
src/Datadog.Trace/Sampling/SpanRateLimiter.cs
src/Datadog.Trace/Sampling/SpanSamplingRule.cs
src/Datadog.Trace/Sampling/TracerRateLimiter.cs
src/Datadog.Trace/Sampling/TraceSampler.cs
src/Datadog.Trace/ServiceFabric/ServiceRemotingConstants.cs
src/Datadog.Trace/Tagging/AerospikeTags.cs
src/Datadog.Trace/Tagging/AspNetCoreEndpointTags.cs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using Datadog.Trace.ExtensionMethods;
using Datadog.Trace.Processors;
Expand Down Expand Up @@ -228,19 +227,24 @@ private int Serialize(ref byte[] bytes, int offset, in SpanModel spanModel)
private int WriteSpanLink(ref byte[] bytes, int offset, in SpanModel spanModel)
{
int originalOffset = offset;

offset += MessagePackBinary.WriteStringBytes(ref bytes, offset, _spanLinkBytes);
offset += MessagePackBinary.WriteArrayHeader(ref bytes, offset, spanModel.Span.SpanLinks.Count);

foreach (var spanLink in spanModel.Span.SpanLinks)
{
var context = spanLink.Context;
var samplingPriority = context.TraceContext?.SamplingPriority ?? context.SamplingPriority;

var traceFlags = samplingPriority switch
{
null => 0u, // not set
> 0 => 1u + (1u << 31), // keep
<= 0 => 1u << 31, // drop
};

var len = 3;

// check to serialize tracestate
if (context.IsRemote)
{
Expand Down
37 changes: 18 additions & 19 deletions tracer/src/Datadog.Trace/Agent/MessagePack/TraceChunkModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
using System.Threading;
using Datadog.Trace.Configuration;
using Datadog.Trace.Tagging;
using Datadog.Trace.Util;

namespace Datadog.Trace.Agent.MessagePack;

Expand Down Expand Up @@ -62,7 +61,7 @@ internal readonly struct TraceChunkModel
/// <param name="spans">The spans that will be within this <see cref="TraceChunkModel"/>.</param>
/// <param name="samplingPriority">Optional sampling priority to override the <see cref="TraceContext"/> sampling priority.</param>
public TraceChunkModel(in ArraySegment<Span> spans, int? samplingPriority = null)
: this(spans, GetTraceContext(spans), samplingPriority)
: this(spans, TraceContext.GetTraceContext(spans), samplingPriority)
{
// since all we have is an array of spans, use the trace context from the first span
// to get the other values we need (sampling priority, origin, trace tags, etc) for now.
Expand All @@ -78,19 +77,29 @@ private TraceChunkModel(in ArraySegment<Span> spans, TraceContext? traceContext,

if (traceContext is not null)
{
DefaultServiceName = traceContext.Tracer?.DefaultServiceName;
SamplingPriority ??= traceContext.SamplingPriority;

Environment = traceContext.Environment;
ServiceVersion = traceContext.ServiceVersion;
Origin = traceContext.Origin;
Tags = traceContext.Tags;
IsRunningInAzureAppService = traceContext.Tracer?.Settings?.IsRunningInAzureAppService ?? false;
AzureAppServiceSettings = traceContext.Tracer?.Settings?.AzureAppServiceMetadata ?? null;
if (traceContext.Tracer?.GitMetadataTagsProvider?.TryExtractGitMetadata(out var gitMetadata) == true &&
gitMetadata != GitMetadata.Empty)

if (traceContext.Tracer is { } tracer)
{
GitRepositoryUrl = gitMetadata.RepositoryUrl;
GitCommitSha = gitMetadata.CommitSha;
DefaultServiceName = tracer.DefaultServiceName;

if (tracer.Settings is { } settings)
{
IsRunningInAzureAppService = settings.IsRunningInAzureAppService;
AzureAppServiceSettings = settings.AzureAppServiceMetadata ?? null;
}

if (tracer.GitMetadataTagsProvider?.TryExtractGitMetadata(out var gitMetadata) == true &&
gitMetadata != GitMetadata.Empty)
{
GitRepositoryUrl = gitMetadata.RepositoryUrl;
GitCommitSha = gitMetadata.CommitSha;
}
}
}
}
Expand Down Expand Up @@ -121,16 +130,6 @@ internal TraceChunkModel(in ArraySegment<Span> spans, Span? localRootSpan)
// used in tests
internal bool HashSetInitialized => _hashSet?.IsValueCreated == true && _hashSet.Value.Count > 0;

private static TraceContext? GetTraceContext(in ArraySegment<Span> spans)
{
if (spans.Count > 0)
{
return spans.Array![spans.Offset].Context.TraceContext;
}

return null;
}

public SpanModel GetSpanModel(int spanIndex)
{
if (spanIndex >= _spans.Count)
Expand Down
2 changes: 1 addition & 1 deletion tracer/src/Datadog.Trace/Ci/Test.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ internal Test(TestSuite suite, string name, DateTimeOffset? startDate, TraceId t

scope.Span.Type = SpanTypes.Test;
scope.Span.ResourceName = $"{suite.Name}.{name}";
scope.Span.Context.TraceContext.SetSamplingPriority((int)SamplingPriority.AutoKeep, SamplingMechanism.Manual);
scope.Span.Context.TraceContext.SetSamplingPriority(SamplingPriorityValues.AutoKeep, SamplingMechanism.Manual);
scope.Span.Context.TraceContext.Origin = TestTags.CIAppTestOriginName;
TelemetryFactory.Metrics.RecordCountSpanCreated(MetricTags.IntegrationName.CiAppManual);

Expand Down
2 changes: 1 addition & 1 deletion tracer/src/Datadog.Trace/Ci/TestModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ internal TestModule(string name, string? framework, string? frameworkVersion, Da

span.Type = SpanTypes.TestModule;
span.ResourceName = name;
span.Context.TraceContext.SetSamplingPriority((int)SamplingPriority.AutoKeep);
span.Context.TraceContext.SetSamplingPriority(SamplingPriorityValues.AutoKeep);
span.Context.TraceContext.Origin = TestTags.CIAppTestOriginName;

tags.ModuleId = span.SpanId;
Expand Down
2 changes: 1 addition & 1 deletion tracer/src/Datadog.Trace/Ci/TestSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ private TestSession(string? command, string? workingDirectory, string? framework

span.Type = SpanTypes.TestSession;
span.ResourceName = $"{span.OperationName}.{command}";
span.Context.TraceContext.SetSamplingPriority((int)SamplingPriority.AutoKeep);
span.Context.TraceContext.SetSamplingPriority(SamplingPriorityValues.AutoKeep);
span.Context.TraceContext.Origin = TestTags.CIAppTestOriginName;

tags.SessionId = span.SpanId;
Expand Down
2 changes: 1 addition & 1 deletion tracer/src/Datadog.Trace/Ci/TestSuite.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ internal TestSuite(TestModule module, string name, DateTimeOffset? startDate)

span.Type = SpanTypes.TestSuite;
span.ResourceName = name;
span.Context.TraceContext.SetSamplingPriority((int)SamplingPriority.AutoKeep);
span.Context.TraceContext.SetSamplingPriority(SamplingPriorityValues.AutoKeep);
span.Context.TraceContext.Origin = TestTags.CIAppTestOriginName;

tags.SuiteId = span.SpanId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,9 @@ internal static class GrpcLegacyClientCommon
span.SetHeaderTags(requestMetadataWrapper, tracer.Settings.GrpcTagsInternal, GrpcCommon.RequestMetadataTagPrefix);
scope = tracer.ActivateSpan(span);

if (setSamplingPriority && existingSpanContext?.SamplingPriority is not null)
if (setSamplingPriority && existingSpanContext?.SamplingPriority is { } samplingPriority)
{
span.Context.TraceContext?.SetSamplingPriority(existingSpanContext.SamplingPriority.Value);
span.Context.TraceContext?.SetSamplingPriority(samplingPriority);
}

GrpcCommon.RecordFinalStatus(span, receivedStatus.StatusCode, receivedStatus.Detail, receivedStatus.DebugException);
Expand Down Expand Up @@ -242,10 +242,10 @@ private static Span CreateInactiveSpan(Tracer tracer, string? methodFullName)
var operationName = tracer.CurrentTraceSettings.Schema.Client.GetOperationNameForProtocol("grpc");
var serviceName = tracer.CurrentTraceSettings.Schema.Client.GetServiceName(component: "grpc-client");
var tags = tracer.CurrentTraceSettings.Schema.Client.CreateGrpcClientTags();
var span = tracer.StartSpan(operationName, tags, serviceName: serviceName, addToTraceContext: false);
tags.SetAnalyticsSampleRate(IntegrationId.Grpc, tracer.Settings, enabledWithGlobalSetting: false);
tracer.CurrentTraceSettings.Schema.RemapPeerService(tags);

var span = tracer.StartSpan(operationName, tags, serviceName: serviceName, addToTraceContext: false);
span.Type = SpanTypes.Grpc;
span.ResourceName = methodFullName;

Expand Down
2 changes: 1 addition & 1 deletion tracer/src/Datadog.Trace/ClrProfiler/CommonTracer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc.
// </copyright>

using Datadog.Trace.Sampling;
#nullable enable

namespace Datadog.Trace.ClrProfiler
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ internal class AzureAppService
internal const string OperatingSystemKey = "WEBSITE_OS";

/// <summary>
/// Used to force the loader to start the tracer agent (in case automatic instrumentation is disabled)
/// Used to force the loader to start the trace agent (in case automatic instrumentation is disabled)
/// </summary>
public const string AasEnableCustomTracing = "DD_AAS_ENABLE_CUSTOM_TRACING";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ namespace Datadog.Trace.Configuration.ConfigurationSources
{
internal class DynamicConfigConfigurationSource : JsonConfigurationSource
{
private static readonly IReadOnlyDictionary<string, string> Mapping = new Dictionary<string, string>
private static readonly Dictionary<string, string> Mapping = new()
{
{ ConfigurationKeys.TraceEnabled, "tracing_enabled" },
// { ConfigurationKeys.DebugEnabled, "tracing_debug" },
Expand Down Expand Up @@ -48,17 +48,17 @@ internal DynamicConfigConfigurationSource(string json, ConfigurationOrigins orig
return jobject;
}

private static IDictionary<string, string> ReadHeaderTags(JToken token)
private static Dictionary<string, string> ReadHeaderTags(JToken token)
{
return ((JArray)token).ToDictionary(t => t["header"]!.Value<string>()!, t => t["tag_name"]!.Value<string>()!);
}

private static IDictionary<string, string> ReadServiceMapping(JToken token)
private static Dictionary<string, string> ReadServiceMapping(JToken token)
{
return ((JArray)token).ToDictionary(t => t["from_key"]!.Value<string>()!, t => t["to_name"]!.Value<string>()!);
}

private static IDictionary<string, string> ReadGlobalTags(JToken token)
private static Dictionary<string, string> ReadGlobalTags(JToken token)
{
var result = new Dictionary<string, string>();

Expand Down
11 changes: 0 additions & 11 deletions tracer/src/Datadog.Trace/Configuration/PerTraceSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,16 +52,5 @@ internal string GetServiceName(Tracer tracer, string serviceName)

return finalServiceName;
}

internal bool TryGetServiceName(string key, out string? serviceName)
{
if (ServiceNames.TryGetValue(key, out serviceName))
{
return true;
}

serviceName = null;
return false;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,11 @@ public bool TryExtract<TCarrier, TCarrierGetter>(TCarrier carrier, TCarrierGette

internal static void CreateHeaders(SpanContext context, out string traceId, out string spanId, out string sampled)
{
var samplingPriority = context.TraceContext?.SamplingPriority ?? context.SamplingPriority;
sampled = samplingPriority > 0 ? "1" : "0";
// BUG: we should fall back to SamplingPriorityValues.AutoKeep
var samplingPriority = context.TraceContext?.SamplingPriority ??
context.SamplingPriority; // should never happen in production, but some tests rely on this

sampled = SamplingPriorityValues.IsKeep(samplingPriority) ? "1" : "0";
traceId = context.RawTraceId;
spanId = context.RawSpanId;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,11 @@ public bool TryExtract<TCarrier, TCarrierGetter>(TCarrier carrier, TCarrierGette

internal static string CreateHeader(SpanContext context)
{
var samplingPriority = context.TraceContext?.SamplingPriority ?? context.SamplingPriority;
var sampled = samplingPriority > 0 ? "1" : "0";
// BUG: we should fall back to SamplingPriorityValues.AutoKeep
var samplingPriority = context.TraceContext?.SamplingPriority ??
context.SamplingPriority; // should never happen in production, but some tests rely on this

var sampled = SamplingPriorityValues.IsKeep(samplingPriority) ? "1" : "0";

#if NET6_0_OR_GREATER
return string.Create(null, stackalloc char[128], $"{context.RawTraceId}-{context.RawSpanId}-{sampled}");
Expand Down
13 changes: 3 additions & 10 deletions tracer/src/Datadog.Trace/Propagators/DatadogContextPropagator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,12 @@ public void Inject<TCarrier, TCarrierSetter>(SpanContext context, TCarrier carri
carrierSetter.Set(carrier, HttpHeaderNames.Origin, context.Origin);
}

var samplingPriority = context.TraceContext?.SamplingPriority ?? context.SamplingPriority;
var samplingPriority = context.TraceContext?.SamplingPriority ??
context.SamplingPriority; // should never happen in production, but some tests rely on this

if (samplingPriority != null)
{
var samplingPriorityString = samplingPriority.Value switch
{
-1 => "-1",
0 => "0",
1 => "1",
2 => "2",
_ => samplingPriority.Value.ToString(invariantCulture)
};

var samplingPriorityString = SamplingPriorityValues.ToString(samplingPriority);
carrierSetter.Set(carrier, HttpHeaderNames.SamplingPriority, samplingPriorityString);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
using System.Linq;
using Datadog.Trace.ExtensionMethods;
using Datadog.Trace.Headers;
using Datadog.Trace.Util;

namespace Datadog.Trace.Propagators
{
Expand Down
30 changes: 9 additions & 21 deletions tracer/src/Datadog.Trace/Propagators/W3CTraceContextPropagator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Text;
using Datadog.Trace.SourceGenerators;
Expand Down Expand Up @@ -119,6 +118,7 @@ public void Inject<TCarrier, TCarrierSetter>(SpanContext context, TCarrier carri
where TCarrierSetter : struct, ICarrierSetter<TCarrier>
{
TelemetryFactory.Metrics.RecordCountContextHeaderStyleInjected(MetricTags.ContextHeaderStyle.TraceContext);

var traceparent = CreateTraceParentHeader(context);
carrierSetter.Set(carrier, TraceParentHeaderName, traceparent);

Expand All @@ -132,8 +132,12 @@ public void Inject<TCarrier, TCarrierSetter>(SpanContext context, TCarrier carri

internal static string CreateTraceParentHeader(SpanContext context)
{
var samplingPriority = context.TraceContext?.SamplingPriority ?? context.SamplingPriority ?? SamplingPriorityValues.AutoKeep;
var sampled = samplingPriority > 0 ? "01" : "00";
var samplingPriority = context.TraceContext?.SamplingPriority ??
context.SamplingPriority ?? // should never happen in production, but some tests rely on this
SamplingPriorityValues.AutoKeep; // fallback

var sampled = SamplingPriorityValues.IsKeep(samplingPriority) ? "01" : "00";

#if NET6_0_OR_GREATER
return string.Create(null, stackalloc char[128], $"00-{context.RawTraceId}-{context.RawSpanId}-{sampled}");
#else
Expand All @@ -150,11 +154,9 @@ internal static string CreateTraceStateHeader(SpanContext context)
sb.Append("dd=");

// sampling priority ("s:<value>")
var samplingPriority = SamplingPriorityToString(context.TraceContext?.SamplingPriority);

if (samplingPriority != null)
if (context.TraceContext?.SamplingPriority is { } samplingPriority)
{
sb.Append("s:").Append(samplingPriority).Append(TraceStateDatadogPairsSeparator);
sb.Append("s:").Append(SamplingPriorityValues.ToString(samplingPriority)).Append(TraceStateDatadogPairsSeparator);
}

// origin ("o:<value>")
Expand Down Expand Up @@ -563,20 +565,6 @@ internal static void SplitTraceStateValues(string header, out string? ddValues,
}
}

[return: NotNullIfNotNull("samplingPriority")]
private static string? SamplingPriorityToString(int? samplingPriority)
{
return samplingPriority switch
{
2 => "2",
1 => "1",
0 => "0",
-1 => "-1",
null => null,
not null => samplingPriority.Value.ToString(CultureInfo.InvariantCulture)
};
}

#if NETCOREAPP
private static int? SamplingPriorityToInt32(ReadOnlySpan<char> samplingPriority)
{
Expand Down
Loading

0 comments on commit f4ba821

Please sign in to comment.