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

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

Last-modified: 2013-12-01 (日) 14:00:54 (1877d)
Top / Linux:Java:JMeterのログの日付を変換して出力するサンプル

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

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

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

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

  • 時分秒まで出力
  • 時分まで出力
  • 時まで出力

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

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

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

ソースコード

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

こんな感じです。

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

実行例

まず、インプットとなる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カラム目にインデックスを貼れば、秒ごと、分ごと、時間ごとのログの集計が簡単にできます。