我有一个 Spring Webflux 微服务,它没有将 traceId 和 spanId 放在特定的日志跟踪中。我的应用程序使用 SOAPHandler 来记录 SOAP 请求/响应。在此跟踪中,未显示 spanId 和 traceId:
15:09:37.260 [reactor-http-nio-5] [traceId:29ad9678dfdec535 spanId:29ad9678dfdec535] DEBUG c.b.c.a.i.s.a.AvailabilityServiceImpl - Find By Filter with HotelAvailabilityFilter HotelAvailabilityFilter(hotelId=7345, startDate=2023-08-10, endDate=2023-08-12, adults=[2], children=[0], childrenAges=null, market=USA, coupons=null, membership=false, device=desktop, groupCode=null)
15:09:37.262 [reactor-http-nio-5] [traceId:29ad9678dfdec535 spanId:29ad9678dfdec535] DEBUG c.b.c.a.i.s.a.c.ChannelConnectClient - Check Availability with HotelAvailabilityFilter HotelAvailabilityFilter(hotelId=7345, startDate=2023-08-10, endDate=2023-08-12, adults=[2], children=[0], childrenAges=null, market=USA, coupons=null, membership=false, device=desktop, groupCode=null)
15:09:37.310 [reactor-http-nio-5] [traceId:29ad9678dfdec535 spanId:29ad9678dfdec535] DEBUG o.s.w.r.f.client.ExchangeFunctions - [4c4697e0] Cancel signal (to close connection)
15:09:37.601 [jaxws-engine-1-thread-1] [traceId: spanId:] DEBUG c.b.c.f.c.s.a.SoapMessageLogger - <?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<S:Header>...
处理程序拦截在我执行请求时启动的 SOAP 消息。要在 Webflux 中执行此操作,我使用下一个代码:
public Mono<...> checkAvailability() {
return Mono.<OTAHotelAvailRS>create(
sink -> ota2004AServiceSoap.checkAvailabilityAsync(otaHotelAvailRQ, into(sink)))
}
private <T> AsyncHandler<T> into(MonoSink<T> sink) {
return res -> {
try {
sink.success(res.get(1, TimeUnit.MILLISECONDS));
} catch (InterruptedException | ExecutionException | TimeoutException e) {
sink.error(e);
}
};
}
ota2004AServiceSoap 是由 org.codehaus.mojo:jaxws-maven-plugin:
自动生成的 SOAP 客户端@WebService(name = "Ota2004AServiceSoap", targetNamespace = "http://synxis.com/OTA2004AService/")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({
ObjectFactory.class
})
@Generated(value = "com.sun.tools.ws.wscompile.WsimportTool", date = "2023-03-01T12:02:37+01:00", comments = "JAX-WS RI 2.3.2")
public interface Ota2004AServiceSoap {
@WebMethod(operationName = "CheckAvailability", action="http://synxis.com/OTA2004AService/CheckAvailability")
public Future<?> checkAvailabilityAsync(
@WebParam(name = "OTA_HotelAvailRQ", targetNamespace = "http://www.opentravel.org/OTA/2003/05", partName = "OTA_HotelAvailRQ")
OTAHotelAvailRQ otaHotelAvailRQ,
@WebParam(name = "CheckAvailabilityResponse", targetNamespace = "", partName = "asyncHandler")
AsyncHandler<OTAHotelAvailRS> asyncHandler);
SOAPHandler,例如,可以是:
@Slf4j
public class SoapMessageLogger implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
log.info("example");
}
}
我尝试在 Handler 中获取跟踪上下文,但不包含 spanId 和 traceId 信息。 我希望我在 Mono 函数中拥有的 spanId 和 traceId 被传播到 SOAPHandler。