我有一个spring-boot项目,通过SOAP与另一个传统服务进行通信。
我使用spring-boot-starter-web-services (2.0.8.RELEASE)来实现。我需要为来自遗留服务的SOAP响应添加指标(状态码为200的请求数,非200的请求数等)。
我的项目对spring-boot-actuator有依赖性,但不幸的是,我在actuatormicrometer文档中没有找到如何做到这一点。
是否可以为WebServiceTemplate启用指标,它实际上是用来从远程服务发送-接收数据的(类似于actuator为RestTemplateWebClient做的事情),或者我需要为此添加一些自定义代码?
找到解决方案:有 org.springframework.ws.server.endpoint.interceptor.EndpointInterceptorAdapter
拦截requestresponses,所以通过扩展EndpointInterceptorAdapter(或实现EndpointInterceptor),可以添加额外的逻辑,我创建了counter。
Counter.Builder responseStatusCounter = Counter
.builder("soap.server.response")
.baseUnit("responses");
并在 EndpointInterceptorAdapter#afterCompletion
分析SOAP响应并计算错误或成功的响应。
@Override
public void afterCompletion(final MessageContext messageContext,
final Object endpoint, final Exception ex) throws Exception {
WebServiceMessage message = messageContext.getResponse();
SaajSoapMessage saajSoapMessage = (SaajSoapMessage) message;
SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
SOAPBody soapBody = soapEnvelope.getBody();
SOAPFault soapFault = soapBody.getFault();
responseStatusCounter
.description(getDescription(soapFault))
.tags("code", soapFault != null && StringUtils.isNotEmpty(soapFault.getFaultString()) ? "error" : "ok")
.register(meterRegistry)
.increment();
}
对于在应用程序中发送SOAP请求的网络客户端,我使用了 javax.xml.ws.handler.soap.SOAPHandler
:
public boolean handleMessage(final SOAPMessageContext context) {
log.info("Computing response status count");
SOAPMessage message = context.getMessage();
SOAPBody body = message.getSOAPBody();
SOAPFault fault = body.getFault();
responseStatusCounter
.tags("code", fault != null ? "error" : "ok")
.register(meterRegistry)
.increment();
return true;
}