Open KYV365 opened 3 years ago
@raojun0504 当前使用的 SOFAtracer 版本是多少?可以看下 release node ,以确认当前版本是否支持 redis 客户端埋点
@raojun0504 当前使用的 SOFAtracer 版本是多少?可以看下 release node ,以确认当前版本是否支持 redis 客户端埋点
查看了是支持的
@raojun0504 可以debug 看下 MDCSpanExtension 是否有被执行到
这个问题你找到解决办法没有,我这边也遇到了经过reids操作以后traceId丢失问题
从我当前debug的结果来看,在同一个线程情况下只要操作了redis就会导致MDC的数据丢失,经过RedisActionWrapperHelper会触发获取数据后清理动作,导致MDC丢失 1:执行清理的代码入口
2:清理MDC代码入口
3:清理以后在设置parent的导致(真实原因应该是redis生成context的时候把父类丢失了) 4:最后找到问题根因在处理依赖关系导致threadlocal中数据异常,修复方法: com.sofa.alipay.tracer.plugins.spring.redis.common.RedisActionWrapperHelper#buildSpan(java.lang.String)
@raojun0504 可以debug 看下 MDCSpanExtension 是否有被执行到
我们这边也遇到了这个问题,排查了一下发现是com.sofa.alipay.tracer.plugins.spring.redis.common.RedisActionWrapperHelper
里逻辑的问题
其他的plugin关于com.alipay.common.tracer.core.span.SofaTracerSpan
对象的产生和销毁都是基于com.alipay.common.tracer.core.tracer.AbstractTracer#clientSend
和com.alipay.common.tracer.core.tracer.AbstractTracer#clientReceive
去实现的,在clientSend
里面的逻辑包括了对父span的处理,即
// Need to actively cache your own serverSpan, because: asChildOf is concerned about spanContext
clientSpan.setParentSofaTracerSpan(serverSpan);
但是在com.sofa.alipay.tracer.plugins.spring.redis.common.RedisActionWrapperHelper
中,关于com.alipay.common.tracer.core.span.SofaTracerSpan
对象的产生和销毁,是在com.sofa.alipay.tracer.plugins.spring.redis.common.RedisActionWrapperHelper#builder
中直接调用了com.alipay.common.tracer.core.SofaTracer#buildSpan
,这个逻辑是非常奇怪的,在整个项目的plugin中,只有com.alipay.sofa.tracer.plugin.flexible.FlexibleTracer
和com.sofa.alipay.tracer.plugins.spring.redis.common.RedisActionWrapperHelper
是这么做的。
然而,com.alipay.sofa.tracer.plugin.flexible.FlexibleTracer
机智的把父span关联的逻辑补上了
但com.sofa.alipay.tracer.plugins.spring.redis.common.RedisActionWrapperHelper
中没有,导致Redis的plugin存在问题。
按我的理解,所有的plugin应该只是在兼容各组件上存在差异,在span相关的逻辑应该是保持一致的,基于此才会有com.alipay.common.tracer.core.tracer.AbstractTracer
的抽象类存在。
不清楚为什么Redis的另辟蹊径使用自有的方式来实现,关键逻辑上还存在问题..😂
Your question
MQ里面调用redis,MQ的日志打印traceId正常,紧跟着redis set命令打印traceId丢失
redisTemplate.opsForValue().set("test mq redis", "test mq redis"); log.info("test mq redis end 1"); log日志的traceId丢失,断点进入redis的插件,里面traceId是正常封装 describe your question clearly
Your scenes
@StreamListener(value = MQ_TENANT_DB_CHANNEL, condition = SYNC_TENANT_DB_CONDITION) public void syncTenantBasicData(@Payload TenantDbMessageDTO tenantDbMessageDTO, @Header(MQ_HEADER_APPCODE) String appCode) throws InterruptedException {
describe your use scenes (why need this feature)
Your advice
describe the advice or solution you'd like
Environment
java -version
):uname -a
):