From 648d5e76d5bfc30cd08563933f39b48f0c0a41f5 Mon Sep 17 00:00:00 2001 From: Flavio da Costa Date: Thu, 19 Sep 2024 14:40:04 -0500 Subject: [PATCH 1/4] Adding a way to control whether hostname and proc owner are included as part of the resource --- .../.publicApi/PublicAPI.Unshipped.txt | 1 + .../HostDetector.cs | 26 +++++++++++++------ .../HostResourceBuilderExtensions.cs | 13 +++++++++- .../.publicApi/PublicAPI.Unshipped.txt | 1 + .../ProcessDetector.cs | 26 +++++++++++++++---- .../ProcessResourceBuilderExtensions.cs | 13 +++++++++- .../HostDetectorTests.cs | 12 +++++++++ .../ProcessDetectorTests.cs | 13 ++++++++++ 8 files changed, 90 insertions(+), 15 deletions(-) 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/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..50b74c4d35 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, 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/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..05b5ac3ab5 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, 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]); + } } From f8dfd38289e1c473028673611851d8a09f0328bb Mon Sep 17 00:00:00 2001 From: Flavio da Costa Date: Thu, 19 Sep 2024 15:00:51 -0500 Subject: [PATCH 2/4] Adding to CHANGELOG --- src/OpenTelemetry.Resources.Host/CHANGELOG.md | 4 ++++ src/OpenTelemetry.Resources.Process/CHANGELOG.md | 4 ++++ 2 files changed, 8 insertions(+) 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.Process/CHANGELOG.md b/src/OpenTelemetry.Resources.Process/CHANGELOG.md index bb23a9cd56..4417a4ad5b 100644 --- a/src/OpenTelemetry.Resources.Process/CHANGELOG.md +++ b/src/OpenTelemetry.Resources.Process/CHANGELOG.md @@ -2,6 +2,10 @@ ## 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 From b36edb904b472238c44683face15c60cb3248813 Mon Sep 17 00:00:00 2001 From: Flavio da Costa Date: Thu, 19 Sep 2024 15:14:11 -0500 Subject: [PATCH 3/4] Addressing comments --- .../HostResourceBuilderExtensions.cs | 2 +- .../ProcessResourceBuilderExtensions.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenTelemetry.Resources.Host/HostResourceBuilderExtensions.cs b/src/OpenTelemetry.Resources.Host/HostResourceBuilderExtensions.cs index 50b74c4d35..8e7ca1c475 100644 --- a/src/OpenTelemetry.Resources.Host/HostResourceBuilderExtensions.cs +++ b/src/OpenTelemetry.Resources.Host/HostResourceBuilderExtensions.cs @@ -18,7 +18,7 @@ public static class HostResourceBuilderExtensions /// The instance of being configured. public static ResourceBuilder AddHostDetector(this ResourceBuilder builder) { - return AddHostDetector(builder, true); + return AddHostDetector(builder, includeHostName: true); } /// diff --git a/src/OpenTelemetry.Resources.Process/ProcessResourceBuilderExtensions.cs b/src/OpenTelemetry.Resources.Process/ProcessResourceBuilderExtensions.cs index 05b5ac3ab5..f912b3ddaa 100644 --- a/src/OpenTelemetry.Resources.Process/ProcessResourceBuilderExtensions.cs +++ b/src/OpenTelemetry.Resources.Process/ProcessResourceBuilderExtensions.cs @@ -18,7 +18,7 @@ public static class ProcessResourceBuilderExtensions /// The instance of being configured. public static ResourceBuilder AddProcessDetector(this ResourceBuilder builder) { - return AddProcessDetector(builder, true); + return AddProcessDetector(builder, includeProcessOwner: true); } /// From 99cbf77332654b58e7757a408e80c27dacc76019 Mon Sep 17 00:00:00 2001 From: Flavio da Costa Date: Thu, 19 Sep 2024 18:53:21 -0500 Subject: [PATCH 4/4] Fixing CHANELOG.md --- src/OpenTelemetry.Resources.Process/CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenTelemetry.Resources.Process/CHANGELOG.md b/src/OpenTelemetry.Resources.Process/CHANGELOG.md index 4417a4ad5b..b167b01b69 100644 --- a/src/OpenTelemetry.Resources.Process/CHANGELOG.md +++ b/src/OpenTelemetry.Resources.Process/CHANGELOG.md @@ -3,7 +3,8 @@ ## Unreleased * Making the inclusion of `process.owner` to the `Resource` configurable. - Use the `AddProcessDetector(bool includeProcessOwner)` overload to control this behavior. + 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