2014-10-02 2 views
2

내 앱의 HttpClients 대역폭 사용을 어떻게 측정 할 수 있습니까? (HttpComponents 4.3)Apache HttpComponents HttpClient로 대역폭 사용량 측정

HttpClient를 사용하여 서버와 통신하는 클라이언트 응용 프로그램이 있습니다. 모든 요청은 풀링 HTTP 연결 관리자를 사용하여 동일한 클라이언트를 통해 수행됩니다. 불행히도 대부분의 요청은 httpclient를 직접 (모든 요청이 아닌) 사용하므로 요청 위치의 대역폭을 측정 할 수는 있지만 고통이됩니다.

클라이언트의 생성자 또는 연결 관리자에 간단히 자신의 대역폭 모니터를 삽입 할 수있는 장소가 있습니까 (아니면 이미 발견되지 않은 어딘가에 이미 구축되어 있습니까?).

이 작업을 수행 할 수 있습니까?

HttpClientBuilder.create().addInterceptorLast(new HttpResponseInterceptor() 
    { 

     @Override 
     public void process(HttpResponse response, HttpContext context) throws HttpException, IOException 
     { 

     } 
    }).build(); 
+0

측정하려는 정확도는 무엇입니까? 전송 된 총 바이트 수 연결 당 전송 된 총 바이트 수 요청 당 바이트? 초당? – oleg

+0

전체 클라이언트의 초당 총 바이트 수 (여러 요청/연결 수/등). – Cogman

답변

4

사용자 정의 HttpRequestExecutor해야 아마도 가장 편리한 차단 점

이것은 매우 원유 솔루션입니다하지만 난 당신이 처음 사용하기에 충분한 바랍니다.

final AtomicLong totalBytes = new AtomicLong(); 

HttpRequestExecutor requestExecutor = new HttpRequestExecutor() { 

    @Override 
    protected HttpResponse doSendRequest(
      final HttpRequest request, 
      final HttpClientConnection conn, 
      final HttpContext context) throws IOException, HttpException { 
     HttpResponse response = super.doSendRequest(request, conn, context); 
     HttpConnectionMetrics metrics = conn.getMetrics(); 
     totalBytes.addAndGet(metrics.getSentBytesCount()); 
     metrics.reset(); 
     return response; 
    } 

    @Override 
    protected HttpResponse doReceiveResponse(
      final HttpRequest request, 
      final HttpClientConnection conn, 
      final HttpContext context) throws HttpException, IOException { 
     HttpResponse response = super.doReceiveResponse(request, conn, context); 
     HttpConnectionMetrics metrics = conn.getMetrics(); 
     totalBytes.addAndGet(metrics.getReceivedBytesCount()); 
     metrics.reset(); 
     return response; 
    } 
}; 

CloseableHttpClient httpclient = HttpClients 
     .custom() 
     .setRequestExecutor(requestExecutor) 
     .build();