我的Web应用程序架构是:Apache 2(作为负载均衡器)+ JBoss 3.2.3 + MySQL 5.0.19。
我想:测量仅在JBoss服务器上花费的请求处理时间(针对每个单独的请求)(即,排除在Web和数据库服务器上花费的时间。
我一直在研究如何仅在应用程序层上记录请求处理时间。我发现* mod_JK logging *,* Apache的mod_log_config *和Tomcat AccessLogValve 是两种可能的方法。
使用* mod_JK logging *:我理解mod_jk日志记录为每个请求提供请求处理时间,并计算请求离开Apache服务器的时间与Apache服务器收到相应响应的时间之间的时间差。如果这不准确/正确,请纠正我。
使用Apache的mod_log_config模型(http://www.lifeenv.gov.sk/tomcat-docs/jk/config/apache.html):在LogFormat(JKLogFile构造)构造中添加“%{JK_REQUEST_DURATION} n”(参见上面的链接)。 “JK_REQUEST_DURATION”从Apache角度捕获整体Tomcat处理时间。
时间(在上述情况下)包括Tomcat / JBoss + MySQL处理时间。在我的情况下它没有帮助,因为它包括MySQL处理时间 - 我想仅在JBoss上记录请求处理时间。有什么建议/想法值得赞赏吗?
使用 AccessLogValve :它可以通过在AccessLogValve XML构造的pattern属性中设置%D来记录“以毫秒为单位处理请求所需的时间”。这不是很清楚
任何想法/线索?
这是我想分享的经验/研究。如果有人有类似的问题/知道一种方法来分享他们的经验/指针/想法,可以找到更好的解决方案,将不胜感激。
期待您的想法/建议
答案 0 :(得分:0)
为什么要排除数据库时间?在数据库上花费的时间是应用程序等待的时间,就像等待其他资源一样,例如lucene索引完成,远程http请求完成等。
如果您确实要排除数据库访问时间,则需要使用计时器启动/停止指令来检测应用程序。这肯定需要进入你的应用程序(通过AOP“干净地”或通过app中的关键点的启动/停止语句手动)并且不能简单地来自外部世界的配置(例如apache模块)。
因此,当您在处理链的最开始(过滤器在此处运行良好)时收到请求时,您需要启动计时器,并在每次发送查询时停止。然后在查询后再次重新开始。这当然不能100%完成,特别是在你使用透明的ORM如hibernate的情况下。那是因为有时你可能间接地执行查询,即通过普通Java遍历集合或关联时。
答案 1 :(得分:0)
我认为您正在寻找分析工具,例如java visualVM,JProfiler或其他..