.NET中OpenTelemetry无法追踪StackExchange Redis调用如何解决
问题根因
采集不到Redis调用链路的核心原因是实例不匹配:AddStackExchangeRedisCache() 默认会根据传入的连接字符串,内部创建独立的IConnectionMultiplexer连接实例;而你在OpenTelemetry配置中手动Connect生成的connection是另一个完全独立的实例。AddRedisInstrumentation(connection) 仅给你手动创建的这个闲置连接挂载了追踪探针,实际业务中IDistributedCache执行Redis操作走的是内部新建的、未被探针监听的连接,自然无法生成追踪记录。
修复配置步骤
- 统一Redis连接实例的生命周期:将
IConnectionMultiplexer作为单例注册到DI容器,全局所有Redis相关逻辑(包括分布式缓存、OTel探针)共用这一个实例,避免重复创建连接。 - 调整StackExchangeRedisCache的注册逻辑:不要直接给
Configuration属性传连接字符串让组件内部自建连接,改为通过ConnectionMultiplexerFactory配置项,从DI容器中获取已经注册好的共用连接实例给缓存组件使用。 - 调整OpenTelemetry Redis探针的配置:移除手动传入的独立connection参数,让探针自动从DI容器中获取已注册的
IConnectionMultiplexer实例挂载监听。
服务注册代码
// 注册全局共用的Redis连接单例 services.AddSingleton<IConnectionMultiplexer>(sp => { var redisConnectionString = "<Azure Redis Cache Conn String>"; return ConnectionMultiplexer.Connect(redisConnectionString); }); // 注册分布式缓存,复用全局Redis连接 services.AddStackExchangeRedisCache(options => { options.ConnectionMultiplexerFactory = () => { var multiplexer = services.BuildServiceProvider().GetRequiredService<IConnectionMultiplexer>(); return Task.FromResult(multiplexer); }; });
OpenTelemetry追踪配置代码
services.AddOpenTelemetryTracing(builder => builder .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() // 不传入手动创建的独立连接,自动关联DI中注册的Redis实例 .AddRedisInstrumentation() .AddConsoleExporter());
版本注意:如果使用的是
OpenTelemetry.Instrumentation.StackExchangeRedis1.0.0-rc8及更早版本,无参AddRedisInstrumentation()可能不支持自动解析DI实例,此时可以使用带IServiceProvider入参的重载,手动从DI获取连接实例传入即可,不要在配置代码块外部单独创建连接。
- 配置完成后重启服务,调用触发IDistributedCache操作的接口,即可在ConsoleExporter的输出中看到Redis调用的Span记录,这些Span会自动关联到对应HTTP请求的父链路下。
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

