2014-10-02 3 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

Что вы _exactly_ пытаетесь измерить? Общее количество переданных байтов? Общее количество байтов, переданных за соединение? Байты за запрос? В секунду? – 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();