autotrace4j
是一个基于ByteBuddy编写的轻量级日志跟踪工具,其基本逻辑是在各个上下文当中通过代码增强关键节点来传递trace id
,最后在日志输出时注入到输出结果当中,以实现日志的跟踪串联。
我们借鉴了SkyWalking的实现原理,使用ByteBuddy在各个上下文环节进行关键点增强来传递Trace ID。
基于Agent的方式来使用该工具,对业务代码无侵入。
只依赖ByteBuddy,且增加的增强代码只是往Thread Local当中写入字符串或读出字符串,没有做额外事项,不会增加性能开销。
autotrace4j
的使用非常简单,只需从release中下载最新的agent jar包,在启动脚本中以agent方式运行:
$ java -javaagent=/dir/to/autotrace4j.jar=com.your-domain.biz1.pkg1,com.your-domain.biz2.pkg2 -jar YourJar.jar # 省略其他无关参数
可通过slf4j的MDC获取当前上下文的TraceID:
- 当通过
MDC.get("X-Ato-Span-Id")
时返回当前上下文的SpanId
- 当通过
MDC.get("X-Ato-P-Span-Id")
时返回当前上下文的ParentSpanId
- 当通过
MDC.get("X-Ato-Trace-Id")
时返回当前上下文的TraceId
针对Thread进行了增强,在创建线程时支持自动Trace跟踪:
java.lang.Thread
基于如下包作为基础的线程池均支持自动Trace跟踪:
java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ForkJoinPool
java.util.concurrent.ScheduledThreadPoolExecutor
基于如下几个Client的HTTP请求客户端在发送请求时都会自动将当前上下文的TraceId设置到请求头:
- OkHttp3:
com.squareup.okhttp3:okhttp
- JDK Http Client:
jdk:sun.net.www.http.HttpClient
- ApacheHttpClient:
org.apache.httpcomponents:httpclient
我们支持了HTTP Filter和HTTP Servlet来从请求头当中接收TraceId并设置到当前上下文:
javax.servlet.Filter
javax.servlet.http.HttpServlet
目前支持阿里云ONS和RocketMQ在生产和消费时带上TraceId:
- RocektMQ:
Producer
&Consumer
- Aliyun ONS:
Producer
&Consumer
- Kafka:comming soon....
已支持XXL Job和Spring的Scheduled定时任务在产生时生成TraceId:
- XxlJob Handler:
com.handler.com.xxl.job.core.IJobHandler
- Spring Schedule Task:
org.springframework.scheduling.annotation.Scheduled
- PowerJob Processor:
tech.powerjob.worker.core.processor.sdk.BasicProcessor
目前支持在logback中输出日志时注入trace id进行输出:
- logback:
ch.qos.logback:logback-core
欢迎贡献你的代码,一起完善autotrace4j
库!