Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

343
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!