トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Linux:Java:JMeterのログの日付を変換して出力するサンプル の変更点

Top / Linux:Java:JMeterのログの日付を変換して出力するサンプル

[[Linux:Java:標準入力を受けて標準出力に出す]]

*Linux:Java:JMeterのログの日付を変換して出力するサンプル [#v1939661]

JMeterのログを標準入力から受けて、日付フォーマットに直して標準出力に出力するサンプルです。

日付の変換は以下の3種類を行っています。

-時分秒まで出力
-時分まで出力
-時まで出力

たいがい、JMeterログって、少なくとも万行単位で出力され、多いときは千万行単位で出たりします。

※今回、高負荷試験をJMeterで実施したところ、csvが1700万行出力されたりw

そういう場合に、Excelで集計することが不可能なので、この結果をSQLITEか何かに突っ込んで解析したりすると幸せになれますw

***ソースコード [#je803930]

こちらの記事のソースをベースにしてます。

-[[Linux:Java:標準入力を受けて標準出力に出す]]

こんな感じです。

 import java.io.*;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 
 public class JmeterDateParser {
 	public static void main(String[] args) {
 		try {
 			// 標準入力を設定
 			BufferedReader bin = new BufferedReader(new InputStreamReader(
 					System.in));
 
 			String line = null;
 			JmeterDateParser parser = new JmeterDateParser();
 			// 標準入力からの1行入力を待つ。
 			while ((line = bin.readLine()) != null) {
 				System.out.print(parser.process(line));
 			}
 			bin.close();
 		} catch (Exception e) {
 			e.printStackTrace();
 			// プログラムを終了
 			System.exit(255);
 		}
 	}
 
 	private final DateFormat df = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss");
 	private Calendar ca = null;
 	private final String SEPARATOR = "\t";
 	private final String RET_CODE = "\n";
 
 	public JmeterDateParser() {
 		ca = Calendar.getInstance();
 	}
 
 	// JMeterの結果レポートのcsvを読み込み、日付フォーマットを直す。
 	public String process(String line) {
 		String col[] = line.split(",");
 
 		// 10カラムでないレコードは無視する。
 		if (col.length != 10) {
 			return "";
 		}
 
 		// 第一カラムがlongにパース出来ないレコードは無視する。
 		long milisec;
 		try {
 			milisec = Long.parseLong(col[0]);
 		} catch (Exception e) {
 			return "";
 		}
 		// 日付に変換し、返却する。
 		ca.setTimeInMillis(milisec);
 		StringBuffer res = new StringBuffer();
 		String target = df.format(ca.getTime());
 		// 秒まで変換した値を出力
 		res.append(target);
 		// 分まで変換した値を出力
 		res.append(SEPARATOR).append(target.substring(0, 16));
 		// 時まで変換した値を出力
 		res.append(SEPARATOR).append(target.substring(0, 13));
 
 		for (int i = 1; i < col.length; i++) {
 			res.append(SEPARATOR).append(col[i]);
 		}
 		return res.append(RET_CODE).toString();
 	}
 }

元々のデータはカンマ「,」区切りですが、出力は「タブ」区切りで出してます。

なぜこうするかって?それは好みの問題ですw


***実行例 [#f119e4e1]

まず、インプットとなるJMeterの実行結果、「XXX.csv」はこんな感じです。
 1385389721715,120,サンプル_1,200,OK,サンプル_スレッド10 1-1,text,true,7273,120
 1385389721720,118,サンプル_2,200,OK,サンプル_スレッド10 1-2,text,true,7273,118
 1385389721838,122,サンプル_1,200,OK,サンプル_スレッド10 1-1,text,true,7273,122
 1385389721841,124,サンプル_2,200,OK,サンプル_スレッド10 1-2,text,true,7273,123
 1385389721963,108,サンプル_1,200,OK,サンプル_スレッド10 1-1,text,true,7273,107
 1385389721968,113,サンプル_2,200,OK,サンプル_スレッド10 1-2,text,true,7273,113

こんな感じ実行します。
 cat XXXX.csv | java JmeterDateParser 
 2013-11-25 23:28:41	2013-11-25 23:28	2013-11-25 23	120	サンプル_1	200	OK	サンプル_スレッド10 1-1	text	true	7273	120
 2013-11-25 23:28:41	2013-11-25 23:28	2013-11-25 23	118	サンプル_2	200	OK	サンプル_スレッド10 1-2	text	true	7273	118
 2013-11-25 23:28:41	2013-11-25 23:28	2013-11-25 23	122	サンプル_1	200	OK	サンプル_スレッド10 1-1	text	true	7273	122
 2013-11-25 23:28:41	2013-11-25 23:28	2013-11-25 23	124	サンプル_2	200	OK	サンプル_スレッド10 1-2	text	true	7273	123
 2013-11-25 23:28:41	2013-11-25 23:28	2013-11-25 23	108	サンプル_1	200	OK	サンプル_スレッド10 1-1	text	true	7273	107
 2013-11-25 23:28:41	2013-11-25 23:28	2013-11-25 23	113	サンプル_2	200	OK	サンプル_スレッド10 1-2	text	true	7273	113


これをSQLITEに突っ込んで、1カラム目、2カラム目、3カラム目にインデックスを貼れば、秒ごと、分ごと、時間ごとのログの集計が簡単にできます。