Spring 启动 Web 服务指标监控

Spring boot web services metrics monitoring

我有一个 spring-boot 项目,它通过 SOAP 与另一个遗留服务通信。

为此,我使用 spring-boot-starter-web-services (2.0.8.RELEASE)。我需要为来自遗留服务的 SOAP 响应添加指标(状态代码为 200、非 200 等的请求数)

我的项目依赖于 spring-boot-actuator,但不幸的是,我在 actuator/micrometer 文档中找不到任何相关信息。

是否可以为 WebServiceTemplate 启用指标,该指标实际上用于来自远程服务的 sending/receiving 数据(类似于执行器为 RestTemplate/WebClient 所做的事情),或者我需要为此添加一些自定义代码?

找到解决方案: 有 org.springframework.ws.server.endpoint.interceptor.EndpointInterceptorAdapter 拦截 requests/responses,因此通过扩展 EndpointInterceptorAdapter(或实现 EndpointInterceptor)可以添加额外的逻辑。 我创建了计数器:

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 请求的 Web 客户端,我使用 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;
}