diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md
index 1f9f22a70eb..66e89aa8292 100644
--- a/src/OpenTelemetry/CHANGELOG.md
+++ b/src/OpenTelemetry/CHANGELOG.md
@@ -2,6 +2,10 @@
## Unreleased
+* The default resource provided by `ResourceBuilder.CreateDefault()` now
+ adds the `telemetry.sdk.*` attributes defined in the
+ [specification](https://github.com/open-telemetry/opentelemetry-specification/tree/12fcec1ff255b1535db75708e52a3a21f86f0fae/specification/resource/semantic_conventions#semantic-attributes-with-sdk-provided-default-value).
+ ([#4369](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4369))
* Fixed an issue with `HashCode` computations throwing exceptions on .NET
Standard 2.1 targets.
([#4362](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4362))
diff --git a/src/OpenTelemetry/Resources/ResourceBuilder.cs b/src/OpenTelemetry/Resources/ResourceBuilder.cs
index c9de4fa77e7..9b70509190b 100644
--- a/src/OpenTelemetry/Resources/ResourceBuilder.cs
+++ b/src/OpenTelemetry/Resources/ResourceBuilder.cs
@@ -59,8 +59,8 @@ private ResourceBuilder()
internal IServiceProvider? ServiceProvider { get; set; }
///
- /// Creates a instance with Default
- /// service.name added. See instance with default attributes
+ /// added. See resource
/// semantic conventions for details.
/// Additionally it adds resource attributes parsed from OTEL_RESOURCE_ATTRIBUTES, OTEL_SERVICE_NAME environment variables
@@ -70,7 +70,10 @@ private ResourceBuilder()
///
/// Created .
public static ResourceBuilder CreateDefault()
- => new ResourceBuilder().AddResource(DefaultResource).AddEnvironmentVariableDetector();
+ => new ResourceBuilder()
+ .AddResource(DefaultResource)
+ .AddTelemetrySdk()
+ .AddEnvironmentVariableDetector();
///
/// Creates an empty instance.
diff --git a/test/OpenTelemetry.Tests/Resources/ResourceTest.cs b/test/OpenTelemetry.Tests/Resources/ResourceTest.cs
index c1ab60fe0c6..31d0fbdf4f3 100644
--- a/test/OpenTelemetry.Tests/Resources/ResourceTest.cs
+++ b/test/OpenTelemetry.Tests/Resources/ResourceTest.cs
@@ -395,6 +395,7 @@ public void GetResourceWithTelemetrySDKAttributes()
// Assert
var attributes = resource.Attributes;
Assert.Equal(4, attributes.Count());
+ ValidateDefaultAttributes(attributes);
ValidateTelemetrySdkAttributes(attributes);
}
@@ -406,8 +407,9 @@ public void GetResourceWithDefaultAttributes_EmptyResource()
// Assert
var attributes = resource.Attributes;
- Assert.Single(attributes);
+ Assert.Equal(4, attributes.Count());
ValidateDefaultAttributes(attributes);
+ ValidateTelemetrySdkAttributes(attributes);
}
[Fact]
@@ -418,9 +420,10 @@ public void GetResourceWithDefaultAttributes_ResourceWithAttrs()
// Assert
var attributes = resource.Attributes;
- Assert.Equal(3, attributes.Count());
+ Assert.Equal(6, attributes.Count());
ValidateAttributes(attributes, 0, 1);
ValidateDefaultAttributes(attributes);
+ ValidateTelemetrySdkAttributes(attributes);
}
[Fact]
@@ -432,11 +435,12 @@ public void GetResourceWithDefaultAttributes_WithResourceEnvVar()
// Assert
var attributes = resource.Attributes;
- Assert.Equal(5, attributes.Count());
+ Assert.Equal(8, attributes.Count());
ValidateAttributes(attributes, 0, 1);
ValidateDefaultAttributes(attributes);
Assert.Contains(new KeyValuePair("EVKey1", "EVVal1"), attributes);
Assert.Contains(new KeyValuePair("EVKey2", "EVVal2"), attributes);
+ ValidateTelemetrySdkAttributes(attributes);
}
[Fact]
@@ -448,9 +452,10 @@ public void EnvironmentVariableDetectors_DoNotDuplicateAttributes()
// Assert
var attributes = resource.Attributes;
- Assert.Equal(3, attributes.Count());
+ Assert.Equal(6, attributes.Count());
Assert.Contains(new KeyValuePair("EVKey1", "EVVal1"), attributes);
Assert.Contains(new KeyValuePair("EVKey2", "EVVal2"), attributes);
+ ValidateTelemetrySdkAttributes(attributes);
}
[Fact]
@@ -462,9 +467,10 @@ public void GetResource_WithServiceEnvVar()
// Assert
var attributes = resource.Attributes;
- Assert.Equal(3, attributes.Count());
+ Assert.Equal(6, attributes.Count());
ValidateAttributes(attributes, 0, 1);
Assert.Contains(new KeyValuePair("service.name", "some-service"), attributes);
+ ValidateTelemetrySdkAttributes(attributes);
}
[Fact]
@@ -477,9 +483,10 @@ public void GetResource_WithServiceNameSetWithTwoEnvVars()
// Assert
var attributes = resource.Attributes;
- Assert.Equal(3, attributes.Count());
+ Assert.Equal(6, attributes.Count());
ValidateAttributes(attributes, 0, 1);
Assert.Contains(new KeyValuePair("service.name", "from-service-name"), attributes);
+ ValidateTelemetrySdkAttributes(attributes);
}
[Fact]
@@ -492,9 +499,10 @@ public void GetResource_WithServiceNameSetWithTwoEnvVarsAndCode()
// Assert
var attributes = resource.Attributes;
- Assert.Equal(4, attributes.Count());
+ Assert.Equal(7, attributes.Count());
ValidateAttributes(attributes, 0, 1);
Assert.Contains(new KeyValuePair("service.name", "from-code"), attributes);
+ ValidateTelemetrySdkAttributes(attributes);
}
[Fact]
@@ -562,6 +570,21 @@ public void ResourceBuilder_AddDetectorInternal_Test()
Assert.True(validTestRun);
}
+ internal static void ValidateTelemetrySdkAttributes(IEnumerable> attributes)
+ {
+ Assert.Contains(new KeyValuePair("telemetry.sdk.name", "opentelemetry"), attributes);
+ Assert.Contains(new KeyValuePair("telemetry.sdk.language", "dotnet"), attributes);
+ var versionAttribute = attributes.Where(pair => pair.Key.Equals("telemetry.sdk.version"));
+ Assert.Single(versionAttribute);
+ }
+
+ internal static void ValidateDefaultAttributes(IEnumerable> attributes)
+ {
+ var serviceName = attributes.Where(pair => pair.Key.Equals("service.name"));
+ Assert.Single(serviceName);
+ Assert.Contains("unknown_service", serviceName.FirstOrDefault().Value as string);
+ }
+
private static void ClearEnvVars()
{
Environment.SetEnvironmentVariable(OtelEnvResourceDetector.EnvVarKey, null);
@@ -594,21 +617,6 @@ private static void ValidateResource(Resource resource, int attributeCount)
ValidateAttributes(resource.Attributes);
}
- private static void ValidateTelemetrySdkAttributes(IEnumerable> attributes)
- {
- Assert.Contains(new KeyValuePair("telemetry.sdk.name", "opentelemetry"), attributes);
- Assert.Contains(new KeyValuePair("telemetry.sdk.language", "dotnet"), attributes);
- var versionAttribute = attributes.Where(pair => pair.Key.Equals("telemetry.sdk.version"));
- Assert.Single(versionAttribute);
- }
-
- private static void ValidateDefaultAttributes(IEnumerable> attributes)
- {
- var serviceName = attributes.Where(pair => pair.Key.Equals("service.name"));
- Assert.Single(serviceName);
- Assert.Contains("unknown_service", serviceName.FirstOrDefault().Value as string);
- }
-
private static Dictionary CreateAttributes(int attributeCount, int startIndex = 0)
{
var attributes = new Dictionary();
diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs
index 878d951e70a..abdee03731f 100644
--- a/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs
+++ b/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs
@@ -17,6 +17,7 @@
using System.Diagnostics;
using OpenTelemetry.Instrumentation;
using OpenTelemetry.Resources;
+using OpenTelemetry.Resources.Tests;
using OpenTelemetry.Tests;
using Xunit;
@@ -1077,9 +1078,11 @@ public void TracerProviderSdkBuildsWithDefaultResource()
Assert.NotNull(resource);
Assert.NotEqual(Resource.Empty, resource);
- Assert.Single(resource.Attributes);
- Assert.Equal(ResourceSemanticConventions.AttributeServiceName, resource.Attributes.FirstOrDefault().Key);
- Assert.Contains("unknown_service", (string)resource.Attributes.FirstOrDefault().Value);
+
+ var attributes = resource.Attributes;
+ Assert.Equal(4, attributes.Count());
+ ResourceTest.ValidateDefaultAttributes(attributes);
+ ResourceTest.ValidateTelemetrySdkAttributes(attributes);
}
[Theory]