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

.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.StackExchangeRedis 1.0.0-rc8及更早版本,无参AddRedisInstrumentation()可能不支持自动解析DI实例,此时可以使用带IServiceProvider入参的重载,手动从DI获取连接实例传入即可,不要在配置代码块外部单独创建连接。

  • 配置完成后重启服务,调用触发IDistributedCache操作的接口,即可在ConsoleExporter的输出中看到Redis调用的Span记录,这些Span会自动关联到对应HTTP请求的父链路下。

内容的提问来源于stack exchange,提问作者Vivek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:24:21