做一个分布式系统的全链路跟踪需要做两件事。
1,用一个traceId串联同一个业务的分布式线程
2,打印此traceId
那些复杂的方案pingpong zipkin什么的同理
下面是一个最简单的实现
基于dubbo和slf4j的实现
1,用fitler来串联分布式线程 2,用mdc(暂时只有slf4j和log4j支持)来传递,打印此id
package com.alibaba.dubbo.rpc.filter; import com.alibaba.dubbo.common.Constants; import com.alibaba.dubbo.common.extension.Activate; import com.alibaba.dubbo.common.utils.StringUtils; import com.alibaba.dubbo.rpc.*; import org.slf4j.MDC; import java.util.UUID; @Activate(group = {Constants.CONSUMER, Constants.PROVIDER}, order = -9999) public class TraceFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { String traceId = invocation.getAttachment("traceId"); if (!StringUtils.isBlank(traceId)) { RpcContext.getContext().setAttachment("traceId", traceId); } else { // 第一次发起调用 RpcContext.getContext().setAttachment("traceId", UUID.randomUUID().toString().replace("-","")); } MDC.put("traceId",traceId); return invoker.invoke(invocation); } }
2
log4j.appender.stdout.layout.ConversionPattern=%X{traceId} %d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] (%F:%L) - %m%n