Java J2EE フィルタでWebアプリ・ページのロード時間を計測してみる
2009/08/06 16:40Update
Webページの表示が遅い、ボトルネックはどこ?ネットワークそれともページの処理?このようにWebページのロード時間を正確的に測りたいときがあります。
1)WebコンテンツはJSPなどのテンプレート技術で動的に生成されている
2)Webページのロード時間が長い、どこがボトルネックを知りたい
3)Webページの正確的なロード時間を測りたい
4)ある時間段のWebページの平均ロード時間
などの場合、Webページのロード時間を正確的に測ってログに出力し、統計データとして利用したらどうでしょう。
本文は、J2EEフィルタで、Java Webアプリのページのロード時間を計測してみます。
実装方法としては、
コアJ2EEパターン - Front Controllerパターン
コアJ2EEパターン - Intercepting Filterパターン
などの方法があると考えられます。
本文は、Intercepting Filterパターンで実装してみます。
CalcPageLoadingTimeFilter.java
web.xml
実際に出力されるログ例
Java Servletフィルタ実装手順
Webページのロード時間の外部計測ツール
コアJ2EEパターン - Intercepting Filterパターン
2)Webページのロード時間が長い、どこがボトルネックを知りたい
3)Webページの正確的なロード時間を測りたい
4)ある時間段のWebページの平均ロード時間
などの場合、Webページのロード時間を正確的に測ってログに出力し、統計データとして利用したらどうでしょう。
本文は、J2EEフィルタで、Java Webアプリのページのロード時間を計測してみます。
実装方法としては、
コアJ2EEパターン - Front Controllerパターン
コアJ2EEパターン - Intercepting Filterパターン
などの方法があると考えられます。
本文は、Intercepting Filterパターンで実装してみます。
CalcPageLoadingTimeFilter.javaimport java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** Webページのロード時間計測・フィルタ **/
public class CalcPageLoadingTimeFilter implements Filter {
/*
* (non Javadoc)
*
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
* javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Log log = LogFactory.getLog(CalcPageLoadingTimeFilter.class);
Date startTime = Calendar.getInstance().getTime();
long startTimeLong = Calendar.getInstance().getTimeInMillis();
String uri = ((HttpServletRequest) request).getRequestURI();
boolean logTime = false;
if (uri.indexOf(".jsp") > 0) { //Webページロード時間のログ出力条件
logTime = true;
}
if (logTime) {
log.info("[TIME-CALC]URI:" + uri);
String formatedTime = formatDate(startTime,
"yy.MM.dd HH:mm:ss");
log.info("[TIME-CALC]Start:" + formatedTime);
}
try {
chain.doFilter(request, response);
} finally {
Date endTime = Calendar.getInstance().getTime();
long endTimeLong = Calendar.getInstance().getTimeInMillis();
if (logTime) {
String formatedTime = formatDate(endTime,
"yy.MM.dd HH:mm:ss");
log.info("[TIME-CALC]End:" + formatedTime);
log.info("[TIME-CALC]Total:" + (endTimeLong - startTimeLong)
+ "ms. " + (endTimeLong - startTimeLong) / 1000 + "s.");
}
}
}
private static final String formatDate(Date date, String pattern) {
DateFormat df =
new SimpleDateFormat(pattern);
return df.format(date);
}
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
}
web.xml<!-- 抜粋 --> ... <!-- Filter --> <filter> <filter-name>CalcPageLoadingTimeFilter</filter-name> <filter-class>CalcPageLoadingTimeFilter</filter-class> </filter> <!-- filter-mapping --> <filter-mapping> <filter-name>CalcPageLoadingTimeFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ...
実際に出力されるログ例
... 2009-07-29 17:16:22,565 INFO [http-8080-Processor25] filter.CalcPageLoadingTimeFilter (CalcPageLoadingTimeFilter.java:44) - [TIME-CALC]URI:/some.jsp 2009-07-29 17:16:22,736 INFO [http-8080-Processor25] filter.CalcPageLoadingTimeFilter (CalcPageLoadingTimeFilter.java:47) - [TIME-CALC]Start:08.02.29 17:16:22 ... ... 2009-07-29 17:16:29,080 INFO [http-8080-Processor25] filter.CalcPageLoadingTimeFilter (CalcPageLoadingTimeFilter.java:58) - [TIME-CALC]End:08.02.29 17:16:29 2009-07-29 17:16:29,080 INFO [http-8080-Processor25] filter.CalcPageLoadingTimeFilter (CalcPageLoadingTimeFilter.java:61) - [TIME-CALC]Total:6515ms. 6s. ...
参考資料
Java Servletフィルタ実装手順
Webページのロード時間の外部計測ツール
コアJ2EEパターン - Intercepting Filterパターン
Sponsored Link
Comments
- Relative Articles
- Java開発及び実行環境の構築 | Linux篇 - (2008/08/31 20:34)
- Java開発及び実行環境の構築 | Windows篇 - (2008/08/31 21:18)
- 5分でJava Hello World! - (2008/08/31 22:13)
- Java言語の制御構文 - 条件分岐if/else/else if - (2008/10/01 21:30)
- Java言語の繰り返し制御構文 - for文 - (2008/10/03 18:22)
- Java言語の繰り返し制御構文 - do ... while文 - (2008/10/03 21:23)
- Java言語の繰り返し制御構文 - while文 - (2008/10/03 21:32)
- Java言語の基礎 - javacコマンドによるコンパイル - (2008/10/10 17:58)
- Java アクセス修飾子概要 - (2008/10/29 18:31)
- Javaアノテーション機能 概要 - (2009/02/12 13:06)