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