Jaeger无法接收ASP.NET Core应用的OpenTelemetry日志问题排查
我使用OpenTelemetry和Jaeger收集ASP.NET Core Web API(基于标准WeatherForecast示例项目)的遥测数据,通过Docker运行Jaeger后,UI中能看到WebApiTest: GET WeatherForecast的链路追踪数据,但无法看到日志信息——尽管Web API项目的控制台已经输出包含TraceId、SpanId等链路信息的日志。
已在Program.cs中添加如下配置:
// Configure OpenTelemetry var resource = ResourceBuilder.CreateDefault().AddService("WebApiTest"); builder.Services.AddOpenTelemetry() .WithTracing(tracerProviderBuilder => { tracerProviderBuilder .SetResourceBuilder(resource) .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddConsoleExporter() .AddOtlpExporter(otlpOptions => { // Use IConfiguration directly for Otlp exporter endpoint option. otlpOptions.Endpoint = new Uri(builder.Configuration.GetValue("Otlp:Endpoint", defaultValue: "http://localhost:4317")!); }); }); // Clear default logging providers used by WebApplication host. builder.Logging.ClearProviders(); // Configure OpenTelemetry Logging. builder.Logging.AddOpenTelemetry(options => { options.SetResourceBuilder(resource); options.IncludeFormattedMessage = true; options.IncludeScopes = true; options.ParseStateValues = true; options.AddOtlpExporter(otlpOptions => { otlpOptions.Endpoint = new Uri(builder.Configuration.GetValue("Otlp:Endpoint", defaultValue: "http://localhost:4317")!); }); options.AddConsoleExporter(); }); var app = builder.Build();
并在WeatherForecastController的Get()方法中使用_logger.LogInformation("Getting weather forecast");记录日志。
Jaeger未启用OTLP日志接收功能
默认Docker启动的Jaeger仅开启了OTLP追踪数据的接收,日志接收需要额外配置参数。启动Jaeger容器时需添加COLLECTOR_OTLP_ENABLE_LOGS=true环境变量,确保Jaeger的收集器能处理OTLP格式的日志数据。Jaeger版本不支持OpenTelemetry日志
较旧版本的Jaeger(v1.35之前)对OpenTelemetry日志的支持不完善,需要升级Jaeger到v1.35及以上版本,才能正常接收和展示OTLP日志。OTLP日志导出的协议或端点配置错误
OpenTelemetry日志导出默认使用gRPC协议(端口4317),但如果Jaeger仅配置了HTTP协议的OTLP接收(端口4318),则需要修改日志导出的Endpoint为http://localhost:4318/v1/logs,同时指定协议为HTTP:options.AddOtlpExporter(otlpOptions => { otlpOptions.Endpoint = new Uri("http://localhost:4318/v1/logs"); otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf; });日志级别过滤问题
检查Jaeger收集器或OpenTelemetry日志配置是否过滤了Info级别日志。比如OpenTelemetry默认可能只收集Warning及以上级别,需要确保日志级别配置正确,比如在appsettings.json中设置:"Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }追踪上下文关联不规范
虽然控制台日志显示了TraceId和SpanId,但需确保这些元数据是以OpenTelemetry规范的属性名(trace_id、span_id)传递给Jaeger。确认你的OpenTelemetry日志配置中IncludeScopes和ParseStateValues已正确启用,保证追踪上下文能被Jaeger识别并关联到对应链路。
内容的提问来源于stack exchange,提问作者zukimo

