diff --git a/tracer/src/Datadog.Trace/Activity/OtlpHelpers.cs b/tracer/src/Datadog.Trace/Activity/OtlpHelpers.cs index 490a1f426e03..9a3a06187446 100644 --- a/tracer/src/Datadog.Trace/Activity/OtlpHelpers.cs +++ b/tracer/src/Datadog.Trace/Activity/OtlpHelpers.cs @@ -127,7 +127,7 @@ private static void AgentConvertSpan(TInner activity, Span span, bool op // Fixup "env" tag if (traceContext is not null && traceContext.Environment is null - && span.GetTag("deployment.environment") is { Length: > 0 } otelServiceEnv) + && (span.GetTag("deployment.environment.name") ?? span.GetTag("deployment.environment")) is { Length: > 0 } otelServiceEnv) { traceContext.Environment = otelServiceEnv; } diff --git a/tracer/src/Datadog.Trace/Configuration/MutableSettings.cs b/tracer/src/Datadog.Trace/Configuration/MutableSettings.cs index caf31e49e2d5..171dd9d40f75 100644 --- a/tracer/src/Datadog.Trace/Configuration/MutableSettings.cs +++ b/tracer/src/Datadog.Trace/Configuration/MutableSettings.cs @@ -1107,8 +1107,11 @@ private static ConfigurationBuilder.ClassConfigurationResultWithKey(); + activityMock.Setup(x => x.Kind).Returns(ActivityKind.Producer); + + var tagObjects = new Dictionary { { tagKey, tagValue } }; + activityMock.Setup(x => x.TagObjects).Returns(tagObjects); + + // UpdateSpanFromActivity implicitly accesses Tracer.Instance if there's no associated Tracer in the span + await using var tracer = TracerHelper.CreateWithFakeAgent(); + using var span = tracer.StartSpan("operation", new OpenTelemetryTags()); + + OtlpHelpers.UpdateSpanFromActivity(activityMock.Object, span); + + span.Context.TraceContext!.Environment.Should().Be(tagValue); + } + + [Fact] + public async Task Environment_StableTagName_ShouldTakePrecedenceOverLegacyTagName() + { + var activityMock = new Mock(); + activityMock.Setup(x => x.Kind).Returns(ActivityKind.Producer); + + var tagObjects = new Dictionary + { + { "deployment.environment", "legacy_env" }, + { "deployment.environment.name", "stable_env" } + }; + activityMock.Setup(x => x.TagObjects).Returns(tagObjects); + + // UpdateSpanFromActivity implicitly accesses Tracer.Instance if there's no associated Tracer in the span + await using var tracer = TracerHelper.CreateWithFakeAgent(); + using var span = tracer.StartSpan("operation", new OpenTelemetryTags()); + + OtlpHelpers.UpdateSpanFromActivity(activityMock.Object, span); + + span.Context.TraceContext!.Environment.Should().Be("stable_env"); + } }