ResourceBuilder API (#1533)

* Attempting to improve the Resource API.

* XML comment change.

* Updated Resource API based on feedback.

* CHANGELOG update.

* Tweaked variable name.

* CHANGELOG updates.

* Removed OtelEnvResourceDetector from default Resource. Fixed some XML comments.

* Past tense fix for CHANGELOG.

* CHANGELOG formatting.

* Removed the ability to change the environment variable name for OtelEnvResourceDetector.

* Updates for recent refactors.

* Code review.

* Example updates.

* Cleanup.

Co-authored-by: Cijo Thomas <cithomas@microsoft.com>
This commit is contained in:
Mikel Blanchard 2020-11-17 06:55:09 -08:00 committed by GitHub
parent 65762cd792
commit d24a042964
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 506 additions and 355 deletions

View File

@ -35,7 +35,7 @@ namespace Examples.Console
// and use a custom MyProcessor, along with Console exporter.
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("MyCompany.MyProduct.MyWebServer")
.SetResource(Resources.CreateServiceResource("MyServiceName"))
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MyServiceName"))
.AddProcessor(new MyProcessor()) // This must be added before ConsoleExporter
.AddConsoleExporter()
.Build();

View File

@ -34,7 +34,7 @@ namespace Examples.Console
using var openTelemetry = Sdk.CreateTracerProviderBuilder()
.AddHttpClientInstrumentation()
.SetResource(Resources.CreateServiceResource("http-service-example"))
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("http-service-example"))
.AddSource("http-client-test")
.AddConsoleExporter()
.Build();

View File

@ -28,7 +28,7 @@ namespace Examples.Console
// and use a single pipeline with a custom MyProcessor, and Console exporter.
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("MyCompany.MyProduct.MyWebServer")
.SetResource(Resources.CreateServiceResource("MyServiceName"))
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MyServiceName"))
.AddConsoleExporter()
.Build();

View File

@ -31,7 +31,7 @@ namespace Examples.Console
// and use Console exporter.
using var openTelemetry = Sdk.CreateTracerProviderBuilder()
.AddSource("MyCompany.MyProduct.MyWebServer")
.SetResource(Resources.CreateServiceResource("MyServiceName"))
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MyServiceName"))
.AddConsoleExporter()
.Build();

View File

@ -26,50 +26,6 @@ namespace OpenTelemetry.Trace
// https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/trace/semantic_conventions
// https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/semantic_conventions/exceptions.md
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
public const string AttributeServiceName = "service.name";
public const string AttributeServiceNamespace = "service.namespace";
public const string AttributeServiceInstance = "service.instance.id";
public const string AttributeServiceVersion = "service.version";
public const string AttributeTelemetrySdkName = "telemetry.sdk.name";
public const string AttributeTelemetrySdkLanguage = "telemetry.sdk.language";
public const string AttributeTelemetrySdkVersion = "telemetry.sdk.version";
public const string AttributeContainerName = "container.name";
public const string AttributeContainerImage = "container.image.name";
public const string AttributeContainerTag = "container.image.tag";
public const string AttributeFaasName = "faas.name";
public const string AttributeFaasId = "faas.id";
public const string AttributeFaasVersion = "faas.version";
public const string AttributeFaasInstance = "faas.instance";
public const string AttributeK8sCluster = "k8s.cluster.name";
public const string AttributeK8sNamespace = "k8s.namespace.name";
public const string AttributeK8sPod = "k8s.pod.name";
public const string AttributeK8sDeployment = "k8s.deployment.name";
public const string AttributeHostHostname = "host.hostname";
public const string AttributeHostId = "host.id";
public const string AttributeHostName = "host.name";
public const string AttributeHostType = "host.type";
public const string AttributeHostImageName = "host.image.name";
public const string AttributeHostImageId = "host.image.id";
public const string AttributeHostImageVersion = "host.image.version";
public const string AttributeProcessId = "process.id";
public const string AttributeProcessExecutableName = "process.executable.name";
public const string AttributeProcessExecutablePath = "process.executable.path";
public const string AttributeProcessCommand = "process.command";
public const string AttributeProcessCommandLine = "process.command_line";
public const string AttributeProcessUsername = "process.username";
public const string AttributeCloudProvider = "cloud.provider";
public const string AttributeCloudAccount = "cloud.account.id";
public const string AttributeCloudRegion = "cloud.region";
public const string AttributeCloudZone = "cloud.zone";
public const string AttributeComponent = "component";
public const string AttributeNetTransport = "net.transport";
public const string AttributeNetPeerIp = "net.peer.ip";
public const string AttributeNetPeerPort = "net.peer.port";

View File

@ -105,10 +105,10 @@ namespace OpenTelemetry.Exporter.Jaeger
{
switch (key)
{
case Resource.ServiceNameKey:
case ResourceSemanticConventions.AttributeServiceName:
serviceName = strVal;
continue;
case Resource.ServiceNamespaceKey:
case ResourceSemanticConventions.AttributeServiceNamespace:
serviceNamespace = strVal;
continue;
}

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net46;netstandard2.0;netstandard2.1</TargetFrameworks>
@ -18,7 +18,8 @@
<Compile Include="$(RepoRoot)\src\OpenTelemetry.Api\Internal\IActivityEnumerator.cs" Link="Includes\IActivityEnumerator.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry.Api\Internal\EnumerationHelper.cs" Link="Includes\EnumerationHelper.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PooledList.cs" Link="Includes\PooledList.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Exporter\PeerServiceResolver.cs" Link="Includes\PeerServiceResolver.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PeerServiceResolver.cs" Link="Includes\PeerServiceResolver.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\ResourceSemanticConventions.cs" Link="Includes\ResourceSemanticConventions.cs" />
</ItemGroup>
<ItemGroup>

View File

@ -18,7 +18,8 @@
<Compile Include="$(RepoRoot)\src\OpenTelemetry.Api\Internal\IActivityEnumerator.cs" Link="Includes\IActivityEnumerator.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry.Api\Internal\EnumerationHelper.cs" Link="Includes\EnumerationHelper.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PooledList.cs" Link="Includes\PooledList.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Exporter\PeerServiceResolver.cs" Link="Includes\PeerServiceResolver.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PeerServiceResolver.cs" Link="Includes\PeerServiceResolver.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\ResourceSemanticConventions.cs" Link="Includes\ResourceSemanticConventions.cs" />
</ItemGroup>
<ItemGroup>

View File

@ -104,7 +104,7 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol
}
}
if (!processResource.Attributes.Any(kvp => kvp.Key == Resource.ServiceNameKey))
if (!processResource.Attributes.Any(kvp => kvp.Key == ResourceSemanticConventions.AttributeServiceName))
{
string serviceName = this.options.ServiceName;
if (string.IsNullOrEmpty(serviceName))
@ -114,7 +114,7 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol
processResource.Attributes.Add(new OtlpCommon.KeyValue
{
Key = Resource.ServiceNameKey,
Key = ResourceSemanticConventions.AttributeServiceName,
Value = new OtlpCommon.AnyValue { StringValue = serviceName },
});
}

View File

@ -13,7 +13,8 @@
<Compile Include="$(RepoRoot)\src\OpenTelemetry.Api\Internal\IActivityEnumerator.cs" Link="Includes\IActivityEnumerator.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry.Api\Internal\EnumerationHelper.cs" Link="Includes\EnumerationHelper.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PooledList.cs" Link="Includes\PooledList.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Exporter\PeerServiceResolver.cs" Link="Includes\PeerServiceResolver.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PeerServiceResolver.cs" Link="Includes\PeerServiceResolver.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\ResourceSemanticConventions.cs" Link="Includes\ResourceSemanticConventions.cs" />
</ItemGroup>
<ItemGroup>

View File

@ -115,7 +115,7 @@ namespace OpenTelemetry.Exporter.Zipkin
switch (key)
{
case Resource.ServiceNameKey:
case ResourceSemanticConventions.AttributeServiceName:
serviceName = label.Value as string;
continue;
}

View File

@ -126,7 +126,11 @@ OpenTelemetry.Resources.Resource
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.Resources
OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.AddResource(OpenTelemetry.Resources.Resource resource) -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource
OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.ResourceBuilderExtensions
OpenTelemetry.Sdk
OpenTelemetry.SimpleExportProcessor<T>
OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T> exporter) -> void
@ -176,10 +180,6 @@ abstract OpenTelemetry.Metrics.Export.MetricExporter.ExportAsync(System.Collecti
abstract OpenTelemetry.Metrics.Export.MetricProcessor.FinishCollectionCycle(out System.Collections.Generic.IEnumerable<OpenTelemetry.Metrics.Export.Metric> metrics) -> void
abstract OpenTelemetry.Metrics.Export.MetricProcessor.Process(OpenTelemetry.Metrics.Export.Metric metric) -> void
abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult
const OpenTelemetry.Resources.Resource.ServiceInstanceIdKey = "service.instance.id" -> string
const OpenTelemetry.Resources.Resource.ServiceNameKey = "service.name" -> string
const OpenTelemetry.Resources.Resource.ServiceNamespaceKey = "service.namespace" -> string
const OpenTelemetry.Resources.Resource.ServiceVersionKey = "service.version" -> string
override OpenTelemetry.BaseExportProcessor<T>.Dispose(bool disposing) -> void
override OpenTelemetry.BaseExportProcessor<T>.OnShutdown(int timeoutMilliseconds) -> bool
override OpenTelemetry.BatchExportProcessor<T>.OnEnd(T data) -> void
@ -227,8 +227,13 @@ override abstract OpenTelemetry.BaseExportProcessor<T>.OnEnd(T data) -> void
override sealed OpenTelemetry.BaseExportProcessor<T>.OnStart(T data) -> void
readonly OpenTelemetry.BaseExportProcessor<T>.exporter -> OpenTelemetry.BaseExporter<T>
static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
static OpenTelemetry.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
static OpenTelemetry.Resources.Resources.CreateServiceResource(string serviceName, string serviceInstanceId = null, string serviceNamespace = null, string serviceVersion = null) -> OpenTelemetry.Resources.Resource
static OpenTelemetry.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.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.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.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator textMapPropagator) -> void
@ -239,7 +244,7 @@ static OpenTelemetry.Trace.SamplingResult.operator !=(OpenTelemetry.Trace.Sampli
static OpenTelemetry.Trace.SamplingResult.operator ==(OpenTelemetry.Trace.SamplingResult decision1, OpenTelemetry.Trace.SamplingResult decision2) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.Resource resource) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProvider
static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool

View File

@ -126,7 +126,11 @@ OpenTelemetry.Resources.Resource
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.Resources
OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.AddResource(OpenTelemetry.Resources.Resource resource) -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource
OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.ResourceBuilderExtensions
OpenTelemetry.Sdk
OpenTelemetry.SimpleExportProcessor<T>
OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T> exporter) -> void
@ -176,10 +180,6 @@ abstract OpenTelemetry.Metrics.Export.MetricExporter.ExportAsync(System.Collecti
abstract OpenTelemetry.Metrics.Export.MetricProcessor.FinishCollectionCycle(out System.Collections.Generic.IEnumerable<OpenTelemetry.Metrics.Export.Metric> metrics) -> void
abstract OpenTelemetry.Metrics.Export.MetricProcessor.Process(OpenTelemetry.Metrics.Export.Metric metric) -> void
abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult
const OpenTelemetry.Resources.Resource.ServiceInstanceIdKey = "service.instance.id" -> string
const OpenTelemetry.Resources.Resource.ServiceNameKey = "service.name" -> string
const OpenTelemetry.Resources.Resource.ServiceNamespaceKey = "service.namespace" -> string
const OpenTelemetry.Resources.Resource.ServiceVersionKey = "service.version" -> string
override OpenTelemetry.BaseExportProcessor<T>.Dispose(bool disposing) -> void
override OpenTelemetry.BaseExportProcessor<T>.OnShutdown(int timeoutMilliseconds) -> bool
override OpenTelemetry.BatchExportProcessor<T>.OnEnd(T data) -> void
@ -227,8 +227,13 @@ override abstract OpenTelemetry.BaseExportProcessor<T>.OnEnd(T data) -> void
override sealed OpenTelemetry.BaseExportProcessor<T>.OnStart(T data) -> void
readonly OpenTelemetry.BaseExportProcessor<T>.exporter -> OpenTelemetry.BaseExporter<T>
static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
static OpenTelemetry.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
static OpenTelemetry.Resources.Resources.CreateServiceResource(string serviceName, string serviceInstanceId = null, string serviceNamespace = null, string serviceVersion = null) -> OpenTelemetry.Resources.Resource
static OpenTelemetry.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.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.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.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator textMapPropagator) -> void
@ -237,11 +242,11 @@ static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> Sy
static OpenTelemetry.SuppressInstrumentationScope.Enter() -> int
static OpenTelemetry.Trace.SamplingResult.operator !=(OpenTelemetry.Trace.SamplingResult decision1, OpenTelemetry.Trace.SamplingResult decision2) -> bool
static OpenTelemetry.Trace.SamplingResult.operator ==(OpenTelemetry.Trace.SamplingResult decision1, OpenTelemetry.Trace.SamplingResult decision2) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProvider
static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.Resource resource) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder
virtual OpenTelemetry.BaseExporter<T>.Dispose(bool disposing) -> void
virtual OpenTelemetry.BaseExporter<T>.OnShutdown(int timeoutMilliseconds) -> bool

View File

@ -145,7 +145,11 @@ OpenTelemetry.Resources.Resource
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.Resources
OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.AddResource(OpenTelemetry.Resources.Resource resource) -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource
OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.ResourceBuilderExtensions
OpenTelemetry.Sdk
OpenTelemetry.SimpleExportProcessor<T>
OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T> exporter) -> void
@ -195,10 +199,6 @@ abstract OpenTelemetry.Metrics.Export.MetricExporter.ExportAsync(System.Collecti
abstract OpenTelemetry.Metrics.Export.MetricProcessor.FinishCollectionCycle(out System.Collections.Generic.IEnumerable<OpenTelemetry.Metrics.Export.Metric> metrics) -> void
abstract OpenTelemetry.Metrics.Export.MetricProcessor.Process(OpenTelemetry.Metrics.Export.Metric metric) -> void
abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult
const OpenTelemetry.Resources.Resource.ServiceInstanceIdKey = "service.instance.id" -> string
const OpenTelemetry.Resources.Resource.ServiceNameKey = "service.name" -> string
const OpenTelemetry.Resources.Resource.ServiceNamespaceKey = "service.namespace" -> string
const OpenTelemetry.Resources.Resource.ServiceVersionKey = "service.version" -> string
override OpenTelemetry.BaseExportProcessor<T>.Dispose(bool disposing) -> void
override OpenTelemetry.BaseExportProcessor<T>.OnShutdown(int timeoutMilliseconds) -> bool
override OpenTelemetry.BatchExportProcessor<T>.OnEnd(T data) -> void
@ -247,8 +247,13 @@ override sealed OpenTelemetry.BaseExportProcessor<T>.OnStart(T data) -> void
readonly OpenTelemetry.BaseExportProcessor<T>.exporter -> OpenTelemetry.BaseExporter<T>
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder builder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions> configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder
static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
static OpenTelemetry.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
static OpenTelemetry.Resources.Resources.CreateServiceResource(string serviceName, string serviceInstanceId = null, string serviceNamespace = null, string serviceVersion = null) -> OpenTelemetry.Resources.Resource
static OpenTelemetry.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.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.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.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator textMapPropagator) -> void
@ -257,11 +262,11 @@ static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> Sy
static OpenTelemetry.SuppressInstrumentationScope.Enter() -> int
static OpenTelemetry.Trace.SamplingResult.operator !=(OpenTelemetry.Trace.SamplingResult decision1, OpenTelemetry.Trace.SamplingResult decision2) -> bool
static OpenTelemetry.Trace.SamplingResult.operator ==(OpenTelemetry.Trace.SamplingResult decision1, OpenTelemetry.Trace.SamplingResult decision2) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProvider
static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.Resource resource) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder
virtual OpenTelemetry.BaseExporter<T>.Dispose(bool disposing) -> void
virtual OpenTelemetry.BaseExporter<T>.OnShutdown(int timeoutMilliseconds) -> bool

View File

@ -145,7 +145,11 @@ OpenTelemetry.Resources.Resource
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.Resources
OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.AddResource(OpenTelemetry.Resources.Resource resource) -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.Resources.ResourceBuilder.Build() -> OpenTelemetry.Resources.Resource
OpenTelemetry.Resources.ResourceBuilder.Clear() -> OpenTelemetry.Resources.ResourceBuilder
OpenTelemetry.ResourceBuilderExtensions
OpenTelemetry.Sdk
OpenTelemetry.SimpleExportProcessor<T>
OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseExporter<T> exporter) -> void
@ -195,10 +199,6 @@ abstract OpenTelemetry.Metrics.Export.MetricExporter.ExportAsync(System.Collecti
abstract OpenTelemetry.Metrics.Export.MetricProcessor.FinishCollectionCycle(out System.Collections.Generic.IEnumerable<OpenTelemetry.Metrics.Export.Metric> metrics) -> void
abstract OpenTelemetry.Metrics.Export.MetricProcessor.Process(OpenTelemetry.Metrics.Export.Metric metric) -> void
abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult
const OpenTelemetry.Resources.Resource.ServiceInstanceIdKey = "service.instance.id" -> string
const OpenTelemetry.Resources.Resource.ServiceNameKey = "service.name" -> string
const OpenTelemetry.Resources.Resource.ServiceNamespaceKey = "service.namespace" -> string
const OpenTelemetry.Resources.Resource.ServiceVersionKey = "service.version" -> string
override OpenTelemetry.BaseExportProcessor<T>.Dispose(bool disposing) -> void
override OpenTelemetry.BaseExportProcessor<T>.OnShutdown(int timeoutMilliseconds) -> bool
override OpenTelemetry.BatchExportProcessor<T>.OnEnd(T data) -> void
@ -247,8 +247,13 @@ override sealed OpenTelemetry.BaseExportProcessor<T>.OnStart(T data) -> void
readonly OpenTelemetry.BaseExportProcessor<T>.exporter -> OpenTelemetry.BaseExporter<T>
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder builder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions> configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder
static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource
static OpenTelemetry.ResourceBuilderExtensions.AddEnvironmentVariableDetector(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.Resources.Resource.Empty.get -> OpenTelemetry.Resources.Resource
static OpenTelemetry.Resources.Resources.CreateServiceResource(string serviceName, string serviceInstanceId = null, string serviceNamespace = null, string serviceVersion = null) -> OpenTelemetry.Resources.Resource
static OpenTelemetry.ResourceBuilderExtensions.AddAttributes(this OpenTelemetry.Resources.ResourceBuilder resourceBuilder, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> OpenTelemetry.Resources.ResourceBuilder
static OpenTelemetry.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.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.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.MeterProviderBuilder
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator textMapPropagator) -> void
@ -257,11 +262,11 @@ static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> Sy
static OpenTelemetry.SuppressInstrumentationScope.Enter() -> int
static OpenTelemetry.Trace.SamplingResult.operator !=(OpenTelemetry.Trace.SamplingResult decision1, OpenTelemetry.Trace.SamplingResult decision2) -> bool
static OpenTelemetry.Trace.SamplingResult.operator ==(OpenTelemetry.Trace.SamplingResult decision1, OpenTelemetry.Trace.SamplingResult decision2) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProvider
static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.Resource resource) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder
virtual OpenTelemetry.BaseExporter<T>.Dispose(bool disposing) -> void
virtual OpenTelemetry.BaseExporter<T>.OnShutdown(int timeoutMilliseconds) -> bool

View File

@ -10,12 +10,25 @@
* `Resource` is no longer added to observed `Activity` objects as a
`CustomProperty`.
([#1463](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1463))
* Remove RentrantExportProcessor as it is not required by spec.
* Removed `RentrantExportProcessor` as it is not required by spec.
* `ActivitySourceAdapter` supports setting `ActivitySource` for Activities
created without `ActivitySource`.
([#1515](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1515/))
* Implemented Shutdown for TracerProvider
([#1489](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1489))
* Implemented `Shutdown` for `TracerProvider`.
([#1489](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1489))
* `Resources.CreateServiceResource` has been removed in
favor of the `ResourceBuilder` API.
([#1533](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1533))
* `TracerProviderBuilder.SetResource` has been changed to
`TracerProviderBuilder.SetResourceBuilder`.
([#1533](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1533))
* By default `TracerProvider` will set a `Resource` containing [Telemetry
SDK](https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/resource/semantic_conventions#telemetry-sdk)
details
([#1533](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1533)):
* `telemetry.sdk.name` = `opentelemetry`
* `telemetry.sdk.language` = `dotnet`
* `telemetry.sdk.version` = [SDK version]
## 0.8.0-beta.1
@ -24,7 +37,6 @@ Released 2020-Nov-5
* TracerProviderBuilder API changes Renamed AddInstrumentation to
AddDiagnosticSourceInstrumentation and made internal. Added AddInstrumentation
([#1454](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1454))
* DiagnosticSource subscription helper classes (DiagnosticSourceSubscriber,
ListenerHandler,PropertyFetcher) are made internal.

View File

@ -0,0 +1,65 @@
// <copyright file="ResourceSemanticConventions.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>
namespace OpenTelemetry.Resources
{
internal static class ResourceSemanticConventions
{
public const string AttributeServiceName = "service.name";
public const string AttributeServiceNamespace = "service.namespace";
public const string AttributeServiceInstance = "service.instance.id";
public const string AttributeServiceVersion = "service.version";
public const string AttributeTelemetrySdkName = "telemetry.sdk.name";
public const string AttributeTelemetrySdkLanguage = "telemetry.sdk.language";
public const string AttributeTelemetrySdkVersion = "telemetry.sdk.version";
public const string AttributeContainerName = "container.name";
public const string AttributeContainerImage = "container.image.name";
public const string AttributeContainerTag = "container.image.tag";
public const string AttributeFaasName = "faas.name";
public const string AttributeFaasId = "faas.id";
public const string AttributeFaasVersion = "faas.version";
public const string AttributeFaasInstance = "faas.instance";
public const string AttributeK8sCluster = "k8s.cluster.name";
public const string AttributeK8sNamespace = "k8s.namespace.name";
public const string AttributeK8sPod = "k8s.pod.name";
public const string AttributeK8sDeployment = "k8s.deployment.name";
public const string AttributeHostHostname = "host.hostname";
public const string AttributeHostId = "host.id";
public const string AttributeHostName = "host.name";
public const string AttributeHostType = "host.type";
public const string AttributeHostImageName = "host.image.name";
public const string AttributeHostImageId = "host.image.id";
public const string AttributeHostImageVersion = "host.image.version";
public const string AttributeProcessId = "process.id";
public const string AttributeProcessExecutableName = "process.executable.name";
public const string AttributeProcessExecutablePath = "process.executable.path";
public const string AttributeProcessCommand = "process.command";
public const string AttributeProcessCommandLine = "process.command_line";
public const string AttributeProcessUsername = "process.username";
public const string AttributeCloudProvider = "cloud.provider";
public const string AttributeCloudAccount = "cloud.account.id";
public const string AttributeCloudRegion = "cloud.region";
public const string AttributeCloudZone = "cloud.zone";
public const string AttributeComponent = "component";
}
}

View File

@ -14,7 +14,6 @@
// limitations under the License.
// </copyright>
using System;
using System.Collections.Generic;
using System.Linq;
using OpenTelemetry.Internal;
@ -27,22 +26,12 @@ namespace OpenTelemetry.Resources
/// </summary>
public class Resource
{
public const string ServiceNameKey = "service.name";
public const string ServiceNamespaceKey = "service.namespace";
public const string ServiceInstanceIdKey = "service.instance.id";
public const string ServiceVersionKey = "service.version";
private const string TelemetrySdkNameKey = "telemetry.sdk.name";
private const string TelemetrySdkLanguageKey = "telemetry.sdk.language";
private const string TelemetrySdkVersionKey = "telemetry.sdk.version";
private static readonly Version Version = typeof(Resource).Assembly.GetName().Version;
// this implementation follows https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/resource/sdk.md
/// <summary>
/// Initializes a new instance of the <see cref="Resource"/> class.
/// </summary>
/// <param name="attributes">An <see cref="IDictionary{String, Object}"/> of attributes that describe the resource.</param>
/// <param name="attributes">An <see cref="IEnumerable{T}"/> of attributes that describe the resource.</param>
public Resource(IEnumerable<KeyValuePair<string, object>> attributes)
{
if (attributes == null)
@ -66,13 +55,6 @@ namespace OpenTelemetry.Resources
/// </summary>
public IEnumerable<KeyValuePair<string, object>> Attributes { get; }
private static Resource TelemetryResource { get; } = new Resource(new List<KeyValuePair<string, object>>
{
new KeyValuePair<string, object>(TelemetrySdkNameKey, "opentelemetry"),
new KeyValuePair<string, object>(TelemetrySdkLanguageKey, "dotnet"),
new KeyValuePair<string, object>(TelemetrySdkVersionKey, Version.ToString()),
});
/// <summary>
/// Returns a new, merged <see cref="Resource"/> by merging the current <see cref="Resource"/> with the.
/// <code>other</code> <see cref="Resource"/>. In case of a collision the current <see cref="Resource"/> takes precedence.
@ -105,36 +87,9 @@ namespace OpenTelemetry.Resources
return new Resource(newAttributes);
}
/// <summary>
/// Returns a new <see cref="Resource"/> with added attributes from telemetry sdk and the <see cref="OtelEnvResourceDetector"/>.
/// </summary>
/// <returns><see cref="Resource"/>.</returns>
internal Resource GetResourceWithDefaultAttributes()
{
return this.Merge(TelemetryResource).Merge(new OtelEnvResourceDetector().Detect());
}
/// <summary>
/// Returns a new <see cref="Resource"/> with added attributes from resource detectors in the order of the list.
/// </summary>
/// <param name="detectors">A list of <see cref="IResourceDetector"/>.</param>
/// <returns><see cref="Resource"/>.</returns>
internal Resource GetResourceFromDetectors(List<IResourceDetector> detectors)
{
var resource = this;
foreach (IResourceDetector detector in detectors)
{
resource = resource.Merge(detector.Detect());
}
return resource;
}
private static KeyValuePair<string, object> SanitizeAttribute(KeyValuePair<string, object> attribute)
{
string sanitizedKey = null;
object sanitizedValue = null;
string sanitizedKey;
if (attribute.Key == null)
{
OpenTelemetrySdkEventSource.Log.InvalidArgument("Create resource", "attribute key", "Attribute key should be non-null string.");
@ -145,6 +100,7 @@ namespace OpenTelemetry.Resources
sanitizedKey = attribute.Key;
}
object sanitizedValue;
if (!IsValidValue(attribute.Value))
{
OpenTelemetrySdkEventSource.Log.InvalidArgument("Create resource", "attribute value", "Attribute value should be a non-null string, long, bool or double.");

View File

@ -0,0 +1,111 @@
// <copyright file="ResourceBuilder.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.Collections.Generic;
namespace OpenTelemetry.Resources
{
/// <summary>
/// Contains methods for building <see cref="Resource"/> instances.
/// </summary>
public class ResourceBuilder
{
private readonly List<Resource> resources = new List<Resource>();
private ResourceBuilder()
{
}
/// <summary>
/// Creates a <see cref="ResourceBuilder"/> instance with SDK defaults
/// added. See <a
/// href="https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/resource/semantic_conventions/">resource
/// semantic conventions</a> for details.
/// </summary>
/// <returns>Created <see cref="ResourceBuilder"/>.</returns>
public static ResourceBuilder CreateDefault()
=> new ResourceBuilder().AddTelemetrySdk(); // TODO: Seek spec clarify on whether or not OtelEnvResourceDetector should be added by default.
/// <summary>
/// Creates an empty <see cref="ResourceBuilder"/> instance.
/// </summary>
/// <returns>Created <see cref="ResourceBuilder"/>.</returns>
public static ResourceBuilder CreateEmpty()
=> new ResourceBuilder();
/// <summary>
/// Add a <see cref="Resource"/> to the builder.
/// </summary>
/// <param name="resource"><see cref="Resource"/>.</param>
/// <returns><see cref="ResourceBuilder"/> for chaining.</returns>
public ResourceBuilder AddResource(Resource resource)
{
if (resource == null)
{
throw new ArgumentNullException(nameof(resource));
}
this.resources.Add(resource);
return this;
}
/// <summary>
/// Clears the <see cref="Resource"/>s added to the builder.
/// </summary>
/// <returns><see cref="ResourceBuilder"/> for chaining.</returns>
public ResourceBuilder Clear()
{
this.resources.Clear();
return this;
}
/// <summary>
/// Build a merged <see cref="Resource"/> from all the <see cref="Resource"/>s added to the builder.
/// </summary>
/// <returns><see cref="Resource"/>.</returns>
public Resource Build()
{
Resource finalResource = Resource.Empty;
foreach (Resource resource in this.resources)
{
finalResource = finalResource.Merge(resource);
}
return finalResource;
}
internal ResourceBuilder AddDetector(IResourceDetector resourceDetector)
{
if (resourceDetector == null)
{
throw new ArgumentNullException(nameof(resourceDetector));
}
Resource resource = resourceDetector.Detect();
if (resource != null)
{
this.resources.Add(resource);
}
return this;
}
}
}

View File

@ -0,0 +1,127 @@
// <copyright file="ResourceBuilderExtensions.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.Collections.Generic;
using OpenTelemetry.Resources;
namespace OpenTelemetry
{
/// <summary>
/// Contains extension methods for building <see cref="Resource"/>s.
/// </summary>
public static class ResourceBuilderExtensions
{
private static readonly Version Version = typeof(Resource).Assembly.GetName().Version;
private static Resource TelemetryResource { get; } = new Resource(new Dictionary<string, object>
{
[ResourceSemanticConventions.AttributeTelemetrySdkName] = "opentelemetry",
[ResourceSemanticConventions.AttributeTelemetrySdkLanguage] = "dotnet",
[ResourceSemanticConventions.AttributeTelemetrySdkVersion] = Version.ToString(),
});
/// <summary>
/// Adds service information to a <see cref="ResourceBuilder"/>
/// following <a
/// href="https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/resource/semantic_conventions#service">semantic
/// conventions</a>.
/// </summary>
/// <param name="resourceBuilder"><see cref="ResourceBuilder"/>.</param>
/// <param name="serviceName">Name of the service.</param>
/// <param name="serviceNamespace">Optional namespace of the service.</param>
/// <param name="serviceVersion">Optional version of the service.</param>
/// <param name="autoGenerateServiceInstanceId">Specify <see langword="true"/> to automatically generate a <see cref="Guid"/> for <paramref name="serviceInstanceId"/> if not supplied.</param>
/// <param name="serviceInstanceId">Optional unique identifier of the service instance.</param>
/// <returns>Returns <see cref="ResourceBuilder"/> for chaining.</returns>
public static ResourceBuilder AddService(
this ResourceBuilder resourceBuilder,
string serviceName,
string serviceNamespace = null,
string serviceVersion = null,
bool autoGenerateServiceInstanceId = true,
string serviceInstanceId = null)
{
Dictionary<string, object> resourceAttributes = new Dictionary<string, object>();
if (string.IsNullOrEmpty(serviceName))
{
throw new ArgumentNullException(nameof(serviceName));
}
resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceName, serviceName);
if (!string.IsNullOrEmpty(serviceNamespace))
{
resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceNamespace, serviceNamespace);
}
if (!string.IsNullOrEmpty(serviceVersion))
{
resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceVersion, serviceVersion);
}
if (serviceInstanceId == null && autoGenerateServiceInstanceId)
{
serviceInstanceId = Guid.NewGuid().ToString();
}
if (serviceInstanceId != null)
{
resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceInstance, serviceInstanceId);
}
return resourceBuilder.AddResource(new Resource(resourceAttributes));
}
/// <summary>
/// Adds service information to a <see cref="ResourceBuilder"/>
/// following <a
/// href="https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/resource/semantic_conventions#telemetry-sdk">semantic
/// conventions</a>.
/// </summary>
/// <param name="resourceBuilder"><see cref="ResourceBuilder"/>.</param>
/// <returns>Returns <see cref="ResourceBuilder"/> for chaining.</returns>
public static ResourceBuilder AddTelemetrySdk(this ResourceBuilder resourceBuilder)
{
return resourceBuilder.AddResource(TelemetryResource);
}
/// <summary>
/// Adds attributes to a <see cref="ResourceBuilder"/>.
/// </summary>
/// <param name="resourceBuilder"><see cref="ResourceBuilder"/>.</param>
/// <param name="attributes">An <see cref="IEnumerable{T}"/> of attributes that describe the resource.</param>
/// <returns>Returns <see cref="ResourceBuilder"/> for chaining.</returns>
public static ResourceBuilder AddAttributes(this ResourceBuilder resourceBuilder, IEnumerable<KeyValuePair<string, object>> attributes)
{
return resourceBuilder.AddResource(new Resource(attributes));
}
/// <summary>
/// Adds resource attributes parsed from an environment variable to a
/// <see cref="ResourceBuilder"/> following the <a
/// href="https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/resource/sdk.md#specifying-resource-information-via-an-environment-variable">Resource
/// SDK</a>.
/// </summary>
/// <param name="resourceBuilder"><see cref="ResourceBuilder"/>.</param>
/// <returns>Returns <see cref="ResourceBuilder"/> for chaining.</returns>
public static ResourceBuilder AddEnvironmentVariableDetector(this ResourceBuilder resourceBuilder)
{
return resourceBuilder.AddDetector(new OtelEnvResourceDetector());
}
}
}

View File

@ -1,64 +0,0 @@
// <copyright file="Resources.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.Collections.Generic;
using OpenTelemetry.Internal;
namespace OpenTelemetry.Resources
{
public static class Resources
{
/// <summary>
/// Creates a new <see cref="Resource"/> from service information following standard convention
/// https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-resource-semantic-conventions.md#service.
/// </summary>
/// <param name="serviceName">Name of the service.</param>
/// <param name="serviceInstanceId">Unique identifier of the service instance.</param>
/// <param name="serviceNamespace">Optional namespace of the service.</param>
/// <param name="serviceVersion">Optional version of the service.</param>
/// <returns>Returns a new <see cref="Resource"/>.</returns>
public static Resource CreateServiceResource(string serviceName, string serviceInstanceId = null, string serviceNamespace = null, string serviceVersion = null)
{
if (serviceName == null)
{
OpenTelemetrySdkEventSource.Log.InvalidArgument("Create service resource", "serviceName", "is null");
return Resource.Empty.GetResourceWithDefaultAttributes();
}
var attributes = new List<KeyValuePair<string, object>> { new KeyValuePair<string, object>(Resource.ServiceNameKey, serviceName), };
if (serviceInstanceId == null)
{
serviceInstanceId = Guid.NewGuid().ToString();
}
attributes.Add(new KeyValuePair<string, object>(Resource.ServiceInstanceIdKey, serviceInstanceId));
if (serviceNamespace != null)
{
attributes.Add(new KeyValuePair<string, object>(Resource.ServiceNamespaceKey, serviceNamespace));
}
if (serviceVersion != null)
{
attributes.Add(new KeyValuePair<string, object>(Resource.ServiceVersionKey, serviceVersion));
}
return new Resource(attributes).GetResourceWithDefaultAttributes();
}
}
}

View File

@ -42,13 +42,13 @@ namespace OpenTelemetry.Trace
/// Sets the <see cref="Resource"/> describing the app associated with all traces. Overwrites currently set resource.
/// </summary>
/// <param name="tracerProviderBuilder">TracerProviderBuilder instance.</param>
/// <param name="resource">Resource to be associate with all traces.</param>
/// <param name="resourceBuilder"><see cref="ResourceBuilder"/> to be associate with all traces.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder SetResource(this TracerProviderBuilder tracerProviderBuilder, Resource resource)
public static TracerProviderBuilder SetResourceBuilder(this TracerProviderBuilder tracerProviderBuilder, ResourceBuilder resourceBuilder)
{
if (tracerProviderBuilder is TracerProviderBuilderSdk tracerProviderBuilderSdk)
{
tracerProviderBuilderSdk.SetResource(resource);
tracerProviderBuilderSdk.SetResourceBuilder(resourceBuilder);
}
return tracerProviderBuilder;

View File

@ -13,6 +13,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
using System;
using System.Collections.Generic;
using System.Diagnostics;
@ -30,7 +31,7 @@ namespace OpenTelemetry.Trace
private readonly List<BaseProcessor<Activity>> processors = new List<BaseProcessor<Activity>>();
private readonly List<string> sources = new List<string>();
private Resource resource = Resource.Empty.GetResourceWithDefaultAttributes();
private ResourceBuilder resourceBuilder = ResourceBuilder.CreateDefault();
private Sampler sampler = new ParentBasedSampler(new AlwaysOnSampler());
internal TracerProviderBuilderSdk()
@ -95,28 +96,18 @@ namespace OpenTelemetry.Trace
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
internal TracerProviderBuilder SetSampler(Sampler sampler)
{
if (sampler == null)
{
throw new ArgumentNullException(nameof(sampler));
}
this.sampler = sampler;
this.sampler = sampler ?? throw new ArgumentNullException(nameof(sampler));
return this;
}
/// <summary>
/// Sets the <see cref="Resource"/> describing the app associated with all traces. Overwrites currently set resource.
/// </summary>
/// <param name="resource">Resource to be associate with all traces.</param>
/// <param name="resourceBuilder"><see cref="ResourceBuilder"/> to be associate with all traces.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
internal TracerProviderBuilder SetResource(Resource resource)
internal TracerProviderBuilder SetResourceBuilder(ResourceBuilder resourceBuilder)
{
if (resource == null)
{
throw new ArgumentNullException(nameof(resource));
}
this.resource = resource;
this.resourceBuilder = resourceBuilder ?? throw new ArgumentNullException(nameof(resourceBuilder));
return this;
}
@ -139,7 +130,13 @@ namespace OpenTelemetry.Trace
internal TracerProvider Build()
{
return new TracerProviderSdk(this.resource, this.sources, this.diagnosticSourceInstrumentationFactories, this.instrumentationFactories, this.sampler, this.processors);
return new TracerProviderSdk(
this.resourceBuilder.Build(),
this.sources,
this.diagnosticSourceInstrumentationFactories,
this.instrumentationFactories,
this.sampler,
this.processors);
}
/// <summary>

View File

@ -30,7 +30,7 @@ namespace Benchmarks.Instrumentation
public class InstrumentedHttpClientBenchmark
{
private const string ActivityName = "incoming request";
private const string ResourceName = "http-service-example";
private const string ServiceName = "http-service-example";
private const string SourceName = "http-client-test";
private HttpClient httpClient;
@ -53,7 +53,7 @@ namespace Benchmarks.Instrumentation
this.tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddHttpClientInstrumentation()
.SetResource(Resources.CreateServiceResource(ResourceName))
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(ServiceName))
.AddSource(SourceName)
.Build();

View File

@ -57,11 +57,11 @@ namespace OpenTelemetry.Exporter.Jaeger.Tests
Assert.Equal("TestService", process.ServiceName);
jaegerTraceExporter.SetResource(Resources.Resources.CreateServiceResource("MyService"));
jaegerTraceExporter.SetResource(ResourceBuilder.CreateEmpty().AddService("MyService").Build());
Assert.Equal("MyService", process.ServiceName);
jaegerTraceExporter.SetResource(Resources.Resources.CreateServiceResource("MyService", serviceNamespace: "MyNamespace"));
jaegerTraceExporter.SetResource(ResourceBuilder.CreateEmpty().AddService("MyService", "MyNamespace").Build());
Assert.Equal("MyNamespace.MyService", process.ServiceName);
}
@ -109,8 +109,8 @@ namespace OpenTelemetry.Exporter.Jaeger.Tests
jaegerTraceExporter.SetResource(new Resource(new Dictionary<string, object>
{
[Resource.ServiceNameKey] = "servicename",
[Resource.ServiceNamespaceKey] = "servicenamespace",
[ResourceSemanticConventions.AttributeServiceName] = "servicename",
[ResourceSemanticConventions.AttributeServiceNamespace] = "servicenamespace",
}));
Assert.Null(process.Tags);

View File

@ -83,8 +83,8 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests
new Resources.Resource(
new List<KeyValuePair<string, object>>
{
new KeyValuePair<string, object>(Resources.Resource.ServiceNameKey, "service-name"),
new KeyValuePair<string, object>(Resources.Resource.ServiceNamespaceKey, "ns1"),
new KeyValuePair<string, object>(Resources.ResourceSemanticConventions.AttributeServiceName, "service-name"),
new KeyValuePair<string, object>(Resources.ResourceSemanticConventions.AttributeServiceNamespace, "ns1"),
}));
}
else
@ -124,12 +124,12 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests
var oltpResource = request.ResourceSpans.First().Resource;
if (addResource)
{
Assert.Contains(oltpResource.Attributes, (kvp) => kvp.Key == Resources.Resource.ServiceNameKey && kvp.Value.StringValue == "service-name");
Assert.Contains(oltpResource.Attributes, (kvp) => kvp.Key == Resources.Resource.ServiceNamespaceKey && kvp.Value.StringValue == "ns1");
Assert.Contains(oltpResource.Attributes, (kvp) => kvp.Key == Resources.ResourceSemanticConventions.AttributeServiceName && kvp.Value.StringValue == "service-name");
Assert.Contains(oltpResource.Attributes, (kvp) => kvp.Key == Resources.ResourceSemanticConventions.AttributeServiceNamespace && kvp.Value.StringValue == "ns1");
}
else
{
Assert.Contains(oltpResource.Attributes, (kvp) => kvp.Key == Resources.Resource.ServiceNameKey && kvp.Value.StringValue == optionsServiceName);
Assert.Contains(oltpResource.Attributes, (kvp) => kvp.Key == Resources.ResourceSemanticConventions.AttributeServiceName && kvp.Value.StringValue == optionsServiceName);
}
foreach (var instrumentationLibrarySpans in request.ResourceSpans.First().InstrumentationLibrarySpans)

View File

@ -157,7 +157,7 @@ namespace OpenTelemetry.Exporter.Zipkin.Tests
exporter.SetLocalEndpointFromResource(new Resource(new Dictionary<string, object>
{
[Resource.ServiceNameKey] = serviceName,
[ResourceSemanticConventions.AttributeServiceName] = serviceName,
["service.tag"] = "hello world",
}));

View File

@ -0,0 +1,86 @@
// <copyright file="ResourceBuilderTests.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.Collections.Generic;
using System.Linq;
using Xunit;
namespace OpenTelemetry.Resources.Tests
{
public class ResourceBuilderTests
{
[Fact]
public void ServiceResource_ServiceName()
{
var resource = ResourceBuilder.CreateEmpty().AddService("my-service").Build();
Assert.Equal(2, resource.Attributes.Count());
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceName, "my-service"), resource.Attributes);
Assert.Single(resource.Attributes.Where(kvp => kvp.Key == ResourceSemanticConventions.AttributeServiceName));
Assert.True(Guid.TryParse((string)resource.Attributes.Single(kvp => kvp.Key == ResourceSemanticConventions.AttributeServiceInstance).Value, out _));
}
[Fact]
public void ServiceResource_ServiceNameAndInstance()
{
var resource = ResourceBuilder.CreateEmpty().AddService("my-service", serviceInstanceId: "123").Build();
Assert.Equal(2, resource.Attributes.Count());
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceName, "my-service"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceInstance, "123"), resource.Attributes);
}
[Fact]
public void ServiceResource_ServiceNameAndInstanceAndNamespace()
{
var resource = ResourceBuilder.CreateEmpty().AddService("my-service", "my-namespace", serviceInstanceId: "123").Build();
Assert.Equal(3, resource.Attributes.Count());
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceName, "my-service"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceInstance, "123"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceNamespace, "my-namespace"), resource.Attributes);
}
[Fact]
public void ServiceResource_ServiceNameAndInstanceAndNamespaceAndVersion()
{
var resource = ResourceBuilder.CreateEmpty().AddService("my-service", "my-namespace", "semVer:1.2.3", serviceInstanceId: "123").Build();
Assert.Equal(4, resource.Attributes.Count());
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceName, "my-service"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceInstance, "123"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceNamespace, "my-namespace"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceVersion, "semVer:1.2.3"), resource.Attributes);
}
[Fact]
public void ServiceResource_AutoGenerateServiceInstanceIdOff()
{
var resource = ResourceBuilder.CreateEmpty().AddService("my-service", autoGenerateServiceInstanceId: false).Build();
Assert.Single(resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceName, "my-service"), resource.Attributes);
}
[Fact]
public void ClearTest()
{
var resource = ResourceBuilder.CreateEmpty()
.AddTelemetrySdk()
.Clear()
.AddService("my-service", autoGenerateServiceInstanceId: false)
.Build();
Assert.Single(resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(ResourceSemanticConventions.AttributeServiceName, "my-service"), resource.Attributes);
}
}
}

View File

@ -26,7 +26,6 @@ namespace OpenTelemetry.Resources.Tests
private const string KeyName = "key";
private const string ValueName = "value";
private const string OtelEnvVarKey = "OTEL_RESOURCE_ATTRIBUTES";
private static readonly Random Random = new Random();
public ResourceTest()
{
@ -339,11 +338,10 @@ namespace OpenTelemetry.Resources.Tests
public void GetResourceWithDefaultAttributes_EmptyResource()
{
// Arrange
var resource = Resource.Empty;
var new_resource = resource.GetResourceWithDefaultAttributes();
var resource = ResourceBuilder.CreateDefault().AddEnvironmentVariableDetector().Build();
// Assert
var attributes = new_resource.Attributes;
var attributes = resource.Attributes;
Assert.Equal(3, attributes.Count());
ValidateTelemetrySdkAttributes(attributes);
}
@ -352,11 +350,10 @@ namespace OpenTelemetry.Resources.Tests
public void GetResourceWithDefaultAttributes_ResourceWithAttrs()
{
// Arrange
var resource = new Resource(this.CreateAttributes(2));
var new_resource = resource.GetResourceWithDefaultAttributes();
var resource = ResourceBuilder.CreateDefault().AddEnvironmentVariableDetector().AddAttributes(this.CreateAttributes(2)).Build();
// Assert
var attributes = new_resource.Attributes;
var attributes = resource.Attributes;
Assert.Equal(5, attributes.Count());
ValidateAttributes(attributes, 0, 1);
ValidateTelemetrySdkAttributes(attributes);
@ -367,11 +364,10 @@ namespace OpenTelemetry.Resources.Tests
{
// Arrange
Environment.SetEnvironmentVariable(OtelEnvVarKey, "EVKey1=EVVal1,EVKey2=EVVal2");
var resource = new Resource(this.CreateAttributes(2));
var new_resource = resource.GetResourceWithDefaultAttributes();
var resource = ResourceBuilder.CreateDefault().AddEnvironmentVariableDetector().AddAttributes(this.CreateAttributes(2)).Build();
// Assert
var attributes = new_resource.Attributes;
var attributes = resource.Attributes;
Assert.Equal(7, attributes.Count());
ValidateAttributes(attributes, 0, 1);
ValidateTelemetrySdkAttributes(attributes);
@ -379,26 +375,6 @@ namespace OpenTelemetry.Resources.Tests
Assert.Contains(new KeyValuePair<string, object>("EVKey2", "EVVal2"), attributes);
}
[Fact]
public void GetResourceFromDetectors_OtelEnvDetector()
{
// Arrange
Environment.SetEnvironmentVariable(OtelEnvVarKey, "EVKey11=EVVal11,EVKey22=EVVal22");
var detectors = new List<IResourceDetector>
{
new OtelEnvResourceDetector(),
};
var resource = new Resource(this.CreateAttributes(2));
var new_resource = resource.GetResourceFromDetectors(detectors);
// Assert
var attributes = new_resource.Attributes;
Assert.Equal(4, attributes.Count());
ValidateAttributes(attributes, 0, 1);
Assert.Contains(new KeyValuePair<string, object>("EVKey11", "EVVal11"), attributes);
Assert.Contains(new KeyValuePair<string, object>("EVKey22", "EVVal22"), attributes);
}
public void Dispose()
{
Environment.SetEnvironmentVariable(OtelEnvVarKey, null);
@ -440,13 +416,6 @@ namespace OpenTelemetry.Resources.Tests
Assert.Single(versionAttribute);
}
private static string RandomString(int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[Random.Next(s.Length)]).ToArray());
}
private Dictionary<string, object> CreateAttributes(int attributeCount, int startIndex = 0)
{
var attributes = new Dictionary<string, object>();

View File

@ -1,87 +0,0 @@
// <copyright file="ResourcesTests.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.Collections.Generic;
using System.Linq;
using OpenTelemetry.Trace;
using Xunit;
namespace OpenTelemetry.Resources.Tests
{
public class ResourcesTests
{
[Fact]
public void ServiceResource_ServiceName()
{
var resource = OpenTelemetry.Resources.Resources.CreateServiceResource("my-service");
Assert.Equal(5, resource.Attributes.Count());
Assert.Contains(new KeyValuePair<string, object>(Resource.ServiceNameKey, "my-service"), resource.Attributes);
Assert.Single(resource.Attributes.Where(kvp => kvp.Key == Resource.ServiceNameKey));
Assert.True(Guid.TryParse((string)resource.Attributes.Single(kvp => kvp.Key == Resource.ServiceInstanceIdKey).Value, out _));
this.AssertDefaultAttributes(resource);
}
[Fact]
public void ServiceResource_ServiceNameAndInstance()
{
var resource = OpenTelemetry.Resources.Resources.CreateServiceResource("my-service", "123");
Assert.Equal(5, resource.Attributes.Count());
Assert.Contains(new KeyValuePair<string, object>(Resource.ServiceNameKey, "my-service"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(Resource.ServiceInstanceIdKey, "123"), resource.Attributes);
this.AssertDefaultAttributes(resource);
}
[Fact]
public void ServiceResource_ServiceNameAndInstanceAndNamespace()
{
var resource = OpenTelemetry.Resources.Resources.CreateServiceResource("my-service", "123", "my-namespace");
Assert.Equal(6, resource.Attributes.Count());
Assert.Contains(new KeyValuePair<string, object>(Resource.ServiceNameKey, "my-service"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(Resource.ServiceInstanceIdKey, "123"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(Resource.ServiceNamespaceKey, "my-namespace"), resource.Attributes);
this.AssertDefaultAttributes(resource);
}
[Fact]
public void ServiceResource_ServiceNameAndInstanceAndNamespaceAndVersion()
{
var resource = OpenTelemetry.Resources.Resources.CreateServiceResource("my-service", "123", "my-namespace", "semVer:1.2.3");
Assert.Equal(7, resource.Attributes.Count());
Assert.Contains(new KeyValuePair<string, object>(Resource.ServiceNameKey, "my-service"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(Resource.ServiceInstanceIdKey, "123"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(Resource.ServiceNamespaceKey, "my-namespace"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(Resource.ServiceVersionKey, "semVer:1.2.3"), resource.Attributes);
this.AssertDefaultAttributes(resource);
}
[Fact]
public void ServiceResource_NullParams()
{
var resource = OpenTelemetry.Resources.Resources.CreateServiceResource(null);
Assert.Equal(3, resource.Attributes.Count());
this.AssertDefaultAttributes(resource);
}
private void AssertDefaultAttributes(Resource resource)
{
Assert.Contains(new KeyValuePair<string, object>(SemanticConventions.AttributeTelemetrySdkName, "opentelemetry"), resource.Attributes);
Assert.Contains(new KeyValuePair<string, object>(SemanticConventions.AttributeTelemetrySdkLanguage, "dotnet"), resource.Attributes);
var versionAttribute = resource.Attributes.Where(pair => pair.Key.Equals("telemetry.sdk.version"));
Assert.Single(versionAttribute);
}
}
}