由于SpringCloudGateway是基于WebFlux来实现的,需要进到skywalking的agent目录,将optional-plugins目录底下的以下两个jar包复制到plugins目录
org.apache.skywalking
apm-toolkit-log4j-2.x
${skywalking.version}
org.apache.skywalking
apm-toolkit-trace
${skywalking.version}
[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%traceId] [%logger{36}] [%thread] [%-5level] %msg%n
新增启动参数
-javaagent:D:workskywalking-agentskywalking-agent.jar=agent.service_name=xxx
-Dskywalking.collector.backend_service=xxx:11800
启动程序后,尝试通过网关进行接口调用,可以在Skywalking-ui上看到链路已经串起来了
但是有个问题,日志里记录的日志始终不显示正确的TID
[2022-06-15 14:53:19.958] [TID: N/A]
查看Skywalking-agent的源码,可以看到,在apm-spring-webflux-5.x-plugin-8.10.0.jar插件里,拦截了org.springframework.web.reactive.DispatcherHandler的handle方法
拦截器里往reactor的调用链路里,放入 < SKYWALKING_CONTEXT_SNAPSHOT - ContextSnapshot >
所以traceId可以从reactor的context里获取到
public static Consumer> logOnNext(Consumer logStatement) {
return signal -> {
if (!signal.isOnNext()) return; (1)
Optional toPutInMdc = signal.getContext().getOrEmpty("CONTEXT_KEY"); (2)
toPutInMdc.ifPresentOrElse(tpim -> {
try (MDC.MDCCloseable cMdc = MDC.putCloseable("MDC_KEY", tpim)) { (3)
logStatement.accept(signal.get()); (4)
}
},
() -> logStatement.accept(signal.get())); (5)
};
}
@GetMapping("/byPrice")
public Flux byPrice(@RequestParam Double maxPrice, @RequestHeader(required = false, name = "X-UserId") String userId) {
String apiId = userId == null ? "" : userId; (1)
return restaurantService.byPrice(maxPrice))
.doOnEach(logOnNext(r -> LOG.debug("found restaurant {} for ${}", (2)
r.getName(), r.getPricePerPerson())))
.contextWrite(Context.of("CONTEXT_KEY", apiId)); (3)
}
equals{pattern}{test}{substitution}
equalsIgnoreCase{pattern}{test}{substitution}
@Component
public class LogHooks {
private static final String KEY = "logMdc";
@PostConstruct
@SuppressWarnings("unchecked")
public void setHook() {
reactor.core.publisher.Hooks.onEachOperator(KEY,
Operators.lift((scannable, coreSubscriber) -> new MdcSubscriber(coreSubscriber)));
}
@PreDestroy
public void resetHook() {
reactor.core.publisher.Hooks.resetOnEachOperator(KEY);
}
}
public class MdcSubscriber implements CoreSubscriber {
private static final String TRACE_ID = "traceId";
private static final String SKYWALKING_CTX_SNAPSHOT = "SKYWALKING_CONTEXT_SNAPSHOT";
private final CoreSubscriber
页面更新:2024-03-01
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号