最后更新:

Skywalking采用的Java探针的方式,那么如果我们想达到Zipkin那样自定义Span,或者将traceId加到日志中的功能时该怎么做?

这种方式的缺点是对代码有侵入

1. 打印traceId

添加依赖

<dependency>
  <groupId>org.apache.skywalking</groupId>
  <artifactId>apm-toolkit-logback-1.x</artifactId>
  <version>8.3.0</version>
</dependency>

修改日志

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
	<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
		<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}  [%tid] %msg%n</pattern>
		</layout>
	</encoder>
</appender>
  • encoder的class是LayoutWrappingEncoder,不是PatternLayoutEncoder!

  • 使用%tid 来占trace-id的位置,默认TID:N/A,当有请求调用时,会显示trace-id

启动后我们可以看启动日志

10:21:25.744 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer  [TID:N/A] Tomcat started on port(s): 9001 (http) with context path ''

有请求后我们可以看到日志有了跟踪ID

10:22:50.477 [http-nio-9001-exec-9] INFO  c.g.e.s.c.s.SchoolServiceController  [TID:9dea8fc32c6e436e873c5f9ed155b620.75.16105909704540001] Going to call student service to get data!

2. 将方法加入追踪链路

添加依赖

<dependency>
  <groupId>org.apache.skywalking</groupId>
  <artifactId>apm-toolkit-trace</artifactId>
  <version>8.3.0</version>
</dependency>

在项目中加入Maven依赖之后,就可以使用@Trace来追踪相关方法了。

@Override
@Trace
public String callStudentServiceAndGetData(String schoolname) {
	...
}

可以看到我们加@Trace注解的方法被追踪了。

可以通过@Trace(operationName = "delegateMethod")修改端点名称

我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。实现方式:在方法上增加@Tag或者@Tags。

@Override
@Trace
@Tags({@Tag(key = "schoolname", value = "arg[0]"),
	  @Tag(key = "result", value = "returnedObj")})
public String callStudentServiceAndGetData(String schoolname) {
	...
}

3. 代码中获取traceId

String traceId =  TraceContext.traceId();
Edgar

Edgar
一个略懂Java的小菜比