今回はFEKを利用して、デヂエ(出知恵)を見える化する方法を紹介します。デヂエとは、サイボウズ株式会社が提供するWebデータベースです。WEBから簡単に表形式のデータベースを作成できるので、当社ではちょっとした情報共有の場面で重宝しています。
このデヂエ、「全体の俯瞰がしにくい」という難点があります。一応集計機能はついていますが、あまり見やすいとは言えません。ということで、デヂエのデータを俯瞰して見ることができるように、最近流行りのFEKを使ってグラフ化してみようと思います。(FEKとは、Fluentd、ElasticSearch、Kibanaの頭文字をとったものです。)
次のような手順で説明していきます。
- JMeterを利用し、デヂエからCSVファイルを定期エクスポート
- エクスポートしたCSVファイルを、Fluentdを経由しElasticSearchへ転送
- Kibanaにてグラフ化
今回説明するデヂエのライブラリは、次の4項目のみもつ「アラート管理」とします。
- 発生日
- ホスト名
- 発生アラート
- ステータス
デヂエからライブラリのデータを定期エクスポートする
JMeterを利用することで、WEB画面遷移を行いデータをエクスポートする部分を自動化します。デヂエにはライブラリ全体をダンプするコマンドはありますが、特定列のみエクスポートが可能なAPIが提供されていません。特定列のみエクスポートしたい場合は、WEB画面からエクスポートを実施する必要があります。グラフ化するために、都度手動でダウンロードするのは面倒なため、JMeterを利用し自動化してみます。
ここでは、シナリオ作成のためにWindows環境へJMeterをインストールします。エクスポートのための定期実行は、Linuxから実行する形で説明していきます。
Windows環境へのJMeterのインストール方法
JMeterはjavaで動作しているので、Javaをインストールした後にJMeterをインストールします。
1.Javaのインストール
OracleのサイトよりJDKのダウンロードを行います。
http://www.oracle.com/technetwork/java/javase/downloads/index.html
利用しているOSに応じたファイルを選択しましょう。ダウンロードが完了したらexeファイルを実行し、ウィザードに従ってインストールします。
2.JMeterのインストール
http://jmeter.apache.org/download_jmeter.cgiへアクセスします。中段にあるZIPファイルをダウンロードします。
ダウンロードした後、解凍すればインストールは完了です。起動は、binフォルダ内のjmeter.batにて行います。設定ファイルは、同フォルダのjmeter.propertiesにて行います。
(負荷)テストシナリオ作成方法
テストシナリオは、ローカル環境のブラウザ遷移をキャプチャすることで作成できます。プロキシサーバを立て、ブラウンジングをキャプチャし、cookie等の微調整をする、という流れでシナリオを作成していきます。
プロキシサーバの設定
シナリオ作成のためのtemplateが用意されているので、それを使うことにします。
「ファイル」→「template」を選択します。
「Create」を選択します。
続いて、プロキシサーバを利用するための設定を行います。
この際に、自サイト以外はテスト対象外にしたい場合が多いと思います。挿入するパターンと除外するパターンをうまく使うことで、無駄なリクエストをシナリオから除外することができます。
自サイト以外のドメインを対象にしたくない場合は、挿入するパターンに
^(www.denet.ad.jp).*
のように自ドメインを対象にします。
また、除外パターンへは、画像ファイルやCSS等を設定しておきます。
プロキシサーバを利用するための設定
ブラウザ(例としてIE)を開き[ツール]→[インターネットオプション]→[接続]→[LANの設定]→[LANにプロキシサーバを使用する]にチェック
アドレスに[127.0.0.1]ポートに[8080]を記入後[OK]を押します
JMeterに戻り、「WorkBench」→「HTTP(S)TestScriptRecorder」→「開始」ボタンをクリックして、プロキシサーバを起動させます。
エクスポートシナリオの作成
Office10の場合は、次のような画面遷移でライブラリのエクスポートが可能です。
- ログイン画面表示
- ログイン画面:ログイン実行
- トップページ:該当のカスタムアプリ選択
- 該当のカスタムアプリ:CSVファイルに書き出す ボタン押下
- CSVファイルへの書き出し(作業) - Step 1/2:次に、書き出す内容を確認する ボタン押下
- CSVファイルへの書き出し(作業) - Step 2/2:書き出す ボタン押下
手動で画面遷移する場合は、上記のように6つのステップを踏む必要がありますが、JMeterの場合は、以下の3ステップを利用することでエクスポートができてしまいます。
- ログイン画面:ログイン実行
- CSVファイルへの書き出し(作業) - Step 1/2:次に、書き出す内容を確認する ボタン押下
- CSVファイルへの書き出し(作業) - Step 2/2:書き出す ボタン押下
まずは、プロキシサーバが起動している状態で、通常の画面遷移にてエクスポートを行います。
遷移が終わったら、「停止」ボタンを押しプロキシサーバを停止させます。このとき、ブラウザで設定した、プロキシサーバを使用する設定の解除も忘れずに行います。
「ThreadGroup」→「RecordingController」に下の画像のようなシナリオが記憶されます。わかりやすいように、必要な遷移の名前を変更しています。
- 2番目:ログイン画面:ログイン実行
- 5番目:CSVファイルへの書き出しStep1/2
- 6番目:CSVファイルへの書き出しStep2/2
次に、必要なシナリオのみドラッグ&ドロップで「ThreadGroup」まで持ってきます。今回の場合、2番目と6番目の部分になります。5番目は一部データのみ使用するため、ドラッグ&ドロップの必要はありません。
シナリオの微調整
各シナリオの微調整をしていきます。
2番目:ログイン画面:ログイン実行
ログイン時にhidden項目に、セッション用のチケットが発行されます。動的に発行されるチケットを持ちまわれるように「正規表現抽出」を追加します。
「ThreadGroup」→「2番目:ログイン画面:ログイン実行」→右クリック→追加→後処理→「正規表現抽出」で追加が可能です。次の内容を追加します。
- 名前:FSID
- 参照名:getFSID
- 正規表現:
- テンプレート:$1$
- 一致番号(0からの乱数):0
また、「2番目:ログイン画面:ログイン実行」→「HTTPリクエスト」→「Parameters」にて、次の項目を新規追加します。
- 名前:page / 値:DBFileExportField
- 名前:did / 値:「6番目:CSVファイルへの書き出しStep2/2」のDIDと同じ値
6番目:CSVファイルへの書き出しStep2/2
エクスポートしたファイルの保存場所を指定する必要があります。保存場所の指定は「応答をファイルへ保存」で行います。
「ThreadGroup」→「6番目:CSVファイルへの書き出しStep2/2」→右クリック→追加→リスナー→「応答をファイルへ保存」で追加が可能です。次の内容を追加します。
- ファイル名の接頭辞:alert
- Don't add number to prefixにチェック
セッション用のチケットを持ちまわる必要があります。
「6番目:CSVファイルへの書き出しStep2/2」→「HTTPリクエスト」→「Parameters」の「FSID」の値を変更します。
- FSID:${getFSID}
ダウンロード用の列を指定します。「5番目:CSVファイルへの書き出しStep1/2」のParametersを見ると、数字のみの項目があります。この項目が、ダウンロード対象列になるので、同様の内容を登録します。
- 名前:数字 / 値:1
「Recording Controller」は不要になるので無効か削除してしまいましょう。
動作確認
シナリオが作成できたら、シナリオを保存し、実行してみましょう。このとき、カーソルは「Test Plan」や「Thread Group」など、上位の階層にあわせておきます。
実行結果は、「View Results Tree」に表示されます。
ダウンロードファイルは、jmeterインストールのbinフォルダ内に「alert.csv」が出力されているはずです。
Linux環境へのJMeterのインストール方法
Windowsの場合と同様、JDKのインストールと、JMeterのインストールが必要になります。
JDKのインストール
標準リポジトリからjavaをインストールします。
$ yum install -y java
JMeterのインストール
JMeterは公式サイトから取得し、解凍します。
ダウンロードURL:http://jmeter.apache.org/download_jmeter.cgi
解凍後binフォルダへ移動し、以下のコマンドでバージョン確認を行います。
$ sh jmeter -v
Copyright (c) 1998-2014 The Apache Software Foundation
Version 2.11 r1554548
作成したシナリオをalert.xmlというファイル名でFTPアップロードし、実行してみます。
$ sh jmeter -n -t alert.jmx
Creating summariser <summary>
Created the tree successfully using alert.jmx
Starting the test @ Tue Oct 14 12:34:27 JST 2014 (1413257667316)
Waiting for possible shutdown message on port 4445
summary = 2 in 1.3s = 1.5/s Avg: 642 Min: 164 Max: 1121 Err: 0 (0.00%)
Tidying up ... @ Tue Oct 14 12:34:29 JST 2014 (1413257669381)
... end of run
binフォルダ内に、「alert.csv」ファイルが保存されていると思います。
Fluentd+ElasticSearch+Kibanaで可視化する
JMeterを使うことで、デヂエから必要な項目のみCSVファイルでエクスポートすることが可能になりました。
次は、Fluentd,ElasticSearch,Kibanaの設定です。各アプリケーションのインストール方法については、こちらを参照してください。
参考URL:http://blog.denet.co.jp/2014/04/vol11-elbfluentdelasticsearchkibana.html
Fluentdの設定
エクスポートされたCSVファイルのレイアウトは次の通りです。
- 発生日
- ホスト名
- 発生アラート
- ステータス
設定ファイルの作成
td-agent.confへ入出力の設定を記載します。
$ vi /etc/td-agent/td-agent.conf
#アラート管理
<source>
type tail
path /etc/td-agent/dezie_data/alert.txt
tag dezie.alert
pos_file /etc/td-agent/dezie_data/alert.txt.pos
format csv
keys time,host,alert,status
time_key time
time_format %Y/%m/%d %H:%M
</source>
<match dezie.alert>
type elasticsearch
host localhost
port 9200
type_name alert
logstash_format true
logstash_prefix dezie_alert
logstash_dateformat %Y
buffer_type memory
buffer_chunk_limit 10m
buffer_queue_limit 10
flush_interval 1s
retry_limit 16
retry_wait 100s
</match>
Fluentdを再起動しておきます。
/etc/td-agent/td-agent restart
ElasticSearchの設定ファイル
次にElasticSearchの設定を行います。
マッピングの登録
主な設定内容は、マッピングの定義です。特に明示的に定義せずにも利用できますが、意図した検索結果を得るために、マッピングの定義を行います。
ここでは、ホスト名、発生アラート、ステータスを全文検索しないように定義します。
テンプレートへマッピングの定義を行います。
curl -XDELETE http://localhost:9200/dezie_alert*
curl -XPUT http://localhost:9200/_template/alert -d '
{
"template": "dezie_alert-*",
"mappings": {
"alert": {
"properties": {
"alert": {"type": "string", "index": "not_analyzed"}
,"host": {"type": "string","index": "not_analyzed"}
,"status": {"type": "string","index": "not_analyzed"}
}
}
}
}
'
マッピングが登録されたことを確認します。
curl -XGET localhost:9200//_template/alert?pretty=1
{
"alert" : {
"order" : 0,
"template" : "dezie_alert-*",
"settings" : { },
"mappings" : {
"alert" : {
"properties" : {
"host" : {
"index" : "not_analyzed",
"type" : "string"
},
"status" : {
"index" : "not_analyzed",
"type" : "string"
},
"alert" : {
"index" : "not_analyzed",
"type" : "string"
}
}
}
},
"aliases" : { }
}
}
データの手動登録
マッピングが登録できたら、データを手動で登録してみます。
/etc/td-agent/dezie_data/alert.txt へテスト用のデータを登録してみましょう。テスト用のデータはこちらからダウンロード可能です。
ダウンロードしたファイルをサーバ上へ保存し、データを流してみます。
cat /etc/td-agent/dezie_data/alert.csv > /etc/td-agent/dezie_data/alert.txt
インデックスが登録されたか確認します。
curl -XGET http://localhost:9200/dezie_alert*/_aliases?pretty=1
{
"dezie_alert-2014" : {
"aliases" : { }
}
}
Kibanaの設定
以下のようなコンパネを作成してみます。
タイムフィルタ設定
表示する時間のフィルタ設定を行います。過去30日の情報が見たい場合は、「Last 30d」を選択します。今回は、Customで2014年9月以降のデータを表示するように設定しました。
クエリ設定
ホストごとに情報を抽出するために、クエリを設定します。
クエリは、「host:ホスト名」ような書式で記載します。Legend Valueに値を入れておくと、クエリを設定した際のラベルとして利用されますので、合わせて設定しておきます。
ホスト別アラート件数
ホストごとにアラート発生件数を集計して表示します。
設定内容は次の通りです。
- パネルタイプ:terms
- Parameters->Field:host
- ViewOptions->style:table
- Queries->options->selected:*
アラート発生傾向
ホストごとにアラート発生件数の推移を線グラフで表示します。
設定内容は次の通りです。
- パネルタイプ:sparkline
- Queries->selected:表示したい各サービスを選択
アラート発生件数
時系列でアラート発生件数を表示します。ホストごとの積み上げ棒グラフとしています。
設定内容は次の通りです。
- パネルタイプ: histogram
- Queries->selected:表示したい各サービスを選択
設定内容は次の通りです。
各ホストの発生アラート内容
各ホストごとに、発生アラート内容のTOP3を表示します。
設定内容は次の通りです。
- パネルタイプ:terms
- Parameters->Field:alert
- Parameters->Length:3
- ViewOptions->style:table
- Queries->options->selected:表示したいホスト名を選択
保存する
パネルの設定が完了したら、保存しておきます。次のようなコンパネができました。
定期実行を行う。
一連の流れをシェルから行えるようにします。elasticsearchへ登録するデータは、一旦全て削除し、全て登録し直す形としています。
vi alert.sh
#/bin/sh
/bin/sh /home/azami/local/jmeter/bin/jmeter -n -t /home/azami/local/jmeter/bin/alert.jmx
curl -XDELETE http://localhost:9200/dezie_alert*
cat /etc/td-agent/dezie_data/alert.csv>/etc/td-agent/dezie_data/alert.txt
chmod 755 alert.sh
1日おきに情報を更新するために、シェルを早朝に実行するように設定します。
crontab -e
00 8 * * * /home/azami/local/prgm/alert.sh > /dev/null 2>&1
最後に
デヂエからライブラリのデータを自動的にエクスポートし、Fluentd+ElasticSearch+Kibanaを使って見える化することができました。
エクスポートのAPIが無い場合でも、JMeterを使うことで画面遷移のエクスポートを自動化することができます。デヂエに限らず色々なものを見える化してみましょう。
次回の更新予定は、1月中旬頃です。