.NET OpenTelemetry中TracerProvider.Default与TracerProviderBuilder的关联疑问
OpenTelemetry Tracer 相关技术问题
场景代码
注册Tracer为单例
builder.Services.AddSingleton(TracerProvider.Default.GetTracer(builder.Environment.ApplicationName));
Minimal API中使用Tracer
app.MapGet("/podcasts", async (PodcastDbContext db, RatingServiceHttpClient ratingServiceHttpClient, Tracer tracer) => ...
配置OpenTelemetry追踪
builder.Services.AddOpenTelemetry() .WithTracing(tracing => ...)
技术问询
- TracerProviderBuilder的配置是否会应用于通过TracerProvider.Default.GetTracer()获取的Tracer?
- 仅通过TracerProviderBuilder的AddSource()配置源,那么TracerProvider.Default.GetTracer()获取的Tracer发出的追踪如何被导出(无对应源监听时追踪会被忽略)?
- TracerProviderBuilder何时用于构建TracerProvider和Tracer?代码中未看到其相关引用。
问题解答
不会。
TracerProvider.Default是OpenTelemetry提供的全局默认实例,和通过AddOpenTelemetry().WithTracing()配置的TracerProvider是两个独立对象。TracerProviderBuilder上的所有配置(添加导出器、处理器、源等)仅作用于自身构建的TracerProvider,不会影响全局默认实例。这种情况下,
TracerProvider.Default获取的Tracer发出的追踪会被直接忽略——因为默认Provider既没有配置对应监听源,也没有绑定导出器。要解决这个问题有两种方式:- 放弃使用
TracerProvider.Default,改为从自定义配置的TracerProvider中获取Tracer(可通过DI注入TracerProvider后调用GetTracer) - 直接给
TracerProvider.Default配置对应源和导出器,比如启动时执行TracerProvider.Default.AddSource(你的源名称),同时为默认Provider添加导出逻辑
- 放弃使用
TracerProviderBuilder的构建动作由OpenTelemetry的DI集成自动完成。在应用启动、DI容器初始化完成的过程中,框架会自动解析并执行Builder的配置逻辑,最终创建出符合要求的TracerProvider实例。虽然代码里没有显式写构建调用,但
AddOpenTelemetry()扩展方法已经将构建逻辑注册到了DI容器中,最终实例可通过DI注入使用。
内容的提问来源于stack exchange,提问作者Shuzheng
相关产品推荐
相关产品推荐

