繁体   English   中英

.NET OpenTelemetry 没有为 ActivitySource 添加监听器

[英].NET OpenTelemetry Not Adding Listener For ActivitySource

为什么 OpenTelemetry .NET 没有在通用主机上的托管服务中为我的ActivitySource添加侦听器?

我有一些配置要传递到 OpenTelemetry 设置中,所以我依赖于 class MyClass 这意味着注册 class,然后为使用该 class 的TracerProviderBuilder配置回调操作。 但是,当我稍后创建一个ActivitySource并使用ActivitySource.StartActivity(...)启动一个Activity时,它会返回 null 因为没有监听器连接到源。 通过调试和检查ActivitySource ,我可以看到s_activeSources列表,其中包括由.AddHttpClientInstrumentation()创建的OpenTelemetry.HttpRequest ActivitySource ,所以奇怪的是也没有为此添加侦听器。

注意:这是在单元测试中运行并失败,而它在长时间运行的工作服务程序中运行。 不确定单元测试是否过于短暂或受测试环境(例如 Visual Studio)的影响

以下是我的场景的最小版本:

Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
    services
    .AddSingleton<MyClass>()
    .AddOpenTelemetryTracing(hostingBuilder =>
        hostingBuilder
        .Configure(
            (sp, builder) =>
            {
                var myClass = sp.GetRequiredService<MyClass>();
                
                // Do something with myClass on builder
                
                builder
                .AddAspNetInstrumentation()
                .AddHttpClientInstrumentation()
                .AddConsoleExporter()
                .AddSource("TestService*");
            }))
    .AddHostedService<TestService>();
})
.Build();

TestService.cs

internal class TestService : BackgroundService
{
    private static ActivitySource testActivitySource = new ActivitySource("TestService");

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        await Task.Run(() =>
        {
            using (var activity = testActivitySource.StartActivity("TestService", ActivityKind.Server))
            {
                Console.WriteLine("I'm inside the activity using clause!");

                activity?.SetTag("foo", 1);

                Console.WriteLine($"activity.Tags: {activity.Tags}"); // This throws NullReferenceException since activity is null due to no listeners
            }

            Console.WriteLine("I'm outside the activity using clause!");
        });
    }
}

Package 版本:

<package id="OpenTelemetry" version="1.3.0" />
<package id="OpenTelemetry.Api" version="1.3.0" />
<package id="OpenTelemetry.Exporter.Console" version="1.3.0" />
<package id="OpenTelemetry.Extensions.Hosting" version="1.0.0-rc9.5" />
<package id="OpenTelemetry.Instrumentation.AspNet" version="1.0.0-rc9.5" />
<package id="OpenTelemetry.Instrumentation.AspNet.TelemetryHttpModule" version="1.0.0-rc9.5" />
<package id="OpenTelemetry.Instrumentation.Http" version="1.0.0-rc9.5" />

我还尝试将.AddConsoleExporter()行移出.Configure方法,并由hostingBuilder直接调用,但仍然没有连接到任何ActivitySource的侦听器。

在您的单元测试项目中,您已经创建了构建器,但您还没有启动构建器。 除非您不启动主机,否则它不会添加侦听器。 尝试使用下面的代码片段。

var builder = Host.CreateDefaultBuilder()
            .ConfigureServices((context, services) =>
            {
                services
                .AddSingleton<MyClass>()
                .AddOpenTelemetryTracing(hostingBuilder =>
                    hostingBuilder
                    .Configure(
                        (sp, builder) =>
                        {
                            var myClass = sp.GetRequiredService<MyClass>();

                            // Do something with myClass on builder

                            builder
                            .AddAspNetInstrumentation()
                            .AddHttpClientInstrumentation()
                            .AddConsoleExporter()
                            .AddSource("TestService*");
                        }))
                .AddHostedService<TestService>();
            }).Build();

        var host = builder.Build();

        await host.StartAsync();

        await host.StopAsync();

        host.Dispose();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM