Мониторинг показателей загрузки веб-сервисов Spring - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть проект начальной загрузки, который связывается с другой устаревшей службой через SOAP.

Для этого я использую web-сервисы spring-boot-starter-web-services (2.0.8.RELEASE). Мне нужно добавить метрики для SOAP ответа от унаследованной службы (количество запросов с кодом состояния 200, не-200 и т. Д. c.)

Мой проект зависит от подпружиненной загрузки-привода, но, к сожалению, я не нашел ничего в документации привода / микрометра, как это сделать.

Возможно ли включить метрики для WebServiceTemplate, которые фактически используются для отправки / получения данных от удаленных сервисов (что-то похожее, что актуатор делает для RestTemplate / WebClient) или мне нужно добавить собственный код для этого?

1 Ответ

0 голосов
/ 04 мая 2020

Найденное решение: 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;
}
...