Найденное решение: org.springframework.ws.server.endpoint.interceptor.EndpointInterceptorAdapter
перехватывает запросы / ответы, поэтому путем расширения EndpointInterceptorAdapter (или реализации EndpointInterceptor) можно добавить дополнительные логики c. Я создал счетчик:
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;
}