- 追加された行はこの色です。
- 削除された行はこの色です。
[[Linux:Java:標準入力を受けて標準出力に出す]]
*Linux:Java:JMeterのログの日付を変換して出力するサンプル [#v1939661]
JMeterのログを標準入力から受けて、日付フォーマットに直して標準出力に出力するサンプルです。
日付の変換は以下の3種類を行っています。
-時分秒まで出力
-時分まで出力
-時まで出力
たいがい、JMeterログって、少なくとも万行単位で出力され、多いときは千万行単位で出たりします。
※今回、高負荷試験をJMeterで実施したところ、csvが1700万行出力されたりw
そういう場合に、Excelで集計することが不可能なので、この結果をSQLITEか何かに突っ込んで解析したりすると幸せになれますw
***ソースコード [#je803930]
こちらの記事のソースをベースにしてます。
-[wiki:Linux:Java:標準入力を受けて標準出力に出す]
-[[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カラム目にインデックスを貼れば、秒ごと、分ごと、時間ごとのログの集計が簡単にできます。