0

我需要更好地测量HTTP请求的详细时间(连接时间,到第一个字节的时间,传输时间)。如何在java上正确测量http请求的时间

上下文: 我有一个调用第三方服务的小型Java应用程序(在AWS Lambda上运行)。 作为日志记录表示在处理大的延迟,加入一小片记录的,以便更好地了解,其中延迟是发生:

HttpPost request = new HttpPost("http://www.google.com"); 
HttpClient = HttpClientBuilder.create().build(); 
long startTime = System.currentTimeMillis(); 
HttpResponse baseResponse = internalClient.execute(request); 
long duration = System.currentTimeMillis() - startTime; 

虽然duration寄存器像30秒时,提供者的日志显示1.5秒!

所以我想知道时间在哪里?这怎么测量?

更新:https://blog.josephscott.org/2011/10/14/timing-details-with-curl/

+1

*“是有一个Java HTTP /请求库“* [4。要求我们推荐或查找软件库的问题不属于Stack Overflow](http://stackoverflow.com/help/on-topic)。 – Andreas

+0

我可以改变措辞:“相反,描述问题以及迄今为止解决问题所做的工作。”我就是这么做的。 – upsfeup

回答

0

为了精确测量经过时间在Java中使用nanoTime()如文档System.nanoTime()说:

这个我想有可能使用卷曲数据的例子方法只能用于测量已用时间,并不是与任何其他系统或挂钟时间概念相关的 。返回的值 表示自一些固定但任意的起点 时间(可能在未来,因此值可能为负)后的纳秒。该方法的所有调用在 Java虚拟机的实例中都使用相同的 源;其他虚拟机实例可能会使用不同的来源。

请注意,如果你需要比较在不同的线程调用之间经过的时间,你必须使用currentTimeMillis,为nanoTime不是线程安全的。

编辑:

here

接收头时,请求执行被终止,体内消息后与实体相关联时,完全解决:

EntityUtils.consume(baseResponse.getEntity()); 
+0

问题是测量HTTP请求中的时间:连接时间,到第一个字节的时间,传输时间。请求将在一个线程中完成(除非httpClient自己启动新线程)。 – upsfeup

+0

有趣。所以我实际上至少可以有2个独立的时间:连接和TTFB以及消耗和传输时间。 – upsfeup

+0

@ upsfeup这是正确的。考虑接受答案,如果它解决了你的问题,或者至少,这个特定的问题。 – TMichel