我正在寻找支持按请求分析统计信息的分析器,最好是沿着程序流(而不是通常的线程调用堆栈)。因此,基本上每个请求都有一个探查器调用堆栈+顺序调用视图,如下所示:
doGet 100ms
+ doFilter 95ms
+ doFilter2 90ms
+ validateValues 20ms
+ calculateX 40ms
+ calc1 10ms
+ calc2 30ms
+ renderResponse 30ms
哪些类/方法是以某种方式配置的,对于处理每个方法调用的跟踪探查器来说,这当然是不可用的。
我知道并使用过dynaTrace,它的"PurePath"功能(http://www.dynatrace.com/en/architecture-tame-complexity-with-purepath.aspx)支持这一点,但我正在寻找在较小项目中可用的工具,并且需要较少的初始投资和设置。
是否有任何"经典"探查器(YourKit等)支持此功能,而我忽略了此功能?
附录:提供一些背景:主要目标是为生产中的系统的监控和分析提供统计数据。首先,我们的想法是实时统计请求需要多长时间,以防响应时间增加,从而获得某些(类型)请求的数据(想想JETM+x)。
每个请求的分析统计数据可以详细分析为什么只有一些请求很慢,例如,如果10%的请求花费的时间是您平均值的十倍。对于汇总统计数据,这是AFAIK非常难以解决的问题。
在程序流中呈现调用的分析统计信息也是如此,因为很容易确定问题所在,例如,一个方法执行十个DB查询,您将每个调用视为一个单独的调用,而不仅仅是十个聚合调用。
理想情况下,在运行时配置和启用/禁用测量点。
您可以尝试btrace进行选择性测量。它有点类似于dtrace,如果您在受支持的平台Solaris、BSD、OS X上,也可以使用它。
如果你的应用程序计时毫秒,你可以有一个时间图来展示TreeMap,你可以总结并写入文件。这是最灵活的,适用于毫秒计时。
对于微秒计时,我为每个阶段都有一个枚举值,然后在ThreadLocal数组中记录达到该阶段时的当前时间(System.nanoTime())。(无对象分配)请求完成后,将时间增量写入一个文件,例如CSV格式。
我的方法类似于Peter的方法,但当执行到感兴趣的阶段时,我不会使用线程局部程序和在线计算,而是写入日志文件。此外,我使用AspectJ生成日志行,我发现这对于随意添加/删除日志行非常方便,而无需更改其他源代码。