You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:39:22