2014-10-02 66 views
2

如何测量我的应用程序的HttpClient带宽使用情况? (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 2014-10-03 12:30:22

+0

整个客户端的每秒总字节数(它将进行多个请求/连接/等)。 – Cogman 2014-10-03 15:32:20

回答

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();