我正在寻找创建一个可以给我两件事的过滤器:请求pr分钟数和平均响应时间pr分钟。我已经获得了个人阅读,我只是不确定如何添加它们。
我的过滤器捕获每个请求,并记录每个请求所需的时间:
public void doFilter(ServletRequest request, ...()
{
long start = System.currentTimeMillis();
chain.doFilter(request, response);
long stop = System.currentTimeMillis();
String time = Util.getTimeDifferenceInSec(start, stop);
}
此信息将用于创建一些漂亮的Google Chart图表。我不想将数据存储在任何数据库中。只是一种在请求时获取当前数字的方法
因为这是一个大批量的应用程序;低开销是必不可少的。
我假设我的应用程序服务器不提供此信息。
答案 0 :(得分:1)
我曾做过类似的事情。如果我记得很清楚,我有类似
的东西public class StatisticsFilter implements ...
{
public static Statistics stats;
public class PeriodicDumpStat extends Thread
{
...
}
public void doFilter(ServletRequest request, ...()
{
long start = System.currentTimeMillis();
chain.doFilter(request, response);
long stop = System.currentTimeMillis();
stats.add( stop - start );
}
public void init()
{
Thread t = new PeriodicDumpStat();
t.setDaemon( true );
t.start();
}
}
(那只是一幅草图)
确保Statistics
对象正确同步,因为它将同时访问。
我有一个后台DumpStatistics
线程,它定期将统计信息转储到XML文件中,以便稍后处理。为了更好的封装,我将线程作为内部类。您当然也可以使用Runnable
。正如@Trevor Tippins指出的那样,将线程标记为daemon thread也是一件好事。
我还使用了谷歌图表,实际上还有另一个ShowStatisticsServlet
,可以传播XML文件并将数据转换为漂亮的图表。 servlet不依赖于过滤器,而只依赖于XML文件,因此两者实际上都是分离的。可以使用File.createTempFile
将XML文件创建为temporary file。 (另一种变体当然是将所有数据保存在内存中,但存储数据对于我们备份性能测试结果并稍后进行分析非常方便)
一位同事声称Statistics
对象中的同步会“杀死”应用程序性能,但实际上它实在是可以忽略不计。转储文件的开销也是如此,因为它每10秒左右完成一次。
希望它有所帮助,或者给你一些想法。
PS:正如@William Louth评论的那样,只有在无法解决现有解决方案的问题时,才应编写此类基础架构代码。就我而言,我还在对代码的内部时间进行基准测试,而不仅仅是完整的请求处理时间。