Skip to content

Commit

Permalink
fix: 修复模块名称问题
Browse files Browse the repository at this point in the history
  • Loading branch information
Bedroome authored and i36lib committed Dec 11, 2024
1 parent 66b2716 commit b62af05
Show file tree
Hide file tree
Showing 21 changed files with 488 additions and 229 deletions.
65 changes: 44 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
## Auto Trace for Java
[![Run Tests](https://github.com/artlibs/autotrace4j/actions/workflows/testing.yml/badge.svg)](https://github.com/artlibs/autotrace4j/actions/workflows/testing.yml) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.artlibs/autotrace4j/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.github.artlibs/autotrace4j/) [![Release](https://img.shields.io/github/release/artlibs/autotrace4j.svg?style=flat-square)](https://github.com/artlibs/autotrace4j/releases) [![License: Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0)
[![Run Tests](https://github.com/artlibs/autotrace4j/actions/workflows/testing.yml/badge.svg)](https://github.com/artlibs/autotrace4j/actions/workflows/testing.yml) [![Release](https://img.shields.io/github/release/artlibs/autotrace4j.svg?style=flat-square)](https://github.com/artlibs/autotrace4j/releases) [![License: Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0)

`autotrace4j`是一个基于ByteBuddy编写的轻量级日志跟踪工具,其基本逻辑是在各个上下文当中通过代码增强关键节点来传递`trace id`,最后在日志输出时注入到输出结果当中,以实现日志的跟踪串联。

​ 我们借鉴了SkyWalking的实现原理,使用ByteBuddy在各个上下文环节进行关键点增强来传递Trace ID。

#### 易使用

​ 基于Agent的方式来使用该工具,对业务代码无侵入。
​ 基于Agent的方式来使用该工具,对业务代码无侵入、运维可在基础层面统一配置,业务方可无感知

#### 轻量级

Expand All @@ -18,9 +16,26 @@
`autotrace4j`的使用非常简单,只需从[release](https://github.com/artlibs/autotrace4j/releases)中下载最新的agent jar包,在启动脚本中以agent方式运行:

```shell
$ java -javaagent=/dir/to/autotrace4j.jar=com.your-domain.biz1.pkg1,com.your-domain.biz2.pkg2 -jar YourJar.jar # 省略其他无关参数
$ java -javaagent=/dir/to/autotrace4j.jar=com.your-domain.biz1.pkg1,com.your-domain.biz2.pkg2 -Dautotrace4j.log.enable=true -jar YourJar.jar # 省略其他无关参数
```

- 一般情况下不需要开启autotrace4j内部日志,即***不需要***`-Dautotrace4j.log.enable=true`,如果需要观测到增强过程增强了哪些类,或在调试autotrace4j时有需要,可开启该日志选项,其他选项可使用默认参数:
- `-Dautotrace4j.log.enable=true` 设置开启autotrace4j内部日志
- `-Dautotrace4j.log.dir=/path/to/your/log/dir` 修改autotrace4j内部日志保存路径
- `-Dautotrace4j.log.level=TRACE` (可选`TRACE`, `DEBUG`, `INFO`, `WARN`, `ERROR`)修改日志级别
- `-Dautotrace4j.log.file.retention=5` 设置autotrace4j内部日志保留天数为5天
- `-Dautotrace4j.log.file.size=10485760`设置单个文件大小为10M(`10*1024*1024=10485760`)

#### 关于日志

可通过如下系统属性开启和设置日志来观察增强过程:

- `autotrace4j.log.enable`:是否开启autotrace4j日志,默认`false`
- `autotrace4j.log.dir`:autotrace4j日志文件保存路径,默认为临时目录`java.io.tmpdir`
- `autotrace4j.log.level`:autotrace4j日志级别,默认为`DEBUG`
- `autotrace4j.log.file.retention`:autotrace4j日志文件保留时间,单位天,默认为`7`
- `autotrace4j.log.file.size`:autotrace4j日志文件大小限制,单位字节(`B`),默认为`0`表示不限制

#### 关于`MDC`

可通过`slf4j`或者`log4j``MDC`获取当前上下文的Trace ID:
Expand All @@ -33,7 +48,7 @@ $ java -javaagent=/dir/to/autotrace4j.jar=com.your-domain.biz1.pkg1,com.your-dom

### 1、Thread

​ 针对Thread进行了增强,在创建线程时支持自动Trace跟踪: `java.lang.Thread`
​ 针对Thread进行了增强,在创建线程时支持自动传递当前Trace: `java.lang.Thread`

### 2、Thread Pool

Expand All @@ -58,37 +73,45 @@ $ java -javaagent=/dir/to/autotrace4j.jar=com.your-domain.biz1.pkg1,com.your-dom
- `javax.servlet.Filter`
- `javax.servlet.http.HttpServlet`

### 5、MessageQunue
### 5、Middleware

目前支持阿里云ONS和RocketMQ在生产和消费时带上TraceId
支持阿里云ONS和RocketMQ在生产和消费时传递trace,支持Dubbo

- RocektMQ:`Producer` & `Consumer`
- Aliyun ONS:`Producer` & `Consumer`
- Kafka:comming soon....
- Dubbo:`org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter`
`org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter`

### 6、Scheduled Task
### 6、Scheduled

​ 支持XXL Job、Spring Scheduled定时任务、PowerJob在产生时生成TraceId
​ 支持XXL Job、Spring Scheduled定时任务、PowerJob在产生时传递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`

### 7、Logging

支持在logback中输出日志时注入trace id进行输出
支持几个主流日志框架的最终输出,自动加入trace信息(主要针对Stream和RollingFile的字符串和JSON格式)

- Log4j:`log4j:log4j`
- logback:`ch.qos.logback:logback-core`
- Java loggin:`java.util.logging`
- `JUL``Log4j``Logback``Log4j2`

### 8、Middleware
## Contribute

​ 支持如下中间件的增强
欢迎贡献你的代码(`Fork` & `Pull Request`),一起完善`autotrace4j`库!

- Dubbo:`org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter`
`org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter`
- 如何增加支持:

## Contribute
`io.github.artlibs.autotrace4j.transformer`下仿照其他转换器新增

- 关于单元测试:

`io.github.artlibs.autotrace4j.At4jTest`中参考其他案例增加单元测试

本地单测:

```shell
$ export JAVA_HOME=/path/to/your/jdk21/home
$ make test
```

欢迎贡献你的代码,一起完善`autotrace4j`库!
12 changes: 10 additions & 2 deletions src/main/java/io/github/artlibs/autotrace4j/AutoTrace4j.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import java.util.List;
import java.util.Objects;

import static io.github.artlibs.autotrace4j.logger.LoggerFactory.getLogFileDirectory;
import static io.github.artlibs.autotrace4j.logger.LoggerFactory.loggerEnabled;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;

/**
Expand Down Expand Up @@ -87,20 +89,26 @@ public static Transformer withBizScope(String bizPackages) {
*/
public void on(Instrumentation instrument) throws IOException, URISyntaxException {
String contextPackage = AutoTrace4j.class.getPackage().getName() + ".context";

// inject context class into bootstrap loader
ClassUtils.injectClassToBootStrap(instrument, contextPackage);

// note: this method must be called after injectClassToBootStrap, don't move it forward
// note: this method must be called after injectClassToBootStrap
ModuleUtils.compatibleJavaModule(contextPackage);

if (loggerEnabled()) {
System.err.println("已开启[autotrace4j]日志:" + getLogFileDirectory());
}

AgentBuilder builder = this.newAgentBuilder();
for (At4jTransformer transformer : loadTransformers()) {
builder = builder.type(transformer.typeMatcher()).transform(transformer);
}
builder.installOn(instrument);

// init trace for main thread.
TraceContext.setTraceId(TraceContext.generate());
TraceContext.setSpanId(TraceContext.generate());
TraceContext.setTraceId(TraceContext.generate());
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package io.github.artlibs.autotrace4j.context;

import java.util.Objects;
import java.util.UUID;

/**
* Trace context for SpanId, ParentSpanId, TraceId
* Trace context
*
* @author Fury
* @since 2024-03-30
Expand Down Expand Up @@ -138,71 +137,4 @@ public static String generate() {
.replace("-", "");
}

private static final String SEPARATOR = " - ";
private static final String QUOTE_COLON = "\":\"";

/**
* Inject trace id into log message
* @param message String
* @return result
*/
public static String injectTraceId(String message) {
if (Objects.isNull(message) || Objects.isNull(TraceContext.getTraceId())) {
return message;
}

try {
String trimMessage = message.trim();

// JSON FORMAT
if (trimMessage.startsWith("{") && trimMessage.endsWith("}")) {
return injectJsonString(message, trimMessage);
}

// TODO: XML FORMAT

// TODO: HTML FORMAT

return injectString(message);
} catch (Exception e) {
e.printStackTrace();
}

return message;
}

private static String injectString(String message) {
if (message.trim().isEmpty() || message.contains("[TraceId]" + TraceContext.getTraceId())) {
return message;
}

String preTrimMessage = "[TraceId]" + TraceContext.getTraceId() + SEPARATOR;
if (Objects.nonNull(TraceContext.getSpanId())) {
preTrimMessage += "[SpanId]" + TraceContext.getSpanId() + SEPARATOR;
}
if (Objects.nonNull(TraceContext.getParentSpanId())) {
preTrimMessage += "[P-SpanId]" + TraceContext.getParentSpanId() + SEPARATOR;
}

return preTrimMessage + message;
}

private static String injectJsonString(String message, String trimMessage) {
if (message.contains(TraceContext.ATO_TRACE_ID) && message.contains(TraceContext.getTraceId())) {
return message;
}

String injectedTraceFields = "\"" + TraceContext.ATO_TRACE_ID + QUOTE_COLON + TraceContext.getTraceId() + "\",";
if (Objects.nonNull(TraceContext.getSpanId())) {
injectedTraceFields = injectedTraceFields
+ "\"" + TraceContext.ATO_SPAN_ID + QUOTE_COLON + TraceContext.getSpanId() + "\",";
}
if (Objects.nonNull(TraceContext.getParentSpanId())) {
injectedTraceFields = injectedTraceFields
+ "\"" + TraceContext.ATO_PARENT_SPAN_ID + QUOTE_COLON + TraceContext.getParentSpanId() + "\",";
}
trimMessage = "{" + injectedTraceFields + trimMessage.substring(1);

return message.endsWith("\n") ? trimMessage + "\n" : trimMessage;
}
}
Loading

0 comments on commit b62af05

Please sign in to comment.