2017-10-29 9 views
0

私は春の起動を使用してAPIを実装しており、さまざまなAPI呼び出し(GET、POST、DELETE、PUT)の応答時間を追跡したい。春の起動時にフィルタを使用して応答時間を追跡する

現在、私はフィルタ

@Component 
public class timeFilter implements Filter { 

    private static final Logger LOGGER = LoggerFactory.getLogger(timeFilter.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 
    } 
} 

として、次のコードを使用しようとしてきたが、これは私のリポジトリからすべての生徒を取得GET呼び出しの応答時間を追跡します。

他のコールの応答時間を追跡できるだけでなく、各コールの応答時間をグラフにプロットする必要がある方法がありますか。また、私の最初のGET呼び出しが約200-300 MSの応答時間を持っていますが、その後の呼び出しには0-20の応答時間がある理由もありますか?

+0

は、ばねブートstarter- '追加しますアクチュエーター 'と呼ばれ、すぐに使用可能なメトリックとして提供されます。あなた自身で書く必要はありません。 –

答えて

0

春のOncePerRequestFilterと一緒に作業する必要があります。 このコンポーネントがスキャンされていることを確認してください。

私はまた、あなたがクエリのparamsを含める必要があり、同じヘッダーのために行く場合は、あなたがコントロールすることができ、ダイナミックプロパティtestproject.logging.includeQueryParams、などがあり、ここで注意..

import java.io.IOException; 

import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.http.server.ServletServerHttpRequest; 
import org.springframework.stereotype.Component; 
import org.springframework.web.filter.OncePerRequestFilter; 

/** 
* Implementation of Spring's {@link OncePerRequestFilter} to log each request 
* including the URI, query String and execution time. 
*/ 

@Component 
public class RequestLoggingInterceptor extends OncePerRequestFilter { 

    /** {@code Logger} instance. */ 
    private final Logger logger = LoggerFactory.getLogger(RequestLoggingInterceptor.class); 

    /** {@code true} if query parameters should be logged. */ 
    private boolean includeQueryParams = true; 
    /** {@code true} if client address should be logged. */ 
    private boolean includeClient = true; 
    /** {@code true} if request headers should be logged. */ 
    private boolean includeHeaders = true; 


    @Override 
    protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) throws ServletException, IOException { 
     final long start = System.nanoTime(); 
     try { 
      filterChain.doFilter(request, response); 
     } finally { 
      if(logger.isInfoEnabled()) { 
       final long end = System.nanoTime(); 
       logger.info(buildMessage(request, end - start)); 
      } 
     } 
    } 

    /** 
    * Builds the message to log from the specified {@code request} including 
    * the {@code executionTime}. 
    * 
    * @param request 
    * @param executionTime in nanoseconds 
    * @return log message 
    */ 
    private String buildMessage(final HttpServletRequest request, final long executionTime) { 
     final StringBuilder buffer = new StringBuilder(); 
     buffer.append("method=").append(request.getMethod()); 
     buffer.append(" uri=").append(request.getRequestURI()); 

     if(includeQueryParams && request.getQueryString() != null) { 
      buffer.append('?').append(request.getQueryString()); 
     } 

     buffer.append(" executionTime=").append(executionTime); 
     return buffer.toString(); 
    } 

    /** 
    * Sets whether to {@code include} the query parameter String when logging 
    * the request URI. 
    * 
    * @param include 
    */ 
    @Value("${testproject.logging.includeQueryParams:true}") 
    public void setIncludeQueryParams(final boolean include) { 
     includeQueryParams = include; 
    } 
} 
関連する問題