使用时间记录请求

时间:2011-05-20 18:04:00

标签: web-analytics

记录Web应用程序的http请求的最佳方法是什么,包括ajax请求,以便我以后可以回过头来查询“我想知道这个请求发生了多少次,以及完成这个请求需要多长时间平均“,或”显示平均时间最高的5个请求“

您是否会使用当前生产数据库中的单独数据库来记录这些内容,以防止所有这些插入导致IO减速,或者这最终是否真的没有产生重大影响?

您是否会批量处理请求然后推送到数据库,还是会为每个请求执行一次插入?

除了在应用程序逻辑中包装每个请求处理程序之外,是否有更好的方法来添加此请求登录时间,如下所示:

start = CurrentTime()
/* request handler code */
end = CurrentTime()
Insert(requestName, start, (end - start))

3 个答案:

答案 0 :(得分:4)

您应该能够将Web服务器日志用于此目的。 Apache和IIS记录捕获URL,查询字符串,响应代码和持续时间。如果AJAX请求通过HTTP POST接收数据,则需要更改Web服务器的配置以捕获该数据(如果它对您很重要)。然后,我发现用于日志分析的最佳工具是Microsoft's Log Parser,它可以很好地处理带有SQL语法的大型文件,以计算您要问的各种问题的答案。

但是,如果您打算自己滚动,请使用某种本地日志记录。并使用日志框架 - 例如log4J - 它足够智能缓冲磁盘写入以最小化I / O,滚动日志文件和删除旧文件。这是针对群集服务器的更具可扩展性的方法,否则每个服务器都会不断地访问数据库。如果要将数据放入表中,请将其作为批处理过程,例如每小时或每天一次。

答案 1 :(得分:2)

似乎是Google Analytics的一个很好的用例(特别参见event tracking)。

如果不是一种选择,请尽早考虑可扩展性:

  1. 不要在您正在服务的服务器页面内进行登录,因为这最终可能会阻止缓存。使用脚本或1x1图像来输入参数,并使其在单独的(非缓存)过程中运行。

  2. 如果您最终使其基于数据库,请避免锤击您的硬盘。使用基于内存的存储来存储统计信息,并定期将其内容保存到数据库中。 (回想一下,当谷歌最初打开它时谷​​歌分析不堪重负。)

答案 2 :(得分:1)

如果您的目标是简单地跟踪请求的时间并将其保存到数据库,但您不希望插入可能使您的请求陷入困境,那么您应该使用支持高速插入的数据库,例如{ {3}}。如果将连接字符串调整为strict mode = off,则插入基本上是异步的。

这是一个很好的起点:

MongoDB

如果您只在ASP.NET MVC上执行此操作,那么您可以将其与自定义操作过滤器放在一起,并将其从控制器代码中删除。我想你也可以使用自定义ASP.NET模块实现这一点,并在IIS 7 +中获取所有请求(甚至是非ASP.NET)。

如果你不喜欢NoSQL / MongoDB,你可以使用SqlCommand.BeginExecuteNonQuery进行插入而不是阻塞调用。如果您插入与生产相同的数据库,但可能会导致某些争用。