[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>
<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\PeriodicExportingMetricReaderHelper.cs" Link="Includes\PeriodicExportingMetricReaderHelper.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.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.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder
~OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource
~OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector! resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder!
OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource!
OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void
OpenTelemetry.SimpleExportProcessor<T>
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.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> 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.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.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> 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.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.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
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.GetHistogramMin() -> double
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
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!

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.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.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder
~OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource
~OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector! resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder!
OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource!
OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void
OpenTelemetry.SimpleExportProcessor<T>
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.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> 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.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.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> 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.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.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
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.GetHistogramMin() -> double
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
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!

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.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.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder
~OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource
~OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector! resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder!
OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource!
OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void
OpenTelemetry.SimpleExportProcessor<T>
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.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> 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.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.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> 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.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.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
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.GetHistogramMin() -> double
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
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!

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.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.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder
~OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource
~OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.AddDetector(OpenTelemetry.Resources.IResourceDetector! resourceDetector) -> OpenTelemetry.Resources.ResourceBuilder!
OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource!
OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder!
~OpenTelemetry.SimpleActivityExportProcessor.SimpleActivityExportProcessor(OpenTelemetry.BaseExporter<System.Diagnostics.Activity> exporter) -> void
OpenTelemetry.SimpleExportProcessor<T>
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.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
~static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> 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.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.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.Resources.ResourceBuilder.CreateDefault() -> 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.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.AddTelemetrySdk(this OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder!
static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
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.GetHistogramMin() -> double
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
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!

View File

@ -8,6 +8,11 @@
([#3760](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3760),
[#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
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 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;
foreach (var reader in state.Readers)

View File

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

View File

@ -15,19 +15,27 @@
// </copyright>
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using OpenTelemetry.Internal;
namespace OpenTelemetry.Resources
{
internal class OtelServiceNameEnvVarDetector : IResourceDetector
internal sealed class OtelServiceNameEnvVarDetector : IResourceDetector
{
public const string EnvVarKey = "OTEL_SERVICE_NAME";
private readonly IConfiguration configuration;
public OtelServiceNameEnvVarDetector(IConfiguration configuration)
{
this.configuration = configuration;
}
public Resource Detect()
{
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>
{

View File

@ -14,6 +14,9 @@
// limitations under the License.
// </copyright>
#nullable enable
using System;
using System.Collections.Generic;
using System.Diagnostics;
using OpenTelemetry.Internal;
@ -25,7 +28,8 @@ namespace OpenTelemetry.Resources
/// </summary>
public class ResourceBuilder
{
internal readonly List<Resource> Resources = new();
internal readonly List<IResourceDetector> ResourceDetectors = new();
private static readonly Resource DefaultResource;
static ResourceBuilder()
{
@ -54,7 +58,7 @@ namespace OpenTelemetry.Resources
{
}
private static Resource DefaultResource { get; }
internal IServiceProvider? ServiceProvider { get; set; }
/// <summary>
/// Creates a <see cref="ResourceBuilder"/> instance with Default
@ -83,7 +87,7 @@ namespace OpenTelemetry.Resources
/// <returns><see cref="ResourceBuilder"/> for chaining.</returns>
public ResourceBuilder Clear()
{
this.Resources.Clear();
this.ResourceDetectors.Clear();
return this;
}
@ -96,24 +100,55 @@ namespace OpenTelemetry.Resources
{
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;
}
/// <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)
{
Guard.ThrowIfNull(resourceDetector);
Resource resource = resourceDetector.Detect();
this.ResourceDetectors.Add(resourceDetector);
if (resource != null)
{
this.Resources.Add(resource);
}
return this;
}
/// <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;
}
@ -122,9 +157,47 @@ namespace OpenTelemetry.Resources
{
Guard.ThrowIfNull(resource);
this.Resources.Add(resource);
this.ResourceDetectors.Add(new WrapperResourceDetector(resource));
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.
// </copyright>
#nullable enable
using System;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Internal;
namespace OpenTelemetry.Resources
@ -49,10 +53,10 @@ namespace OpenTelemetry.Resources
public static ResourceBuilder AddService(
this ResourceBuilder resourceBuilder,
string serviceName,
string serviceNamespace = null,
string serviceVersion = null,
string? serviceNamespace = null,
string? serviceVersion = null,
bool autoGenerateServiceInstanceId = true,
string serviceInstanceId = null)
string? serviceInstanceId = null)
{
Dictionary<string, object> resourceAttributes = new Dictionary<string, object>();
@ -62,12 +66,12 @@ namespace OpenTelemetry.Resources
if (!string.IsNullOrEmpty(serviceNamespace))
{
resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceNamespace, serviceNamespace);
resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceNamespace, serviceNamespace!);
}
if (!string.IsNullOrEmpty(serviceVersion))
{
resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceVersion, serviceVersion);
resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceVersion, serviceVersion!);
}
if (serviceInstanceId == null && autoGenerateServiceInstanceId)
@ -117,7 +121,11 @@ namespace OpenTelemetry.Resources
/// <returns>Returns <see cref="ResourceBuilder"/> for chaining.</returns>
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()

View File

@ -66,7 +66,10 @@ namespace OpenTelemetry.Trace
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.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();
int configureInvocations = 0;
bool serviceProviderTestExecuted = false;
builder.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService("Test"));
builder.ConfigureResource(builder =>
{
configureInvocations++;
Assert.Single(builder.Resources);
Assert.Single(builder.ResourceDetectors);
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.ConfigureResource(builder =>
{
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;
Assert.True(serviceProviderTestExecuted);
Assert.Equal(2, configureInvocations);
Assert.Single(provider.Resource.Attributes);

View File

@ -16,6 +16,7 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using Xunit;
namespace OpenTelemetry.Resources.Tests
@ -43,7 +44,9 @@ namespace OpenTelemetry.Resources.Tests
public void OtelEnvResource_NullEnvVar()
{
// Arrange
var resource = new OtelEnvResourceDetector().Detect();
var resource = new OtelEnvResourceDetector(
new ConfigurationBuilder().AddEnvironmentVariables().Build())
.Detect();
// Assert
Assert.Equal(Resource.Empty, resource);
@ -55,7 +58,9 @@ namespace OpenTelemetry.Resources.Tests
// Arrange
var envVarValue = "Key1=Val1,Key2=Val2";
Environment.SetEnvironmentVariable(OtelEnvResourceDetector.EnvVarKey, envVarValue);
var resource = new OtelEnvResourceDetector().Detect();
var resource = new OtelEnvResourceDetector(
new ConfigurationBuilder().AddEnvironmentVariables().Build())
.Detect();
// Assert
Assert.NotEqual(Resource.Empty, resource);
@ -68,12 +73,33 @@ namespace OpenTelemetry.Resources.Tests
// Arrange
var envVarValue = "Key1,Key2=Val2";
Environment.SetEnvironmentVariable(OtelEnvResourceDetector.EnvVarKey, envVarValue);
var resource = new OtelEnvResourceDetector().Detect();
var resource = new OtelEnvResourceDetector(
new ConfigurationBuilder().AddEnvironmentVariables().Build())
.Detect();
// Assert
Assert.NotEqual(Resource.Empty, resource);
Assert.Single(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.Collections.Generic;
using Microsoft.Extensions.Configuration;
using Xunit;
namespace OpenTelemetry.Resources.Tests
@ -43,7 +44,9 @@ namespace OpenTelemetry.Resources.Tests
public void OtelServiceNameEnvVar_Null()
{
// Act
var resource = new OtelServiceNameEnvVarDetector().Detect();
var resource = new OtelServiceNameEnvVarDetector(
new ConfigurationBuilder().AddEnvironmentVariables().Build())
.Detect();
// Assert
Assert.Equal(Resource.Empty, resource);
@ -57,11 +60,31 @@ namespace OpenTelemetry.Resources.Tests
Environment.SetEnvironmentVariable(OtelServiceNameEnvVarDetector.EnvVarKey, envVarValue);
// Act
var resource = new OtelServiceNameEnvVarDetector().Detect();
var resource = new OtelServiceNameEnvVarDetector(
new ConfigurationBuilder().AddEnvironmentVariables().Build())
.Detect();
// Assert
Assert.NotEqual(Resource.Empty, resource);
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.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
namespace OpenTelemetry.Resources.Tests
@ -499,6 +500,45 @@ namespace OpenTelemetry.Resources.Tests
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()
{
Environment.SetEnvironmentVariable(OtelEnvResourceDetector.EnvVarKey, null);
@ -552,5 +592,10 @@ namespace OpenTelemetry.Resources.Tests
AddAttributes(attributes, attributeCount, startIndex);
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();
int configureInvocations = 0;
bool serviceProviderTestExecuted = false;
builder.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService("Test"));
builder.ConfigureResource(builder =>
{
configureInvocations++;
Assert.Single(builder.Resources);
Assert.Single(builder.ResourceDetectors);
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.ConfigureResource(builder =>
{
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;
Assert.True(serviceProviderTestExecuted);
Assert.Equal(2, configureInvocations);
Assert.Single(provider.Resource.Attributes);