原文网址:SkyWalking--用代码手动获取traceId的方法_IT利刃出鞘的博客-CSDN博客
简介
本文介绍Java项目如何用代码手动获取SkyWalking的traceId。
引入依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<!-- 当前的最新版本,请与安装的服务器版本对应 -->
<version>8.7.0</version>
</dependency>
代码获取traceId
在想获取traceId的地方加@Trace注解,然后调用TraceContext.traceId。
例:
@PostMapping("create")
@Trace
public Result create(Order order) {
orderService.create(order);
String traceId = TraceContext.traceId();
return new Result().message("创建订单成功");
}
Trace所在包:import org.apache.skywalking.apm.toolkit.trace.Trace;
TraceContext所在包:import org.apache.skywalking.apm.toolkit.trace.TraceContext;
TraceContext可以获得spanId等其他信息:
项目应用
实际上,项目中不需要每个方法都加@Trace这个注解来获得traceId,只需要在全局响应的地方来获取即可。
下边展示项目中的实际用法(我是实测过的,可以获取到traceId)。
package com.example.common.advice;
import com.example.common.entity.Result;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@Slf4j
@ControllerAdvice
public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType,
Class<? extends HttpMessageConverter<?>> converterType) {
// 若接口返回的类型本身就是ResultWrapper,则无需操作,返回false
// return !returnType.getParameterType().equals(ResultWrapper.class);
return true;
}
@Override
@ResponseBody
@Trace
public Object beforeBodyWrite(Object body, MethodParameter returnType,
MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
String traceId = TraceContext.traceId();
if (body instanceof String) {
// 若返回值为String类型,需要包装为String类型返回。否则会报错
try {
ObjectMapper objectMapper = new ObjectMapper();
Result<Object> result = new Result<>().data(body).traceId(traceId);
return objectMapper.writeValueAsString(result);
} catch (JsonProcessingException e) {
throw new RuntimeException("序列化String错误");
}
} else if (body instanceof Result) {
return ((Result)body).traceId(traceId);
}
return new Result<>().traceId(traceId).data(body);
}
}
其他网址
skywalking获取traceId(tid)的方式_lijunwyf的专栏-CSDN博客
skywalking04 - skywalking自定义链路追踪@Trace_过了这个村没这个老王的博客-CSDN博客