[SDK] Support dependency injection in ResourceBuilder and load envvars from IConfiguration (#3782)

This commit is contained in:
Mikel Blanchard 2022-10-19 12:14:07 -07:00 committed by GitHub
parent 2377d00c9d
commit cedda83469
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 294 additions and 402 deletions

View File

@ -21,7 +21,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\EnvironmentVariableHelper.cs" Link="Includes\EnvironmentVariableHelper.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\OpenTelemetrySdkEventSource.cs" Link="Includes\OpenTelemetrySdkEventSource.cs" /> <Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\OpenTelemetrySdkEventSource.cs" Link="Includes\OpenTelemetrySdkEventSource.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PeriodicExportingMetricReaderHelper.cs" Link="Includes\PeriodicExportingMetricReaderHelper.cs" /> <Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PeriodicExportingMetricReaderHelper.cs" Link="Includes\PeriodicExportingMetricReaderHelper.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\TagTransformer.cs" Link="Includes\TagTransformer.cs" /> <Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\TagTransformer.cs" Link="Includes\TagTransformer.cs" />

View File

@ -42,9 +42,9 @@ OpenTelemetry.Metrics.MetricReaderOptions.PeriodicExportingMetricReaderOptions.s
~OpenTelemetry.Resources.Resource.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> ~OpenTelemetry.Resources.Resource.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Resources.Resource.Merge(OpenTelemetry.Resources.Resource other) -> OpenTelemetry.Resources.Resource ~OpenTelemetry.Resources.Resource.Merge(OpenTelemetry.Resources.Resource other) -> OpenTelemetry.Resources.Resource
~OpenTelemetry.Resources.Resource.Resource(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void ~OpenTelemetry.Resources.Resource.Resource(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void
~OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector! resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource!
~OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void ~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void
OpenTelemetry.SimpleExportProcessor<T> OpenTelemetry.SimpleExportProcessor<T>
OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T!>! exporter) -> void OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T!>! exporter) -> void
@ -88,12 +88,12 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetResourceBuilder(t
~static OpenTelemetry.ProviderExtensions.GetDefaultResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.ProviderExtensions.GetDefaultResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilder.CreateEmpty() -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilder.CreateEmpty() -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string!, object!>>! attributes) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddService(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, string serviceName, string serviceNamespace = null, string serviceVersion = null, bool autoGenerateServiceInstanceId = true, string serviceInstanceId = null) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddService(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder, string! serviceName, string? serviceNamespace = null, string? serviceVersion = null, bool autoGenerateServiceInstanceId = true, string? serviceInstanceId = null) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void

View File

@ -17,6 +17,7 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void
OpenTelemetry.Metrics.MetricPoint.GetHistogramMax() -> double OpenTelemetry.Metrics.MetricPoint.GetHistogramMax() -> double
OpenTelemetry.Metrics.MetricPoint.GetHistogramMin() -> double OpenTelemetry.Metrics.MetricPoint.GetHistogramMin() -> double
OpenTelemetry.Metrics.MetricPoint.HasMinMax() -> bool OpenTelemetry.Metrics.MetricPoint.HasMinMax() -> bool
OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func<System.IServiceProvider?, OpenTelemetry.Resources.IResourceDetector!>! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder!
OpenTelemetry.Trace.BatchExportActivityProcessorOptions.BatchExportActivityProcessorOptions(Microsoft.Extensions.Configuration.IConfiguration! configuration) -> void OpenTelemetry.Trace.BatchExportActivityProcessorOptions.BatchExportActivityProcessorOptions(Microsoft.Extensions.Configuration.IConfiguration! configuration) -> void
static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!

View File

@ -42,9 +42,9 @@ OpenTelemetry.Metrics.MetricReaderOptions.PeriodicExportingMetricReaderOptions.s
~OpenTelemetry.Resources.Resource.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> ~OpenTelemetry.Resources.Resource.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Resources.Resource.Merge(OpenTelemetry.Resources.Resource other) -> OpenTelemetry.Resources.Resource ~OpenTelemetry.Resources.Resource.Merge(OpenTelemetry.Resources.Resource other) -> OpenTelemetry.Resources.Resource
~OpenTelemetry.Resources.Resource.Resource(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void ~OpenTelemetry.Resources.Resource.Resource(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void
~OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector! resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource!
~OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void ~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void
OpenTelemetry.SimpleExportProcessor<T> OpenTelemetry.SimpleExportProcessor<T>
OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T!>! exporter) -> void OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T!>! exporter) -> void
@ -88,12 +88,12 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetResourceBuilder(t
~static OpenTelemetry.ProviderExtensions.GetDefaultResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.ProviderExtensions.GetDefaultResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilder.CreateEmpty() -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilder.CreateEmpty() -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string!, object!>>! attributes) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddService(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, string serviceName, string serviceNamespace = null, string serviceVersion = null, bool autoGenerateServiceInstanceId = true, string serviceInstanceId = null) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddService(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder, string! serviceName, string? serviceNamespace = null, string? serviceVersion = null, bool autoGenerateServiceInstanceId = true, string? serviceInstanceId = null) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void

View File

@ -17,6 +17,7 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void
OpenTelemetry.Metrics.MetricPoint.GetHistogramMax() -> double OpenTelemetry.Metrics.MetricPoint.GetHistogramMax() -> double
OpenTelemetry.Metrics.MetricPoint.GetHistogramMin() -> double OpenTelemetry.Metrics.MetricPoint.GetHistogramMin() -> double
OpenTelemetry.Metrics.MetricPoint.HasMinMax() -> bool OpenTelemetry.Metrics.MetricPoint.HasMinMax() -> bool
OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func<System.IServiceProvider?, OpenTelemetry.Resources.IResourceDetector!>! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder!
OpenTelemetry.Trace.BatchExportActivityProcessorOptions.BatchExportActivityProcessorOptions(Microsoft.Extensions.Configuration.IConfiguration! configuration) -> void OpenTelemetry.Trace.BatchExportActivityProcessorOptions.BatchExportActivityProcessorOptions(Microsoft.Extensions.Configuration.IConfiguration! configuration) -> void
static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!

View File

@ -42,9 +42,9 @@ OpenTelemetry.Metrics.MetricReaderOptions.PeriodicExportingMetricReaderOptions.s
~OpenTelemetry.Resources.Resource.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> ~OpenTelemetry.Resources.Resource.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Resources.Resource.Merge(OpenTelemetry.Resources.Resource other) -> OpenTelemetry.Resources.Resource ~OpenTelemetry.Resources.Resource.Merge(OpenTelemetry.Resources.Resource other) -> OpenTelemetry.Resources.Resource
~OpenTelemetry.Resources.Resource.Resource(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void ~OpenTelemetry.Resources.Resource.Resource(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void
~OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector! resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource!
~OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void ~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void
OpenTelemetry.SimpleExportProcessor<T> OpenTelemetry.SimpleExportProcessor<T>
OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T!>! exporter) -> void OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T!>! exporter) -> void
@ -88,12 +88,12 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetResourceBuilder(t
~static OpenTelemetry.ProviderExtensions.GetDefaultResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.ProviderExtensions.GetDefaultResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilder.CreateEmpty() -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilder.CreateEmpty() -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string!, object!>>! attributes) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddService(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, string serviceName, string serviceNamespace = null, string serviceVersion = null, bool autoGenerateServiceInstanceId = true, string serviceInstanceId = null) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddService(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder, string! serviceName, string? serviceNamespace = null, string? serviceVersion = null, bool autoGenerateServiceInstanceId = true, string? serviceInstanceId = null) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void

View File

@ -17,6 +17,7 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void
OpenTelemetry.Metrics.MetricPoint.GetHistogramMax() -> double OpenTelemetry.Metrics.MetricPoint.GetHistogramMax() -> double
OpenTelemetry.Metrics.MetricPoint.GetHistogramMin() -> double OpenTelemetry.Metrics.MetricPoint.GetHistogramMin() -> double
OpenTelemetry.Metrics.MetricPoint.HasMinMax() -> bool OpenTelemetry.Metrics.MetricPoint.HasMinMax() -> bool
OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func<System.IServiceProvider?, OpenTelemetry.Resources.IResourceDetector!>! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder!
OpenTelemetry.Trace.BatchExportActivityProcessorOptions.BatchExportActivityProcessorOptions(Microsoft.Extensions.Configuration.IConfiguration! configuration) -> void OpenTelemetry.Trace.BatchExportActivityProcessorOptions.BatchExportActivityProcessorOptions(Microsoft.Extensions.Configuration.IConfiguration! configuration) -> void
static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!

View File

@ -42,9 +42,9 @@ OpenTelemetry.Metrics.MetricReaderOptions.PeriodicExportingMetricReaderOptions.s
~OpenTelemetry.Resources.Resource.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> ~OpenTelemetry.Resources.Resource.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Resources.Resource.Merge(OpenTelemetry.Resources.Resource other) -> OpenTelemetry.Resources.Resource ~OpenTelemetry.Resources.Resource.Merge(OpenTelemetry.Resources.Resource other) -> OpenTelemetry.Resources.Resource
~OpenTelemetry.Resources.Resource.Resource(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void ~OpenTelemetry.Resources.Resource.Resource(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void
~OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector! resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource!
~OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void ~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void
OpenTelemetry.SimpleExportProcessor<T> OpenTelemetry.SimpleExportProcessor<T>
OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T!>! exporter) -> void OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T!>! exporter) -> void
@ -88,12 +88,12 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetResourceBuilder(t
~static OpenTelemetry.ProviderExtensions.GetDefaultResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.ProviderExtensions.GetDefaultResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource ~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilder.CreateEmpty() -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilder.CreateEmpty() -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string!, object!>>! attributes) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddService(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, string serviceName, string serviceNamespace = null, string serviceVersion = null, bool autoGenerateServiceInstanceId = true, string serviceInstanceId = null) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddService(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder, string! serviceName, string? serviceNamespace = null, string? serviceVersion = null, bool autoGenerateServiceInstanceId = true, string? serviceInstanceId = null) -> OpenTelemetry.Resources.ResourceBuilder!
~static OpenTelemetry.Resources.ResourceBuilderExtensions.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder static OpenTelemetry.Resources.ResourceBuilderExtensions.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void

View File

@ -17,6 +17,7 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void
OpenTelemetry.Metrics.MetricPoint.GetHistogramMax() -> double OpenTelemetry.Metrics.MetricPoint.GetHistogramMax() -> double
OpenTelemetry.Metrics.MetricPoint.GetHistogramMin() -> double OpenTelemetry.Metrics.MetricPoint.GetHistogramMin() -> double
OpenTelemetry.Metrics.MetricPoint.HasMinMax() -> bool OpenTelemetry.Metrics.MetricPoint.HasMinMax() -> bool
OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func<System.IServiceProvider?, OpenTelemetry.Resources.IResourceDetector!>! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder!
OpenTelemetry.Trace.BatchExportActivityProcessorOptions.BatchExportActivityProcessorOptions(Microsoft.Extensions.Configuration.IConfiguration! configuration) -> void OpenTelemetry.Trace.BatchExportActivityProcessorOptions.BatchExportActivityProcessorOptions(Microsoft.Extensions.Configuration.IConfiguration! configuration) -> void
static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!

View File

@ -8,6 +8,11 @@
([#3760](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3760), ([#3760](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3760),
[#3776](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3776)) [#3776](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3776))
* Added dependency injection support in the `ResourceBuilder` class and added
support for loading environment variables from `IConfiguration` for the
`AddEnvironmentVariableDetector` extension
([#3782](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3782))
## 1.4.0-beta.2 ## 1.4.0-beta.2
Released 2022-Oct-17 Released 2022-Oct-17

View File

@ -1,162 +0,0 @@
// <copyright file="EnvironmentVariableHelper.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
using System;
using System.Globalization;
using System.Security;
namespace OpenTelemetry.Internal
{
/// <summary>
/// EnvironmentVariableHelper facilitates parsing environment variable values as defined by
/// <a href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md">
/// the specification</a>.
/// </summary>
internal static class EnvironmentVariableHelper
{
/// <summary>
/// Reads an environment variable without any parsing.
/// </summary>
/// <param name="envVarKey">The name of the environment variable.</param>
/// <param name="result">The parsed value of the environment variable.</param>
/// <returns>
/// Returns <c>true</c> when a non-empty value was read; otherwise, <c>false</c>.
/// </returns>
public static bool LoadString(string envVarKey, out string result)
{
result = null;
try
{
result = Environment.GetEnvironmentVariable(envVarKey);
}
catch (SecurityException ex)
{
// The caller does not have the required permission to
// retrieve the value of an environment variable from the current process.
OpenTelemetrySdkEventSource.Log.MissingPermissionsToReadEnvironmentVariable(ex);
return false;
}
return !string.IsNullOrEmpty(result);
}
/// <summary>
/// Reads an environment variable and parses is as a
/// <a href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#numeric-value">
/// numeric value</a> - a non-negative decimal integer.
/// </summary>
/// <param name="envVarKey">The name of the environment variable.</param>
/// <param name="result">The parsed value of the environment variable.</param>
/// <returns>
/// Returns <c>true</c> when a non-empty value was read; otherwise, <c>false</c>.
/// </returns>
/// <exception cref="FormatException">
/// Thrown when failed to parse the non-empty value.
/// </exception>
public static bool LoadNumeric(string envVarKey, out int result)
{
result = 0;
if (!LoadString(envVarKey, out string value))
{
return false;
}
return LoadNumeric(envVarKey, value, out result);
}
/// <summary>
/// Reads an environment variable and parses is as a
/// <a href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#numeric-value">
/// numeric value</a> - a non-negative decimal integer.
/// </summary>
/// <param name="envVarKey">The name of the environment variable.</param>
/// <param name="value">The value of the environment variable.</param>
/// <param name="result">The parsed value of the environment variable.</param>
/// <returns>
/// Returns <c>true</c> when a non-empty value was read; otherwise, <c>false</c>.
/// </returns>
/// <exception cref="FormatException">
/// Thrown when failed to parse the non-empty value.
/// </exception>
public static bool LoadNumeric(string envVarKey, string value, out int result)
{
if (!int.TryParse(value, NumberStyles.None, CultureInfo.InvariantCulture, out result))
{
throw new FormatException($"{envVarKey} environment variable has an invalid value: '{value}'");
}
return true;
}
/// <summary>
/// Reads an environment variable and parses it as a <see cref="Uri" />.
/// </summary>
/// <param name="envVarKey">The name of the environment variable.</param>
/// <param name="result">The parsed value of the environment variable.</param>
/// <returns>
/// Returns <c>true</c> when a non-empty value was read; otherwise, <c>false</c>.
/// </returns>
/// <exception cref="FormatException">
/// Thrown when failed to parse the non-empty value.
/// </exception>
public static bool LoadUri(string envVarKey, out Uri result)
{
result = null;
if (!LoadString(envVarKey, out string value))
{
return false;
}
if (!Uri.TryCreate(value, UriKind.Absolute, out result))
{
throw new FormatException($"{envVarKey} environment variable has an invalid value: '${value}'");
}
return true;
}
/// <summary>
/// Reads an environment variable and parses it as a <see cref="bool" />.
/// </summary>
/// <param name="envVarKey">The name of the environment variable.</param>
/// <param name="result">The parsed value of the environment variable.</param>
/// <returns>
/// Returns <c>true</c> when a non-empty value was read; otherwise, <c>false</c>.
/// </returns>
/// <exception cref="FormatException">
/// Thrown when failed to parse the non-empty value.
/// </exception>
public static bool LoadBoolean(string envVarKey, out bool result)
{
result = default;
if (!LoadString(envVarKey, out string value))
{
return false;
}
if (!bool.TryParse(value, out result))
{
throw new FormatException($"{envVarKey} environment variable has an invalid value: '${value}'");
}
return true;
}
}
}

View File

@ -61,7 +61,10 @@ namespace OpenTelemetry.Metrics
StringBuilder exportersAdded = new StringBuilder(); StringBuilder exportersAdded = new StringBuilder();
StringBuilder instrumentationFactoriesAdded = new StringBuilder(); StringBuilder instrumentationFactoriesAdded = new StringBuilder();
this.Resource = (state.ResourceBuilder ?? ResourceBuilder.CreateDefault()).Build(); var resourceBuilder = state.ResourceBuilder ?? ResourceBuilder.CreateDefault();
resourceBuilder.ServiceProvider = serviceProvider;
this.Resource = resourceBuilder.Build();
this.viewConfigs = state.ViewConfigs; this.viewConfigs = state.ViewConfigs;
foreach (var reader in state.Readers) foreach (var reader in state.Readers)

View File

@ -15,21 +15,29 @@
// </copyright> // </copyright>
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using OpenTelemetry.Internal; using OpenTelemetry.Internal;
namespace OpenTelemetry.Resources namespace OpenTelemetry.Resources
{ {
internal class OtelEnvResourceDetector : IResourceDetector internal sealed class OtelEnvResourceDetector : IResourceDetector
{ {
public const string EnvVarKey = "OTEL_RESOURCE_ATTRIBUTES"; public const string EnvVarKey = "OTEL_RESOURCE_ATTRIBUTES";
private const char AttributeListSplitter = ','; private const char AttributeListSplitter = ',';
private const char AttributeKeyValueSplitter = '='; private const char AttributeKeyValueSplitter = '=';
private readonly IConfiguration configuration;
public OtelEnvResourceDetector(IConfiguration configuration)
{
this.configuration = configuration;
}
public Resource Detect() public Resource Detect()
{ {
var resource = Resource.Empty; var resource = Resource.Empty;
if (EnvironmentVariableHelper.LoadString(EnvVarKey, out string envResourceAttributeValue)) if (this.configuration.TryGetStringValue(EnvVarKey, out string envResourceAttributeValue))
{ {
var attributes = ParseResourceAttributes(envResourceAttributeValue); var attributes = ParseResourceAttributes(envResourceAttributeValue);
resource = new Resource(attributes); resource = new Resource(attributes);

View File

@ -15,19 +15,27 @@
// </copyright> // </copyright>
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using OpenTelemetry.Internal; using OpenTelemetry.Internal;
namespace OpenTelemetry.Resources namespace OpenTelemetry.Resources
{ {
internal class OtelServiceNameEnvVarDetector : IResourceDetector internal sealed class OtelServiceNameEnvVarDetector : IResourceDetector
{ {
public const string EnvVarKey = "OTEL_SERVICE_NAME"; public const string EnvVarKey = "OTEL_SERVICE_NAME";
private readonly IConfiguration configuration;
public OtelServiceNameEnvVarDetector(IConfiguration configuration)
{
this.configuration = configuration;
}
public Resource Detect() public Resource Detect()
{ {
var resource = Resource.Empty; var resource = Resource.Empty;
if (EnvironmentVariableHelper.LoadString(EnvVarKey, out string envResourceAttributeValue)) if (this.configuration.TryGetStringValue(EnvVarKey, out string envResourceAttributeValue))
{ {
resource = new Resource(new Dictionary<string, object> resource = new Resource(new Dictionary<string, object>
{ {

View File

@ -14,6 +14,9 @@
// limitations under the License. // limitations under the License.
// </copyright> // </copyright>
#nullable enable
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using OpenTelemetry.Internal; using OpenTelemetry.Internal;
@ -25,7 +28,8 @@ namespace OpenTelemetry.Resources
/// </summary> /// </summary>
public class ResourceBuilder public class ResourceBuilder
{ {
internal readonly List<Resource> Resources = new(); internal readonly List<IResourceDetector> ResourceDetectors = new();
private static readonly Resource DefaultResource;
static ResourceBuilder() static ResourceBuilder()
{ {
@ -54,7 +58,7 @@ namespace OpenTelemetry.Resources
{ {
} }
private static Resource DefaultResource { get; } internal IServiceProvider? ServiceProvider { get; set; }
/// <summary> /// <summary>
/// Creates a <see cref="ResourceBuilder"/> instance with Default /// Creates a <see cref="ResourceBuilder"/> instance with Default
@ -83,7 +87,7 @@ namespace OpenTelemetry.Resources
/// <returns><see cref="ResourceBuilder"/> for chaining.</returns> /// <returns><see cref="ResourceBuilder"/> for chaining.</returns>
public ResourceBuilder Clear() public ResourceBuilder Clear()
{ {
this.Resources.Clear(); this.ResourceDetectors.Clear();
return this; return this;
} }
@ -96,24 +100,55 @@ namespace OpenTelemetry.Resources
{ {
Resource finalResource = Resource.Empty; Resource finalResource = Resource.Empty;
foreach (Resource resource in this.Resources) foreach (IResourceDetector resourceDetector in this.ResourceDetectors)
{ {
finalResource = finalResource.Merge(resource); if (resourceDetector is ResolvingResourceDetector resolvingResourceDetector)
{
resolvingResourceDetector.Resolve(this.ServiceProvider);
}
var resource = resourceDetector.Detect();
if (resource != null)
{
finalResource = finalResource.Merge(resource);
}
} }
return finalResource; return finalResource;
} }
/// <summary>
/// Add a <see cref="IResourceDetector"/> to the builder.
/// </summary>
/// <param name="resourceDetector"><see cref="IResourceDetector"/>.</param>
/// <returns>Supplied <see cref="ResourceBuilder"/> for call chaining.</returns>
public ResourceBuilder AddDetector(IResourceDetector resourceDetector) public ResourceBuilder AddDetector(IResourceDetector resourceDetector)
{ {
Guard.ThrowIfNull(resourceDetector); Guard.ThrowIfNull(resourceDetector);
Resource resource = resourceDetector.Detect(); this.ResourceDetectors.Add(resourceDetector);
if (resource != null) return this;
{ }
this.Resources.Add(resource);
} /// <summary>
/// Add a <see cref="IResourceDetector"/> to the builder which will be resolved using the application <see cref="IServiceProvider"/>.
/// </summary>
/// <remarks>
/// Note: The supplied <paramref name="resourceDetectorFactory"/> may be
/// called with a <see langword="null"/> <see cref="IServiceProvider"/>
/// for detached <see cref="ResourceBuilder"/> instances. Factories
/// should either throw if a <see langword="null"/> cannot be handled,
/// or return a default <see cref="IResourceDetector"/> when <see
/// cref="IServiceProvider"/> is not available.
/// </remarks>
/// <param name="resourceDetectorFactory">Resource detector factory.</param>
/// <returns>Supplied <see cref="ResourceBuilder"/> for call chaining.</returns>
public ResourceBuilder AddDetector(Func<IServiceProvider?, IResourceDetector> resourceDetectorFactory)
{
Guard.ThrowIfNull(resourceDetectorFactory);
this.ResourceDetectors.Add(new ResolvingResourceDetector(resourceDetectorFactory));
return this; return this;
} }
@ -122,9 +157,47 @@ namespace OpenTelemetry.Resources
{ {
Guard.ThrowIfNull(resource); Guard.ThrowIfNull(resource);
this.Resources.Add(resource); this.ResourceDetectors.Add(new WrapperResourceDetector(resource));
return this; return this;
} }
internal sealed class WrapperResourceDetector : IResourceDetector
{
private readonly Resource resource;
public WrapperResourceDetector(Resource resource)
{
this.resource = resource;
}
public Resource Detect() => this.resource;
}
private sealed class ResolvingResourceDetector : IResourceDetector
{
private readonly Func<IServiceProvider?, IResourceDetector> resourceDetectorFactory;
private IResourceDetector? resourceDetector;
public ResolvingResourceDetector(Func<IServiceProvider?, IResourceDetector> resourceDetectorFactory)
{
this.resourceDetectorFactory = resourceDetectorFactory;
}
public void Resolve(IServiceProvider? serviceProvider)
{
this.resourceDetector = this.resourceDetectorFactory(serviceProvider)
?? throw new InvalidOperationException("ResourceDetector factory did not return a ResourceDetector instance.");
}
public Resource Detect()
{
var detector = this.resourceDetector;
Debug.Assert(detector != null, "detector was null");
return detector?.Detect() ?? Resource.Empty;
}
}
} }
} }

View File

@ -14,9 +14,13 @@
// limitations under the License. // limitations under the License.
// </copyright> // </copyright>
#nullable enable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Internal; using OpenTelemetry.Internal;
namespace OpenTelemetry.Resources namespace OpenTelemetry.Resources
@ -49,10 +53,10 @@ namespace OpenTelemetry.Resources
public static ResourceBuilder AddService( public static ResourceBuilder AddService(
this ResourceBuilder resourceBuilder, this ResourceBuilder resourceBuilder,
string serviceName, string serviceName,
string serviceNamespace = null, string? serviceNamespace = null,
string serviceVersion = null, string? serviceVersion = null,
bool autoGenerateServiceInstanceId = true, bool autoGenerateServiceInstanceId = true,
string serviceInstanceId = null) string? serviceInstanceId = null)
{ {
Dictionary<string, object> resourceAttributes = new Dictionary<string, object>(); Dictionary<string, object> resourceAttributes = new Dictionary<string, object>();
@ -62,12 +66,12 @@ namespace OpenTelemetry.Resources
if (!string.IsNullOrEmpty(serviceNamespace)) if (!string.IsNullOrEmpty(serviceNamespace))
{ {
resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceNamespace, serviceNamespace); resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceNamespace, serviceNamespace!);
} }
if (!string.IsNullOrEmpty(serviceVersion)) if (!string.IsNullOrEmpty(serviceVersion))
{ {
resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceVersion, serviceVersion); resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceVersion, serviceVersion!);
} }
if (serviceInstanceId == null && autoGenerateServiceInstanceId) if (serviceInstanceId == null && autoGenerateServiceInstanceId)
@ -117,7 +121,11 @@ namespace OpenTelemetry.Resources
/// <returns>Returns <see cref="ResourceBuilder"/> for chaining.</returns> /// <returns>Returns <see cref="ResourceBuilder"/> for chaining.</returns>
public static ResourceBuilder AddEnvironmentVariableDetector(this ResourceBuilder resourceBuilder) public static ResourceBuilder AddEnvironmentVariableDetector(this ResourceBuilder resourceBuilder)
{ {
return resourceBuilder.AddDetector(new OtelEnvResourceDetector()).AddDetector(new OtelServiceNameEnvVarDetector()); Lazy<IConfiguration> configuration = new Lazy<IConfiguration>(() => new ConfigurationBuilder().AddEnvironmentVariables().Build());
return resourceBuilder
.AddDetector(sp => new OtelEnvResourceDetector(sp?.GetService<IConfiguration>() ?? configuration.Value))
.AddDetector(sp => new OtelServiceNameEnvVarDetector(sp?.GetService<IConfiguration>() ?? configuration.Value));
} }
private static string GetFileVersion() private static string GetFileVersion()

View File

@ -66,7 +66,10 @@ namespace OpenTelemetry.Trace
state.EnableErrorStatusOnException(); state.EnableErrorStatusOnException();
} }
this.Resource = (state.ResourceBuilder ?? ResourceBuilder.CreateDefault()).Build(); var resourceBuilder = state.ResourceBuilder ?? ResourceBuilder.CreateDefault();
resourceBuilder.ServiceProvider = serviceProvider;
this.Resource = resourceBuilder.Build();
this.sampler = state.Sampler ?? new ParentBasedSampler(new AlwaysOnSampler()); this.sampler = state.Sampler ?? new ParentBasedSampler(new AlwaysOnSampler());
this.supportLegacyActivity = state.LegacyActivityOperationNames.Count > 0; this.supportLegacyActivity = state.LegacyActivityOperationNames.Count > 0;

View File

@ -1,165 +0,0 @@
// <copyright file="EnvironmentVariableHelperTests.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
using System;
using Xunit;
namespace OpenTelemetry.Internal.Tests
{
public class EnvironmentVariableHelperTests : IDisposable
{
private const string EnvVar = "OTEL_EXAMPLE_VARIABLE";
public EnvironmentVariableHelperTests()
{
Environment.SetEnvironmentVariable(EnvVar, null);
}
public void Dispose()
{
Environment.SetEnvironmentVariable(EnvVar, null);
GC.SuppressFinalize(this);
}
[Fact]
public void LoadString()
{
const string value = "something";
Environment.SetEnvironmentVariable(EnvVar, value);
bool actualBool = EnvironmentVariableHelper.LoadString(EnvVar, out string actualValue);
Assert.True(actualBool);
Assert.Equal(value, actualValue);
}
[Fact]
public void LoadString_NoValue()
{
bool actualBool = EnvironmentVariableHelper.LoadString(EnvVar, out string actualValue);
Assert.False(actualBool);
Assert.Null(actualValue);
}
[Theory]
[InlineData("true", true)]
[InlineData("TRUE", true)]
[InlineData("false", false)]
[InlineData("FALSE", false)]
[InlineData(" true ", true)]
[InlineData(" false ", false)]
public void LoadBoolean(string value, bool expectedValue)
{
Environment.SetEnvironmentVariable(EnvVar, value);
bool actualBool = EnvironmentVariableHelper.LoadBoolean(EnvVar, out bool actualValue);
Assert.True(actualBool);
Assert.Equal(expectedValue, actualValue);
}
[Fact]
public void LoadBoolean_NoValue()
{
bool actualBool = EnvironmentVariableHelper.LoadBoolean(EnvVar, out bool actualValue);
Assert.False(actualBool);
Assert.False(actualValue);
}
[Theory]
[InlineData("something")] // non true/false
[InlineData(" ")] // whitespaces
[InlineData("0")] // 0
[InlineData("1")] // 1
public void LoadBoolean_Invalid(string value)
{
Environment.SetEnvironmentVariable(EnvVar, value);
Assert.Throws<FormatException>(() => EnvironmentVariableHelper.LoadBoolean(EnvVar, out bool _));
}
[Theory]
[InlineData("123", 123)]
[InlineData("0", 0)]
public void LoadNumeric(string value, int expectedValue)
{
Environment.SetEnvironmentVariable(EnvVar, value);
bool actualBool = EnvironmentVariableHelper.LoadNumeric(EnvVar, out int actualValue);
Assert.True(actualBool);
Assert.Equal(expectedValue, actualValue);
}
[Fact]
public void LoadNumeric_NoValue()
{
bool actualBool = EnvironmentVariableHelper.LoadNumeric(EnvVar, out int actualValue);
Assert.False(actualBool);
Assert.Equal(0, actualValue);
}
[Theory]
[InlineData("something")] // NaN
[InlineData("-12")] // negative number not allowed
[InlineData("-0")] // sign not allowed
[InlineData("-1")] // -1 is not allowed
[InlineData(" 123 ")] // whitespaces not allowed
[InlineData("0xFF")] // only decimal number allowed
public void LoadNumeric_Invalid(string value)
{
Environment.SetEnvironmentVariable(EnvVar, value);
Assert.Throws<FormatException>(() => EnvironmentVariableHelper.LoadNumeric(EnvVar, out int _));
}
[Theory]
[InlineData("http://www.example.com", "http://www.example.com/")]
[InlineData("http://www.example.com/space%20here.html", "http://www.example.com/space here.html")] // characters are converted
[InlineData("http://www.example.com/space here.html", "http://www.example.com/space here.html")] // characters are escaped
public void LoadUri(string value, string expectedValue)
{
Environment.SetEnvironmentVariable(EnvVar, value);
bool actualBool = EnvironmentVariableHelper.LoadUri(EnvVar, out Uri actualValue);
Assert.True(actualBool);
Assert.Equal(expectedValue, actualValue.ToString());
}
[Fact]
public void LoadUri_NoValue()
{
bool actualBool = EnvironmentVariableHelper.LoadUri(EnvVar, out Uri actualValue);
Assert.False(actualBool);
Assert.Null(actualValue);
}
[Theory]
[InlineData("invalid")] // invalid format
[InlineData(" ")] // whitespace
public void LoadUri_Invalid(string value)
{
Environment.SetEnvironmentVariable(EnvVar, value);
Assert.Throws<FormatException>(() => EnvironmentVariableHelper.LoadUri(EnvVar, out Uri _));
}
}
}

View File

@ -168,32 +168,39 @@ namespace OpenTelemetry.Metrics.Tests
var builder = Sdk.CreateMeterProviderBuilder(); var builder = Sdk.CreateMeterProviderBuilder();
int configureInvocations = 0; int configureInvocations = 0;
bool serviceProviderTestExecuted = false;
builder.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService("Test")); builder.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService("Test"));
builder.ConfigureResource(builder => builder.ConfigureResource(builder =>
{ {
configureInvocations++; configureInvocations++;
Assert.Single(builder.Resources); Assert.Single(builder.ResourceDetectors);
builder.AddAttributes(new Dictionary<string, object>() { ["key1"] = "value1" }); builder.AddAttributes(new Dictionary<string, object>() { ["key1"] = "value1" });
Assert.Equal(2, builder.Resources.Count); Assert.Equal(2, builder.ResourceDetectors.Count);
}); });
builder.SetResourceBuilder(ResourceBuilder.CreateEmpty()); builder.SetResourceBuilder(ResourceBuilder.CreateEmpty());
builder.ConfigureResource(builder => builder.ConfigureResource(builder =>
{ {
configureInvocations++; configureInvocations++;
Assert.Empty(builder.Resources); Assert.Empty(builder.ResourceDetectors);
builder.AddAttributes(new Dictionary<string, object>() { ["key2"] = "value2" }); builder.AddDetector(sp =>
{
serviceProviderTestExecuted = true;
Assert.NotNull(sp);
return new ResourceBuilder.WrapperResourceDetector(new Resource(new Dictionary<string, object>() { ["key2"] = "value2" }));
});
Assert.Single(builder.Resources); Assert.Single(builder.ResourceDetectors);
}); });
using var provider = builder.Build() as MeterProviderSdk; using var provider = builder.Build() as MeterProviderSdk;
Assert.True(serviceProviderTestExecuted);
Assert.Equal(2, configureInvocations); Assert.Equal(2, configureInvocations);
Assert.Single(provider.Resource.Attributes); Assert.Single(provider.Resource.Attributes);

View File

@ -16,6 +16,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using Xunit; using Xunit;
namespace OpenTelemetry.Resources.Tests namespace OpenTelemetry.Resources.Tests
@ -43,7 +44,9 @@ namespace OpenTelemetry.Resources.Tests
public void OtelEnvResource_NullEnvVar() public void OtelEnvResource_NullEnvVar()
{ {
// Arrange // Arrange
var resource = new OtelEnvResourceDetector().Detect(); var resource = new OtelEnvResourceDetector(
new ConfigurationBuilder().AddEnvironmentVariables().Build())
.Detect();
// Assert // Assert
Assert.Equal(Resource.Empty, resource); Assert.Equal(Resource.Empty, resource);
@ -55,7 +58,9 @@ namespace OpenTelemetry.Resources.Tests
// Arrange // Arrange
var envVarValue = "Key1=Val1,Key2=Val2"; var envVarValue = "Key1=Val1,Key2=Val2";
Environment.SetEnvironmentVariable(OtelEnvResourceDetector.EnvVarKey, envVarValue); Environment.SetEnvironmentVariable(OtelEnvResourceDetector.EnvVarKey, envVarValue);
var resource = new OtelEnvResourceDetector().Detect(); var resource = new OtelEnvResourceDetector(
new ConfigurationBuilder().AddEnvironmentVariables().Build())
.Detect();
// Assert // Assert
Assert.NotEqual(Resource.Empty, resource); Assert.NotEqual(Resource.Empty, resource);
@ -68,12 +73,33 @@ namespace OpenTelemetry.Resources.Tests
// Arrange // Arrange
var envVarValue = "Key1,Key2=Val2"; var envVarValue = "Key1,Key2=Val2";
Environment.SetEnvironmentVariable(OtelEnvResourceDetector.EnvVarKey, envVarValue); Environment.SetEnvironmentVariable(OtelEnvResourceDetector.EnvVarKey, envVarValue);
var resource = new OtelEnvResourceDetector().Detect(); var resource = new OtelEnvResourceDetector(
new ConfigurationBuilder().AddEnvironmentVariables().Build())
.Detect();
// Assert // Assert
Assert.NotEqual(Resource.Empty, resource); Assert.NotEqual(Resource.Empty, resource);
Assert.Single(resource.Attributes); Assert.Single(resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>("Key2", "Val2"), resource.Attributes); Assert.Contains(new KeyValuePair<string, object>("Key2", "Val2"), resource.Attributes);
} }
[Fact]
public void OtelEnvResource_UsingIConfiguration()
{
var values = new Dictionary<string, string>()
{
[OtelEnvResourceDetector.EnvVarKey] = "Key1=Val1,Key2=Val2",
};
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(values)
.Build();
var resource = new OtelEnvResourceDetector(configuration).Detect();
Assert.NotEqual(Resource.Empty, resource);
Assert.Contains(new KeyValuePair<string, object>("Key1", "Val1"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>("Key2", "Val2"), resource.Attributes);
}
} }
} }

View File

@ -16,6 +16,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using Xunit; using Xunit;
namespace OpenTelemetry.Resources.Tests namespace OpenTelemetry.Resources.Tests
@ -43,7 +44,9 @@ namespace OpenTelemetry.Resources.Tests
public void OtelServiceNameEnvVar_Null() public void OtelServiceNameEnvVar_Null()
{ {
// Act // Act
var resource = new OtelServiceNameEnvVarDetector().Detect(); var resource = new OtelServiceNameEnvVarDetector(
new ConfigurationBuilder().AddEnvironmentVariables().Build())
.Detect();
// Assert // Assert
Assert.Equal(Resource.Empty, resource); Assert.Equal(Resource.Empty, resource);
@ -57,11 +60,31 @@ namespace OpenTelemetry.Resources.Tests
Environment.SetEnvironmentVariable(OtelServiceNameEnvVarDetector.EnvVarKey, envVarValue); Environment.SetEnvironmentVariable(OtelServiceNameEnvVarDetector.EnvVarKey, envVarValue);
// Act // Act
var resource = new OtelServiceNameEnvVarDetector().Detect(); var resource = new OtelServiceNameEnvVarDetector(
new ConfigurationBuilder().AddEnvironmentVariables().Build())
.Detect();
// Assert // Assert
Assert.NotEqual(Resource.Empty, resource); Assert.NotEqual(Resource.Empty, resource);
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceName, envVarValue), resource.Attributes); Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceName, envVarValue), resource.Attributes);
} }
[Fact]
public void OtelServiceNameEnvVar_UsingIConfiguration()
{
var values = new Dictionary<string, string>()
{
[OtelServiceNameEnvVarDetector.EnvVarKey] = "my-service",
};
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(values)
.Build();
var resource = new OtelServiceNameEnvVarDetector(configuration).Detect();
Assert.NotEqual(Resource.Empty, resource);
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceName, "my-service"), resource.Attributes);
}
} }
} }

View File

@ -17,6 +17,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Xunit; using Xunit;
namespace OpenTelemetry.Resources.Tests namespace OpenTelemetry.Resources.Tests
@ -499,6 +500,45 @@ namespace OpenTelemetry.Resources.Tests
Assert.Contains(new KeyValuePair<string, object>("service.name", "from-code"), attributes); Assert.Contains(new KeyValuePair<string, object>("service.name", "from-code"), attributes);
} }
[Fact]
public void ResourceBuilder_ServiceProvider_Available()
{
var builder = ResourceBuilder.CreateDefault();
bool nullTestRun = false;
builder.AddDetector(sp =>
{
nullTestRun = true;
Assert.Null(sp);
return new NoopResourceDetector();
});
builder.Build();
Assert.True(nullTestRun);
builder = ResourceBuilder.CreateDefault();
bool validTestRun = false;
var serviceCollection = new ServiceCollection();
using var serviceProvider = serviceCollection.BuildServiceProvider();
builder.ServiceProvider = serviceProvider;
builder.AddDetector(sp =>
{
validTestRun = true;
Assert.NotNull(sp);
return new NoopResourceDetector();
});
builder.Build();
Assert.True(validTestRun);
}
private static void ClearEnvVars() private static void ClearEnvVars()
{ {
Environment.SetEnvironmentVariable(OtelEnvResourceDetector.EnvVarKey, null); Environment.SetEnvironmentVariable(OtelEnvResourceDetector.EnvVarKey, null);
@ -552,5 +592,10 @@ namespace OpenTelemetry.Resources.Tests
AddAttributes(attributes, attributeCount, startIndex); AddAttributes(attributes, attributeCount, startIndex);
return attributes; return attributes;
} }
private sealed class NoopResourceDetector : IResourceDetector
{
public Resource Detect() => Resource.Empty;
}
} }
} }

View File

@ -254,32 +254,39 @@ namespace OpenTelemetry.Trace.Tests
var builder = Sdk.CreateTracerProviderBuilder(); var builder = Sdk.CreateTracerProviderBuilder();
int configureInvocations = 0; int configureInvocations = 0;
bool serviceProviderTestExecuted = false;
builder.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService("Test")); builder.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService("Test"));
builder.ConfigureResource(builder => builder.ConfigureResource(builder =>
{ {
configureInvocations++; configureInvocations++;
Assert.Single(builder.Resources); Assert.Single(builder.ResourceDetectors);
builder.AddAttributes(new Dictionary<string, object>() { ["key1"] = "value1" }); builder.AddAttributes(new Dictionary<string, object>() { ["key1"] = "value1" });
Assert.Equal(2, builder.Resources.Count); Assert.Equal(2, builder.ResourceDetectors.Count);
}); });
builder.SetResourceBuilder(ResourceBuilder.CreateEmpty()); builder.SetResourceBuilder(ResourceBuilder.CreateEmpty());
builder.ConfigureResource(builder => builder.ConfigureResource(builder =>
{ {
configureInvocations++; configureInvocations++;
Assert.Empty(builder.Resources); Assert.Empty(builder.ResourceDetectors);
builder.AddAttributes(new Dictionary<string, object>() { ["key2"] = "value2" }); builder.AddDetector(sp =>
{
serviceProviderTestExecuted = true;
Assert.NotNull(sp);
return new ResourceBuilder.WrapperResourceDetector(new Resource(new Dictionary<string, object>() { ["key2"] = "value2" }));
});
Assert.Single(builder.Resources); Assert.Single(builder.ResourceDetectors);
}); });
using var provider = builder.Build() as TracerProviderSdk; using var provider = builder.Build() as TracerProviderSdk;
Assert.True(serviceProviderTestExecuted);
Assert.Equal(2, configureInvocations); Assert.Equal(2, configureInvocations);
Assert.Single(provider.Resource.Attributes); Assert.Single(provider.Resource.Attributes);