Как зарегистрировать запрос Spring-webflux WebClient + подробности ответа (тела, заголовки, elasped_time)? - PullRequest
1 голос
/ 15 мая 2019

По сути, я хочу записать информацию о запросе / ответе в один журнал, содержащий тела / заголовки, с пружиной WebClient.

С пружиной RestTemplate мы можем сделать это с ClientHttpRequestInterceptor. Я нахожу около ExchangeFilterFunction для весны WebClient, но не смог сделать что-то подобное в чистом виде. Мы можем использовать этот фильтр и регистрировать запрос И затем ответ, но мне нужны оба в одной трассировке журнала.

Более того, мне не удалось получить тело ответа методом ExchangeFilterFunction.ofResponseProcessor.

Я ожидаю такой журнал (текущая реализация работает с ClientHttpRequestInterceptor) со всей необходимой мне информацией:

{
    "@timestamp": "2019-05-14T07:11:29.089+00:00",
    "@version": "1",
    "message": "GET https://awebservice.com/api",
    "logger_name": "com.sample.config.resttemplate.LoggingRequestInterceptor",
    "thread_name": "http-nio-8080-exec-5",
    "level": "TRACE",
    "level_value": 5000,
    "traceId": "e65634ee6a7c92a7",
    "spanId": "7a4d2282dbaf7cd5",
    "spanExportable": "false",
    "X-Span-Export": "false",
    "X-B3-SpanId": "7a4d2282dbaf7cd5",
    "X-B3-ParentSpanId": "e65634ee6a7c92a7",
    "X-B3-TraceId": "e65634ee6a7c92a7",
    "parentId": "e65634ee6a7c92a7",
    "method": "GET",
    "uri": "https://awebservice.com/api",
    "body": "[Empty]",
    "elapsed_time": 959,
    "status_code": 200,
    "status_text": "OK",
    "content_type": "text/html",
    "response_body": "{"message": "Hello World!"}"
}

Кто-нибудь может сделать что-то подобное с Spring WebClient? Или как отследить проблему запроса / ответа с Spring WebClient?

1 Ответ

0 голосов
/ 22 мая 2019

Вы можете использовать filter (), что-то вроде этого:

this.webClient = WebClient.builder().baseUrl("your_url")
            .filter(logRequest())
            .filter(logResponse())
            .build();

private ExchangeFilterFunction logRequest() {
    return (clientRequest, next) -> {
        log.info("Request: {} {}", clientRequest.method(), clientRequest.url());
        clientRequest.headers()
                .forEach((name, values) -> values.forEach(value -> log.info("{}={}", name, value)));
        return next.exchange(clientRequest);
    };
}

private ExchangeFilterFunction logResponse() {
    return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
        log.info("Response: {}", clientResponse.headers().asHttpHeaders().get("property-header"));
        return Mono.just(clientResponse);
    });
}
...