So the AddOpenTelemetry
扩展在OpenTelemetry.Extensions.Hosting
包没有太大作用。它(本质上)是这样做的:
services.TryAddEnumerable(
ServiceDescriptor.Singleton<IHostedService, TelemetryHostedService>());
internal sealed class TelemetryHostedService : IHostedService
{
private readonly IServiceProvider serviceProvider;
public TelemetryHostedService(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public Task StartAsync(CancellationToken cancellationToken)
{
// The sole purpose of this HostedService is to ensure all
// instrumentations, exporters, etc., are created and started.
Initialize(this.serviceProvider);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
internal static void Initialize(IServiceProvider serviceProvider)
{
Debug.Assert(serviceProvider != null, "serviceProvider was null");
var meterProvider = serviceProvider!.GetService<MeterProvider>();
if (meterProvider == null)
{
HostingExtensionsEventSource.Log.MeterProviderNotRegistered();
}
var tracerProvider = serviceProvider!.GetService<TracerProvider>();
if (tracerProvider == null)
{
HostingExtensionsEventSource.Log.TracerProviderNotRegistered();
}
}
}
其唯一目的是访问TracerProvider
and/or MeterProvider
一旦启动 OTel SDKIServiceProvider
可用。它通过注册一个IHostedService
这是 .NET 主机(通用或 Web)知道要查找和调用的特殊服务。
我刚刚回复了https://github.com/open-telemetry/opentelemetry-dotnet/issues/4276 https://github.com/open-telemetry/opentelemetry-dotnet/issues/4276。当我使用实际的主机 on net472
,一切正常。
我不清楚为什么上述某些内容不起作用。有几个例子似乎是在没有“运行”的情况下调用“构建”,这是行不通的。在“运行”阶段IHostedService
已启动。 @endeffects 片段似乎应该可以工作,但它缺少注册部分。
我的猜测是,这些 .NET Framework 应用程序没有使用主机,只是IServiceCollection
\ IServiceProvider
。在这种情况下,请直接向提供商请求...
var services = new ServiceCollection();
services.AddOpenTelemetr().WithTracing().WithMetrics();
using var serviceProvider = services.BuildServiceProvider();
// Start OTel SDK
var tracerProvider = serviceProvider.GetRequiredService<TracerProvider>();
var meterProvider = serviceProvider.GetRequiredService<MeterProvider>();
注意:在该代码中,您不需要处置任何一个TracerProvider
or MeterProvider
因为它们是通过访问IServiceProvider
并在处置时予以处置。
值得注意的是,没有要求必须使用IServiceCollection
\ IServiceProvider
at all在 .NET 框架上。这是一个偏好问题。 OTel .NET SDK 附带Sdk.CreateMeterProviderBuilder
& Sdk.CreateTracerProviderBuilder
专门用于支持 .NET Framework 的 API(也包括可能需要多个提供程序的人)。
进一步阅读:https://github.com/open-telemetry/opentelemetry-dotnet/tree/990deee419ab4c1449efd628bed3df57a50963a6/docs/trace/customizing-the-sdk#building-a-tracerprovider https://github.com/open-telemetry/opentelemetry-dotnet/tree/990deee419ab4c1449efd628bed3df57a50963a6/docs/trace/customizing-the-sdk#building-a-tracerprovider