gpt4 book ai didi

spring-boot - 有没有办法记录假客户端的响应时间

转载 作者:行者123 更新时间:2023-12-04 00:26:35 24 4
gpt4 key购买 nike

@FeignClient(...)
public interface SomeClient {
@RequestMapping(value = "/someUrl", method = POST, consumes = "application/json")
ResponseEntity<String> createItem(...);

}

有没有办法找到 createItem api 调用的响应时间?我们使用的是spring boot、actuator、prometheus。

最佳答案

我们有直接和定制的方式来记录假装客户端的请求和响应(包括响应时间)。我们必须注入(inject) feign.Logger.Level bean,就是这样。

  1. 默认/直截了当的方式
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.BASIC;
}

有 BASIC、FULL、HEADERS、NONE(默认)日志级别可用 for more details

上面的 bean 注入(inject)会为你提供以下格式的 feign 请求和响应的日志记录:

请求:

refer

log(configKey, "---> %s %s HTTP/1.1", request.httpMethod().name(), request.url());

ex:2019-09-26 12:50:12.163 [DEBUG] [http-nio-4200-exec-5] [com.sample.FeignClient:72] [FeignClient#getUser] ---> END HTTP (0-byte body)

其中 configkey 表示 FeignClientClassName#FeignClientCallingMethodName 例如:ApiClient#apiMethod

回复

refer

log(configKey, "<--- HTTP/1.1 %s%s (%sms)", status, reason, elapsedTime);

ex:2019-09-26 12:50:12.163 [DEBUG] [http-nio-4200-exec-5] [com.sample.FeignClient:72] [FeignClient#getUser] <--- HTTP/1.1 200 OK (341ms)

elapsedTime 是 API 调用所用的响应时间。

注意:如果您更喜欢 feign 客户端日志记录的默认方式,那么我们还必须考虑底层应用程序日志记录级别,因为 feign.Slf4jLogger 类日志记录使用DEBUG 级别 (refer) 的 feign 请求和响应详细信息。如果底层日志记录级别高于 DEBUG,那么您可能需要为 feign 日志记录包/类指定显式记录器,否则它将无法工作。

  1. 自定义方式 如果您更喜欢使用自定义格式进行日志记录,那么您可以扩展 feign.Logger 类并自定义您的日志记录。举个典型的例子,如果我想在单行中将请求和响应的 header 详细信息记录为列表(默认情况下,Logger.Level.HEADERS 在多行中打印 header ):
package com.test.logging.feign;

import feign.Logger;
import feign.Request;
import feign.Response;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

import static feign.Logger.Level.HEADERS;

@Slf4j
public class customFeignLogger extends Logger {

@Override
protected void logRequest(String configKey, Level logLevel, Request request) {

if (logLevel.ordinal() >= HEADERS.ordinal()) {
super.logRequest(configKey, logLevel, request);
} else {
int bodyLength = 0;
if (request.requestBody().asBytes() != null) {
bodyLength = request.requestBody().asBytes().length;
}
log(configKey, "---> %s %s HTTP/1.1 (%s-byte body) %s", request.httpMethod().name(), request.url(), bodyLength, request.headers());
}
}

@Override
protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime)
throws IOException {
if (logLevel.ordinal() >= HEADERS.ordinal()) {
super.logAndRebufferResponse(configKey, logLevel, response, elapsedTime);
} else {
int status = response.status();
Request request = response.request();
log(configKey, "<--- %s %s HTTP/1.1 %s (%sms) %s", request.httpMethod().name(), request.url(), status, elapsedTime, response.headers());
}
return response;
}


@Override
protected void log(String configKey, String format, Object... args) {
log.debug(format(configKey, format, args));
}

protected String format(String configKey, String format, Object... args) {
return String.format(methodTag(configKey) + format, args);
}
}

我们还必须注入(inject) customFeignLogger 类 bean

  @Bean
public customFeignLogger customFeignLogging() {
return new customFeignLogger();
}

如果您是自己构建 FeignClient,那么您可以使用自定义的 logger 构建它:

 Feign.builder().logger(new customFeignLogger()).logLevel(Level.BASIC).target(SomeFeignClient.class,"http://localhost:8080");

关于spring-boot - 有没有办法记录假客户端的响应时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56140774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com