diff --git a/src/OpenTelemetry.Resources.Host/.publicApi/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Resources.Host/.publicApi/PublicAPI.Unshipped.txt index e408682d12..69c367d089 100644 --- a/src/OpenTelemetry.Resources.Host/.publicApi/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Resources.Host/.publicApi/PublicAPI.Unshipped.txt @@ -1,2 +1,3 @@ OpenTelemetry.Resources.HostResourceBuilderExtensions static OpenTelemetry.Resources.HostResourceBuilderExtensions.AddHostDetector(this OpenTelemetry.Resources.ResourceBuilder! builder) -> OpenTelemetry.Resources.ResourceBuilder! +static OpenTelemetry.Resources.HostResourceBuilderExtensions.AddHostDetector(this OpenTelemetry.Resources.ResourceBuilder! builder, bool includeHostName) -> OpenTelemetry.Resources.ResourceBuilder! diff --git a/src/OpenTelemetry.Resources.Host/CHANGELOG.md b/src/OpenTelemetry.Resources.Host/CHANGELOG.md index a497691784..e277c39106 100644 --- a/src/OpenTelemetry.Resources.Host/CHANGELOG.md +++ b/src/OpenTelemetry.Resources.Host/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +* Making the inclusion of `host.name` to the `Resource` configurable. + Use the `AddHostDetector(bool includeHostName)` overload to control this behavior. + ([#2084](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/2084)) + ## 0.1.0-beta.3 Released 2024-Aug-30 diff --git a/src/OpenTelemetry.Resources.Host/HostDetector.cs b/src/OpenTelemetry.Resources.Host/HostDetector.cs index 83ff701f53..4e9bf6472d 100644 --- a/src/OpenTelemetry.Resources.Host/HostDetector.cs +++ b/src/OpenTelemetry.Resources.Host/HostDetector.cs @@ -24,18 +24,21 @@ internal sealed class HostDetector : IResourceDetector private readonly Func> getFilePaths; private readonly Func getMacOsMachineId; private readonly Func getWindowsMachineId; + private readonly bool includeHostName; /// /// Initializes a new instance of the class. /// - public HostDetector() + /// Determines whether to include host name in the resource attributes. + public HostDetector(bool includeHostName = true) : this( #if NET RuntimeInformation.IsOSPlatform, #endif GetFilePaths, GetMachineIdMacOs, - GetMachineIdWindows) + GetMachineIdWindows, + includeHostName) { } @@ -43,12 +46,14 @@ public HostDetector() public HostDetector( Func> getFilePaths, Func getMacOsMachineId, - Func getWindowsMachineId) + Func getWindowsMachineId, + bool includeHostName = true) : this( RuntimeInformation.IsOSPlatform, getFilePaths, getMacOsMachineId, - getWindowsMachineId) + getWindowsMachineId, + includeHostName) { } #endif @@ -59,7 +64,8 @@ internal HostDetector( #endif Func> getFilePaths, Func getMacOsMachineId, - Func getWindowsMachineId) + Func getWindowsMachineId, + bool includeHostName = true) { #if NET Guard.ThrowIfNull(isOsPlatform); @@ -74,6 +80,7 @@ internal HostDetector( this.getFilePaths = getFilePaths; this.getMacOsMachineId = getMacOsMachineId; this.getWindowsMachineId = getWindowsMachineId; + this.includeHostName = includeHostName; } /// @@ -84,10 +91,13 @@ public Resource Detect() { try { - var attributes = new List>(2) + var attributes = new List>(2); + + if (this.includeHostName) { - new(HostSemanticConventions.AttributeHostName, Environment.MachineName), - }; + attributes.Add(new(HostSemanticConventions.AttributeHostName, Environment.MachineName)); + } + var machineId = this.GetMachineId(); if (machineId != null && !string.IsNullOrEmpty(machineId)) diff --git a/src/OpenTelemetry.Resources.Host/HostResourceBuilderExtensions.cs b/src/OpenTelemetry.Resources.Host/HostResourceBuilderExtensions.cs index f2085e0c33..8e7ca1c475 100644 --- a/src/OpenTelemetry.Resources.Host/HostResourceBuilderExtensions.cs +++ b/src/OpenTelemetry.Resources.Host/HostResourceBuilderExtensions.cs @@ -17,8 +17,19 @@ public static class HostResourceBuilderExtensions /// The being configured. /// The instance of being configured. public static ResourceBuilder AddHostDetector(this ResourceBuilder builder) + { + return AddHostDetector(builder, includeHostName: true); + } + + /// + /// Enables host resource detector. + /// + /// The being configured. + /// Determines whether to include host name in the resource attributes. + /// The instance of being configured. + public static ResourceBuilder AddHostDetector(this ResourceBuilder builder, bool includeHostName) { Guard.ThrowIfNull(builder); - return builder.AddDetector(new HostDetector()); + return builder.AddDetector(new HostDetector(includeHostName)); } } diff --git a/src/OpenTelemetry.Resources.Process/.publicApi/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Resources.Process/.publicApi/PublicAPI.Unshipped.txt index 4621d779b2..c72cf4a970 100644 --- a/src/OpenTelemetry.Resources.Process/.publicApi/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Resources.Process/.publicApi/PublicAPI.Unshipped.txt @@ -1,2 +1,3 @@ OpenTelemetry.Resources.ProcessResourceBuilderExtensions static OpenTelemetry.Resources.ProcessResourceBuilderExtensions.AddProcessDetector(this OpenTelemetry.Resources.ResourceBuilder! builder) -> OpenTelemetry.Resources.ResourceBuilder! +static OpenTelemetry.Resources.ProcessResourceBuilderExtensions.AddProcessDetector(this OpenTelemetry.Resources.ResourceBuilder! builder, bool includeProcessOwner) -> OpenTelemetry.Resources.ResourceBuilder! diff --git a/src/OpenTelemetry.Resources.Process/CHANGELOG.md b/src/OpenTelemetry.Resources.Process/CHANGELOG.md index bb23a9cd56..b167b01b69 100644 --- a/src/OpenTelemetry.Resources.Process/CHANGELOG.md +++ b/src/OpenTelemetry.Resources.Process/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +* Making the inclusion of `process.owner` to the `Resource` configurable. + Use the `AddProcessDetector(bool includeProcessOwner)` overload to control + this behavior. + ([#2084](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/2084)) + ## 0.1.0-beta.2 Released 2024-Jun-18 diff --git a/src/OpenTelemetry.Resources.Process/ProcessDetector.cs b/src/OpenTelemetry.Resources.Process/ProcessDetector.cs index 57dffe6425..627ae9cd58 100644 --- a/src/OpenTelemetry.Resources.Process/ProcessDetector.cs +++ b/src/OpenTelemetry.Resources.Process/ProcessDetector.cs @@ -8,20 +8,36 @@ namespace OpenTelemetry.Resources.Process; /// internal sealed class ProcessDetector : IResourceDetector { + private readonly bool includeProcessOwner; + + /// + /// Initializes a new instance of the class. + /// + /// Determines whether to include process owner in the resource attributes. + public ProcessDetector(bool includeProcessOwner = true) + { + this.includeProcessOwner = includeProcessOwner; + } + /// /// Detects the resource attributes for process. /// /// Resource with key-value pairs of resource attributes. public Resource Detect() { - return new Resource(new List>(2) + var attributes = new List>(2); + + if (this.includeProcessOwner) { - new(ProcessSemanticConventions.AttributeProcessOwner, Environment.UserName), + attributes.Add(new(ProcessSemanticConventions.AttributeProcessOwner, Environment.UserName)); + } + #if NET - new(ProcessSemanticConventions.AttributeProcessPid, Environment.ProcessId), + attributes.Add(new(ProcessSemanticConventions.AttributeProcessPid, Environment.ProcessId)); #else - new(ProcessSemanticConventions.AttributeProcessPid, System.Diagnostics.Process.GetCurrentProcess().Id), + attributes.Add(new(ProcessSemanticConventions.AttributeProcessPid, System.Diagnostics.Process.GetCurrentProcess().Id)); #endif - }); + + return new Resource(attributes); } } diff --git a/src/OpenTelemetry.Resources.Process/ProcessResourceBuilderExtensions.cs b/src/OpenTelemetry.Resources.Process/ProcessResourceBuilderExtensions.cs index 14831dedc9..f912b3ddaa 100644 --- a/src/OpenTelemetry.Resources.Process/ProcessResourceBuilderExtensions.cs +++ b/src/OpenTelemetry.Resources.Process/ProcessResourceBuilderExtensions.cs @@ -17,8 +17,19 @@ public static class ProcessResourceBuilderExtensions /// The being configured. /// The instance of being configured. public static ResourceBuilder AddProcessDetector(this ResourceBuilder builder) + { + return AddProcessDetector(builder, includeProcessOwner: true); + } + + /// + /// Enables process resource detector. + /// + /// The being configured. + /// A flag indicating whether or not to include the process owner in the resource. + /// The instance of being configured. + public static ResourceBuilder AddProcessDetector(this ResourceBuilder builder, bool includeProcessOwner) { Guard.ThrowIfNull(builder); - return builder.AddDetector(new ProcessDetector()); + return builder.AddDetector(new ProcessDetector(includeProcessOwner)); } } diff --git a/test/OpenTelemetry.Resources.Host.Tests/HostDetectorTests.cs b/test/OpenTelemetry.Resources.Host.Tests/HostDetectorTests.cs index baf15769ff..a5f1baebf3 100644 --- a/test/OpenTelemetry.Resources.Host.Tests/HostDetectorTests.cs +++ b/test/OpenTelemetry.Resources.Host.Tests/HostDetectorTests.cs @@ -57,6 +57,18 @@ public void TestHostAttributes() Assert.NotEmpty(resourceAttributes[HostSemanticConventions.AttributeHostId]); } + [Fact] + public void TestHostAttributesWithoutHostName() + { + var resource = ResourceBuilder.CreateEmpty().AddHostDetector(includeHostName: false).Build(); + + var resourceAttributes = resource.Attributes.ToDictionary(x => x.Key, x => (string)x.Value); + + Assert.Single(resourceAttributes); + + Assert.NotEmpty(resourceAttributes[HostSemanticConventions.AttributeHostId]); + } + #if NET [Fact] public void TestHostMachineIdLinux() diff --git a/test/OpenTelemetry.Resources.Process.Tests/ProcessDetectorTests.cs b/test/OpenTelemetry.Resources.Process.Tests/ProcessDetectorTests.cs index 1bc4342125..3d9adfb3a4 100644 --- a/test/OpenTelemetry.Resources.Process.Tests/ProcessDetectorTests.cs +++ b/test/OpenTelemetry.Resources.Process.Tests/ProcessDetectorTests.cs @@ -19,4 +19,17 @@ public void TestProcessAttributes() Assert.IsType(resourceAttributes[ProcessSemanticConventions.AttributeProcessOwner]); Assert.IsType(resourceAttributes[ProcessSemanticConventions.AttributeProcessPid]); } + + [Fact] + public void TestProcessAttributes_ExcludeProcessOwner() + { + var resource = ResourceBuilder.CreateEmpty().AddProcessDetector(includeProcessOwner: false).Build(); + + var resourceAttributes = resource.Attributes.ToDictionary(x => x.Key, x => x.Value); + + Assert.Single(resourceAttributes); + + Assert.False(resourceAttributes.ContainsKey(ProcessSemanticConventions.AttributeProcessOwner)); + Assert.IsType(resourceAttributes[ProcessSemanticConventions.AttributeProcessPid]); + } }