Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

348
Visualizações
¿Cómo registrar el tiempo que toma el servicio web Rest en Spring Boot?

Estoy escribiendo un servicio web web Rest usando Spring Boot .

Quiero registrar el tiempo que tarda mi servicio web en procesar la solicitud. También quiero registrar encabezados, métodos y URI llamados.

Hice algo similar en mi servicio web de jersey hace unos meses usando el método ContainerRequestFilter and ContainerResponseFilter filter() method.

Además, ¿AOP es mejor o filtro?

about 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

¿Has probado con un filtro básico como este?

 import java.io.IOException; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component @WebFilter("/*") public class StatsFilter implements Filter { private static final Logger LOGGER = LoggerFactory.getLogger(StatsFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { // empty } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { long time = System.currentTimeMillis(); try { chain.doFilter(req, resp); } finally { time = System.currentTimeMillis() - time; LOGGER.trace("{}: {} ms ", ((HttpServletRequest) req).getRequestURI(), time); } } @Override public void destroy() { // empty } }

EDITADO: (Gracias @suren-aznauryan) Ahora, usa Instant y Duration y evita System.currentTimeMillis() .

 import java.io.IOException; import java.time.Duration; import java.time.Instant; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component @WebFilter("/*") public class StatsFilter implements Filter { private static final Logger LOGGER = LoggerFactory.getLogger(StatsFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { // empty } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { Instant start = Instant.now(); try { chain.doFilter(req, resp); } finally { Instant finish = Instant.now(); long time = Duration.between(start, finish).toMillis(); LOGGER.trace("{}: {} ms ", ((HttpServletRequest) req).getRequestURI(), time); } } @Override public void destroy() { // empty } }
about 4 years ago · Santiago Trujillo Relatório

0

Arranque de resorte: interceptor de registro

 public class ApiLogger extends HandlerInterceptorAdapter { private static final Logger logger = LoggerFactory .getLogger(ApiLogger.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestId = UUID.randomUUID().toString(); log(request,response, requestId); long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); request.setAttribute("requestId", requestId); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { super.afterCompletion(request, response, handler, ex); long startTime = (Long)request.getAttribute("startTime"); long endTime = System.currentTimeMillis(); long executeTime = endTime - startTime; logger.info("requestId {}, Handle :{} , request take time: {}",request.getAttribute("requestId"), handler, executeTime); } private void log(HttpServletRequest request, HttpServletResponse response, String requestId) { logger.info("requestId {}, host {} HttpMethod: {}, URI : {}",requestId, request.getHeader("host"), request.getMethod(), request.getRequestURI() ); } }

interceptor de registro:

 @Configuration @EnableWebMvc public class AppConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new ApiLogger()).addPathPatterns("/api/v1/*"); } }
about 4 years ago · Santiago Trujillo Relatório

0

La respuesta de David es correcta: el filtro es una buena manera de implementar dicha funcionalidad en Spring Boot.

Spring Boot tiene un punto final incorporado que devuelve la información sobre las últimas 100 solicitudes, como se muestra a continuación:

 [{ "timestamp": 1394343677415, "info": { "method": "GET", "path": "/trace", "headers": { "request": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Connection": "keep-alive", "Accept-Encoding": "gzip, deflate", "User-Agent": "Mozilla/5.0 Gecko/Firefox", "Accept-Language": "en-US,en;q=0.5", "Cookie": "_ga=GA1.1.827067509.1390890128; ..." "Authorization": "Basic ...", "Host": "localhost:8080" }, "response": { "Strict-Transport-Security": "max-age=31536000 ; includeSubDomains", "X-Application-Context": "application:8080", "Content-Type": "application/json;charset=UTF-8", "status": "200" } } } },{ "timestamp": 1394343684465, ... }]

Si su aplicación está llamando a otros servicios o consultando la base de datos, considere usar Sniffy para la creación de perfiles: le mostrará no solo el tiempo dedicado a su servidor, sino también el tiempo dedicado a llamar a los sistemas posteriores. Vea una demostración en vivo aquí (consulte el widget negro en la esquina superior inferior).

Descargo de responsabilidad: soy el autor de Sniffy

Captura de pantalla de demostración de Sniffy

about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda