diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/DetectionDevelopment.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/DetectionDevelopment.cs new file mode 100644 index 0000000000..0db7b77b1e --- /dev/null +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/DetectionDevelopment.cs @@ -0,0 +1,16 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using Vendors.YamlDotNet.Serialization; + +namespace OpenTelemetry.AutoInstrumentation.Configurations.FileBasedConfiguration; + +internal class DetectionDevelopment +{ + /// + /// Gets or sets the configuration for resource detectors. + /// If omitted or null, no resource detectors are enabled. + /// + [YamlMember(Alias = "detectors")] + public DotNetDetectors? Detectors { get; set; } +} diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/DotNetDetectors.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/DotNetDetectors.cs new file mode 100644 index 0000000000..4142eedb04 --- /dev/null +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/DotNetDetectors.cs @@ -0,0 +1,71 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using System.Reflection; +using Vendors.YamlDotNet.Serialization; + +namespace OpenTelemetry.AutoInstrumentation.Configurations.FileBasedConfiguration; + +internal class DotNetDetectors +{ + /// + /// Gets or sets the Azure App Service detector configuration. + /// + [YamlMember(Alias = "azureappservice")] + public object? AzureAppService { get; set; } + +#if NET + /// + /// Gets or sets the container detector configuration. + /// + [YamlMember(Alias = "container")] + public object? Container { get; set; } +#endif + + /// + /// Gets or sets the host detector configuration. + /// + [YamlMember(Alias = "host")] + public object? Host { get; set; } + + /// + /// Gets or sets the operating system detector configuration. + /// + [YamlMember(Alias = "operatingsystem")] + public object? OperatingSystem { get; set; } + + /// + /// Gets or sets the process detector configuration. + /// + [YamlMember(Alias = "process")] + public object? Process { get; set; } + + /// + /// Gets or sets the process runtime detector configuration. + /// + [YamlMember(Alias = "processruntime")] + public object? ProcessRuntime { get; set; } + + /// + /// Returns the list of enabled resource detectors. + /// + public IReadOnlyList GetEnabledResourceDetectors() + { + var enabled = new List(); + var properties = typeof(DotNetDetectors).GetProperties(BindingFlags.Instance | BindingFlags.Public); + + foreach (var prop in properties) + { + var value = prop.GetValue(this); + if (value != null) + { + if (Enum.TryParse(prop.Name, out var resourceDetector)) + { + enabled.Add(resourceDetector); + } + } + } + + return enabled; + } +} diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/ResourceConfiguration.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/ResourceConfiguration.cs index 886c906ced..4f5b57af68 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/ResourceConfiguration.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/ResourceConfiguration.cs @@ -19,6 +19,12 @@ internal class ResourceConfiguration [YamlMember(Alias = "attributes_list")] public string? AttributesList { get; set; } + /// + /// Gets or sets the detection development configuration. + /// + [YamlMember(Alias = "detection/development")] + public DetectionDevelopment? DetectionDevelopment { get; set; } + public List> ParseAttributes() { var resourceAttributesWithPriority = new Dictionary(); diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/ResourceSettings.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/ResourceSettings.cs index 1554a16757..49fc39f207 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/ResourceSettings.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/ResourceSettings.cs @@ -37,6 +37,6 @@ protected override void OnLoadFile(YamlConfiguration configuration) Resources = configuration.Resource?.ParseAttributes() ?? []; - // TODO initialize EnabledDetectors from file configuration + EnabledDetectors = configuration.Resource?.DetectionDevelopment?.Detectors?.GetEnabledResourceDetectors() ?? []; } } diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/FileBasedTestHelper.cs b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/FileBasedTestHelper.cs new file mode 100644 index 0000000000..793c7d6b29 --- /dev/null +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/FileBasedTestHelper.cs @@ -0,0 +1,32 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using System.Reflection; +using Vendors.YamlDotNet.Core; +using Vendors.YamlDotNet.Serialization; +using Xunit; + +namespace OpenTelemetry.AutoInstrumentation.Tests.Configurations.FileBased; + +internal static class FileBasedTestHelper +{ + public static void MoveParserToScalar(IParser parser) + { + parser.MoveNext(); // StreamStart + parser.MoveNext(); // DocumentStart + parser.MoveNext(); // Scalar + } + + public static void AssertAliasPropertyExists(T obj, string alias) + { + Assert.NotNull(obj); + + var prop = typeof(T).GetProperties() + .FirstOrDefault(p => p.GetCustomAttribute()?.Alias == alias); + + Assert.NotNull(prop); + + var value = prop.GetValue(obj); + Assert.NotNull(value); + } +} diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/FilebasedGeneralSettingsTests.cs b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/FilebasedResourceSettingsTests.cs similarity index 75% rename from test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/FilebasedGeneralSettingsTests.cs rename to test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/FilebasedResourceSettingsTests.cs index 52ab2d51be..2e8fcdafa8 100644 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/FilebasedGeneralSettingsTests.cs +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/FilebasedResourceSettingsTests.cs @@ -7,7 +7,7 @@ namespace OpenTelemetry.AutoInstrumentation.Tests.Configurations.FileBased; -public class FilebasedGeneralSettingsTests +public class FilebasedResourceSettingsTests { [Fact] public void LoadFile_MergesBaseAndCustomResourceAttributes() @@ -97,4 +97,40 @@ public void LoadFile_AttributesListOverwrittenByAttributes() Assert.Equal("fromAttributes", result["key1"]); } + + [Fact] + public void GetEnabledResourceDetector_ReturnsCorrectEnabledDetectors() + { + var detectors = new DotNetDetectors + { + AzureAppService = new object(), + Host = new object(), + OperatingSystem = null, + Process = new object(), + ProcessRuntime = null + }; + +#if NET + detectors.Container = new object(); +#endif + + var result = detectors.GetEnabledResourceDetectors(); + + var expected = new List + { + ResourceDetector.AzureAppService, + ResourceDetector.Host, + ResourceDetector.Process + }; + +#if NET + expected.Add(ResourceDetector.Container); +#endif + + Assert.Equal(expected.Count, result.Count); + foreach (var detector in expected) + { + Assert.Contains(detector, result); + } + } } diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestFile.yaml b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestFile.yaml deleted file mode 100644 index a6722a1859..0000000000 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestFile.yaml +++ /dev/null @@ -1,7 +0,0 @@ -file_format: "1.0-rc.1" - -resource: - attributes: - - name: service.name - value: unknown_service - attributes_list: diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestResourceFile.yaml b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestResourceFile.yaml new file mode 100644 index 0000000000..4a6a91c840 --- /dev/null +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestResourceFile.yaml @@ -0,0 +1,16 @@ +file_format: "1.0-rc.1" + +resource: + attributes: + - name: service.name + value: unknown_service + attributes_list: + detection/development: + detectors: + azureappservice: + container: + host: + operatingsystem: + process: + processruntime: + diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestFileEnvVars.yaml b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestResourceFileEnvVars.yaml similarity index 100% rename from test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestFileEnvVars.yaml rename to test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestResourceFileEnvVars.yaml diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBasedConfiguration/Parser/ConditionalDeserializerTests.cs b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/ConditionalDeserializerTests.cs similarity index 97% rename from test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBasedConfiguration/Parser/ConditionalDeserializerTests.cs rename to test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/ConditionalDeserializerTests.cs index 18feab0c9d..0a4ee5fa4e 100644 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBasedConfiguration/Parser/ConditionalDeserializerTests.cs +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/ConditionalDeserializerTests.cs @@ -2,12 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 using OpenTelemetry.AutoInstrumentation.Configurations.FileBasedConfiguration.Parser; +using OpenTelemetry.AutoInstrumentation.Tests.Configurations.FileBased; using Vendors.YamlDotNet.Core; using Vendors.YamlDotNet.Serialization; using Xunit; using YamlParser = Vendors.YamlDotNet.Core.Parser; -namespace OpenTelemetry.AutoInstrumentation.Tests.Configurations.FileBasedConfiguration.Parser; +namespace OpenTelemetry.AutoInstrumentation.Tests.Configurations.FileBased.Parser; public class ConditionalDeserializerTests { diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBasedConfiguration/Parser/EnvVarTypeConverterTests.cs b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/EnvVarTypeConverterTests.cs similarity index 99% rename from test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBasedConfiguration/Parser/EnvVarTypeConverterTests.cs rename to test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/EnvVarTypeConverterTests.cs index 56bfc5b38f..9fc348687f 100644 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBasedConfiguration/Parser/EnvVarTypeConverterTests.cs +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/EnvVarTypeConverterTests.cs @@ -5,7 +5,7 @@ using Xunit; using YamlParser = Vendors.YamlDotNet.Core.Parser; -namespace OpenTelemetry.AutoInstrumentation.Tests.Configurations.FileBasedConfiguration.Parser; +namespace OpenTelemetry.AutoInstrumentation.Tests.Configurations.FileBased.Parser; public class EnvVarTypeConverterTests { diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/ParserTests.cs b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/ParserResourceTests.cs similarity index 57% rename from test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/ParserTests.cs rename to test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/ParserResourceTests.cs index ddec15a763..98c20cbffb 100644 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/ParserTests.cs +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/ParserResourceTests.cs @@ -1,18 +1,18 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using OpenTelemetry.AutoInstrumentation.Configurations.FileBasedConfiguration.Parser; using Xunit; +using YamlParser = OpenTelemetry.AutoInstrumentation.Configurations.FileBasedConfiguration.Parser.Parser; -namespace OpenTelemetry.AutoInstrumentation.Tests.Configurations.FileBased; +namespace OpenTelemetry.AutoInstrumentation.Tests.Configurations.FileBased.Parser; [Collection("Non-Parallel Collection")] -public class ParserTests +public class ParserResourceTests { [Fact] public void Parse_FullConfigYaml_ShouldPopulateModelCorrectly() { - var config = Parser.ParseYaml("Configurations/FileBased/Files/TestFile.yaml"); + var config = YamlParser.ParseYaml("Configurations/FileBased/Files/TestResourceFile.yaml"); Assert.NotNull(config); @@ -28,6 +28,26 @@ public void Parse_FullConfigYaml_ShouldPopulateModelCorrectly() Assert.NotNull(config.Resource.AttributesList); Assert.Empty(config.Resource.AttributesList); + Assert.NotNull(config.Resource.DetectionDevelopment); + +#if NET + string[] expectedDetecors = [ + "azureappservice", "container", "host", "operatingsystem", "process", "processruntime" + ]; +#endif +#if NETFRAMEWORK + string[] expectedDetecors = [ + "azureappservice", "host", "operatingsystem", "process", "processruntime" + ]; +#endif + + var detectors = config.Resource.DetectionDevelopment.Detectors; + Assert.NotNull(detectors); + + foreach (var alias in expectedDetecors) + { + FileBasedTestHelper.AssertAliasPropertyExists(detectors, alias); + } } [Fact] @@ -37,7 +57,7 @@ public void Parse_EnvVarYaml_ShouldPopulateModelCompletely() Environment.SetEnvironmentVariable("OTEL_SERVICE_NAME", "my‑service"); Environment.SetEnvironmentVariable("OTEL_RESOURCE_ATTRIBUTES", "key=value"); - var config = Parser.ParseYaml("Configurations/FileBased/Files/TestFileEnvVars.yaml"); + var config = YamlParser.ParseYaml("Configurations/FileBased/Files/TestResourceFileEnvVars.yaml"); Assert.Equal("1.0-rc.1", config.FileFormat); var serviceAttr = config.Resource?.Attributes?.First(a => a.Name == "service.name"); diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBasedConfiguration/FileBasedTestHelper.cs b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBasedConfiguration/FileBasedTestHelper.cs deleted file mode 100644 index 5f87f9ceff..0000000000 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBasedConfiguration/FileBasedTestHelper.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -using Vendors.YamlDotNet.Core; - -namespace OpenTelemetry.AutoInstrumentation.Tests.Configurations.FileBasedConfiguration; - -internal static class FileBasedTestHelper -{ - public static void MoveParserToScalar(IParser parser) - { - parser.MoveNext(); // StreamStart - parser.MoveNext(); // DocumentStart - parser.MoveNext(); // Scalar - } -} diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/OpenTelemetry.AutoInstrumentation.Tests.csproj b/test/OpenTelemetry.AutoInstrumentation.Tests/OpenTelemetry.AutoInstrumentation.Tests.csproj index 0aa0bc3fb7..50c9bfa3f0 100644 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/OpenTelemetry.AutoInstrumentation.Tests.csproj +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/OpenTelemetry.AutoInstrumentation.Tests.csproj @@ -12,10 +12,10 @@ - + PreserveNewest - + PreserveNewest