.NET 6 HostedService启动的Activity无法被OpenTelemetry导出问题
.NET 6 HostedService 启动的Activity无法被OpenTelemetry导出
我有一个使用HostedService进行后台处理的.NET 6 Web应用程序。当HostedService在应用启动后立即启动Activity时,该Activity无法被OpenTelemetry的控制台或Jaeger等导出器导出。
复现代码
应用程序代码
using System.Diagnostics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; var builder = WebApplication.CreateBuilder(args); builder.Services.AddSingleton<Func<Task>>(() => Task.CompletedTask); builder.Services.AddHostedService<TestBackgroundService>(); builder.Services.AddOpenTelemetryTracing(b => { b .AddSource(ServiceName) .SetResourceBuilder(ResourceBuilder .CreateDefault() .AddService(serviceName: ServiceName)) .AddInMemoryExporter(ExportedActivities); }); var app = builder.Build(); app.Run(); public partial class Program { public static readonly ActivitySource ActivitySource = new("OpenTelemetryTestApp"); public static readonly List<Activity> ExportedActivities = new(); } public class TestBackgroundService : BackgroundService { private readonly Func<Task> _notify; public TestBackgroundService(Func<Task> notify) { _notify = notify; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { using var activity = Program.ActivitySource.StartActivity("some trace"); await _notify(); } }
测试代码
using System.Threading.Channels; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; namespace OpenTelemetryBackgroundProcessesTests; public class Tests : IClassFixture<TestApplicationFactory> { private readonly TestApplicationFactory _app; public Tests(TestApplicationFactory app) { _app = app; // 启动应用 _app.CreateClient(); } [Fact] public async Task ActivityShouldBeExportedFromHostedService() { await _app.NotifyChannel.Reader.ReadAsync(new CancellationTokenSource(TimeSpan.FromSeconds(10)).Token); Assert.NotEmpty(Program.ExportedActivities); } } public class TestApplicationFactory : WebApplicationFactory<Program> { public readonly Channel<object> NotifyChannel = Channel.CreateUnbounded<object>(); protected override IHost CreateHost(IHostBuilder builder) { builder.ConfigureServices(services => { services.Replace(ServiceDescriptor.Singleton<Func<Task>>(async () => { await NotifyChannel.Writer.WriteAsync("notify"); })); }); return base.CreateHost(builder); } }
我已使用OpenTelemetry的最新稳定版(1.3.2)和预发布版(1.4.0-rc4)进行测试,问题均存在。
内容的提问来源于stack exchange,提问作者grzegorzorwat
相关产品推荐
相关产品推荐

