Search code examples
javaspring-bootsoapmetrics

Spring boot web services metrics monitoring


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?


Solution

  • 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;
    }