gpt4 book ai didi

c# - 使用 Microsoft 托管扩展和 net472 时事件为空

转载 作者:行者123 更新时间:2023-12-03 07:58:23 35 4
gpt4 key购买 nike

我正在尝试将 OpenTelemetry 与使用 Microsoft.Extensions.Hosting 的 net472 应用程序一起使用。

我像这样创建我的主机:

Host.CreateDefaultBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddOpenTelemetry().WithTracing(tracerProviderBuilder =>
{
tracerProviderBuilder
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MySample"))
.AddConsoleExporter()
.AddSource(serviceName);
}).StartWithHost();
})
.Build();

如果我尝试创建一个像这样的新事件,它是空的:

var activitySource = new ActivitySource(serviceName);
using var activity = activitySource.StartActivity("Hello");

如果我像这样注册 OpenTelemetry,它就可以正常工作:


using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MySample"))
.AddSource(serviceName)
.AddConsoleExporter()
.Build();

如何使用第一种创建 Host 的方法获取已配置监听器的 ActivitySource?

最佳答案

因此,OpenTelemetry.Extensions.Hosting 包中的 AddOpenTelemetry 扩展没有太多作用。它(本质上)是这样做的:

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();
}
}
}

其唯一目的是在 IServiceProvider 可用时访问 TracerProvider 和/或 MeterProvider 以启动 OTel SDK。它通过注册一个 IHostedService 来实现此目的,这是 .NET 主机(通用或 Web)知道要查找和调用的特殊服务。

我刚刚回复了https://github.com/open-telemetry/opentelemetry-dotnet/issues/4276 。当我在 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>();

注意:在该代码中,您不需要处置 TracerProviderMeterProvider,因为它们是通过 IServiceProvider 访问的,并且将被处置当它被处置时。

值得注意的是,在 .NET Framework 上根本不需要使用 IServiceCollection\IServiceProvider 。这是一个偏好问题。 OTel .NET SDK 提供了 Sdk.CreateMeterProviderBuilderSdk.CreateTracerProviderBuilder API 专门用于支持 .NET Framework(也适用于可能需要多个提供程序的用户)。

进一步阅读:https://github.com/open-telemetry/opentelemetry-dotnet/tree/990deee419ab4c1449efd628bed3df57a50963a6/docs/trace/customizing-the-sdk#building-a-tracerprovider

关于c# - 使用 Microsoft 托管扩展和 net472 时事件为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75323899/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com