I have a spring-boot project that communicates with another legacy service via SOAP.
To do that I am using spring-boot-starter-web-services (2.0.8.RELEASE). I need to add metrics for SOAP response from legacy service (number of requests with status code 200, non-200, etc.)
My project has a dependency on spring-boot-actuator, but unfortunately, I found nothing in actuator/micrometer documentation how to do that.
Is it possible to enable metrics for WebServiceTemplate that is actually used for sending/receiving data from remote services (something similar that actuator does for RestTemplate/WebClient) or I need to add some custom code for this?
Found solution:
There is org.springframework.ws.server.endpoint.interceptor.EndpointInterceptorAdapter
that intercepts requests/responses, so by extending EndpointInterceptorAdapter (or implementing EndpointInterceptor) additional logic can be added.
I created counter:
Counter.Builder responseStatusCounter = Counter
.builder("soap.server.response")
.baseUnit("responses");
and in EndpointInterceptorAdapter#afterCompletion
analyse SOAP response and count either error or success responses:
@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();
}
For web client, that sends SOAP requests in application, I use 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;
}