[技術ブログvol.20] デヂエを、FEK+JMeterでグラフ化する方法

az1_01_top.png

今回はFEKを利用して、デヂエ(出知恵)を見える化する方法を紹介します。デヂエとは、サイボウズ株式会社が提供するWebデータベースです。WEBから簡単に表形式のデータベースを作成できるので、当社ではちょっとした情報共有の場面で重宝しています。

このデヂエ、「全体の俯瞰がしにくい」という難点があります。一応集計機能はついていますが、あまり見やすいとは言えません。ということで、デヂエのデータを俯瞰して見ることができるように、最近流行りのFEKを使ってグラフ化してみようと思います。(FEKとは、Fluentd、ElasticSearch、Kibanaの頭文字をとったものです。)

次のような手順で説明していきます。

  1. JMeterを利用し、デヂエからCSVファイルを定期エクスポート
  2. エクスポートしたCSVファイルを、Fluentdを経由しElasticSearchへ転送
  3. Kibanaにてグラフ化

今回説明するデヂエのライブラリは、次の4項目のみもつ「アラート管理」とします。

  • 発生日
  • ホスト名
  • 発生アラート
  • ステータス

az1_01_top2.png

デヂエからライブラリのデータを定期エクスポートする

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

az1_0211_java_dl1.png

利用しているOSに応じたファイルを選択しましょう。ダウンロードが完了したらexeファイルを実行し、ウィザードに従ってインストールします。

az1_0212_java_dl2.png

2.JMeterのインストール

http://jmeter.apache.org/download_jmeter.cgiへアクセスします。中段にあるZIPファイルをダウンロードします。

az1_0213_jmeter_dl1.png

ダウンロードした後、解凍すればインストールは完了です。起動は、binフォルダ内のjmeter.batにて行います。設定ファイルは、同フォルダのjmeter.propertiesにて行います。

(負荷)テストシナリオ作成方法

テストシナリオは、ローカル環境のブラウザ遷移をキャプチャすることで作成できます。プロキシサーバを立て、ブラウンジングをキャプチャし、cookie等の微調整をする、という流れでシナリオを作成していきます。

プロキシサーバの設定

シナリオ作成のためのtemplateが用意されているので、それを使うことにします。

「ファイル」→「template」を選択します。

az1_0221_template.JPG

「Create」を選択します。

az1_0222_template_create.JPG

続いて、プロキシサーバを利用するための設定を行います。

この際に、自サイト以外はテスト対象外にしたい場合が多いと思います。挿入するパターンと除外するパターンをうまく使うことで、無駄なリクエストをシナリオから除外することができます。

自サイト以外のドメインを対象にしたくない場合は、挿入するパターンに

^(www.denet.ad.jp).*

のように自ドメインを対象にします。

また、除外パターンへは、画像ファイルやCSS等を設定しておきます。

az1_0223_recording.JPG

プロキシサーバを利用するための設定

ブラウザ(例としてIE)を開き[ツール]→[インターネットオプション]→[接続]→[LANの設定]→[LANにプロキシサーバを使用する]にチェック
アドレスに[127.0.0.1]ポートに[8080]を記入後[OK]を押します

az1_0224_local_proxy.JPG

JMeterに戻り、「WorkBench」→「HTTP(S)TestScriptRecorder」→「開始」ボタンをクリックして、プロキシサーバを起動させます。

az1_0223_recording.JPG

エクスポートシナリオの作成

Office10の場合は、次のような画面遷移でライブラリのエクスポートが可能です。

  1. ログイン画面表示
  2. ログイン画面:ログイン実行
  3. トップページ:該当のカスタムアプリ選択
  4. 該当のカスタムアプリ:CSVファイルに書き出す ボタン押下
  5. CSVファイルへの書き出し(作業) - Step 1/2:次に、書き出す内容を確認する ボタン押下
  6. CSVファイルへの書き出し(作業) - Step 2/2:書き出す ボタン押下

手動で画面遷移する場合は、上記のように6つのステップを踏む必要がありますが、JMeterの場合は、以下の3ステップを利用することでエクスポートができてしまいます。

  1. ログイン画面:ログイン実行
  2. CSVファイルへの書き出し(作業) - Step 1/2:次に、書き出す内容を確認する ボタン押下
  3. CSVファイルへの書き出し(作業) - Step 2/2:書き出す ボタン押下

まずは、プロキシサーバが起動している状態で、通常の画面遷移にてエクスポートを行います。

遷移が終わったら、「停止」ボタンを押しプロキシサーバを停止させます。このとき、ブラウザで設定した、プロキシサーバを使用する設定の解除も忘れずに行います。

「ThreadGroup」→「RecordingController」に下の画像のようなシナリオが記憶されます。わかりやすいように、必要な遷移の名前を変更しています。

  • 2番目:ログイン画面:ログイン実行
  • 5番目:CSVファイルへの書き出しStep1/2
  • 6番目:CSVファイルへの書き出しStep2/2

az1_0226_senario1.JPG

次に、必要なシナリオのみドラッグ&ドロップで「ThreadGroup」まで持ってきます。今回の場合、2番目と6番目の部分になります。5番目は一部データのみ使用するため、ドラッグ&ドロップの必要はありません。

az1_0227_senario2.JPG

シナリオの微調整

各シナリオの微調整をしていきます。

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

az1_0228_senario3.JPG

「Recording Controller」は不要になるので無効か削除してしまいましょう。

動作確認

シナリオが作成できたら、シナリオを保存し、実行してみましょう。このとき、カーソルは「Test Plan」や「Thread Group」など、上位の階層にあわせておきます。

az1_0229_senario4.JPG

実行結果は、「View Results Tree」に表示されます。

az1_022a_senario5.JPG

ダウンロードファイルは、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の設定

以下のようなコンパネを作成してみます。

az1_0331_kibana1.png

タイムフィルタ設定

表示する時間のフィルタ設定を行います。過去30日の情報が見たい場合は、「Last 30d」を選択します。今回は、Customで2014年9月以降のデータを表示するように設定しました。

az1_0336_kibana6.png

az1_0337_kibana7.png

クエリ設定

ホストごとに情報を抽出するために、クエリを設定します。

クエリは、「host:ホスト名」ような書式で記載します。Legend Valueに値を入れておくと、クエリを設定した際のラベルとして利用されますので、合わせて設定しておきます。

az1_0338_kibana8.png

ホスト別アラート件数

ホストごとにアラート発生件数を集計して表示します。

az1_0332_kibana2.png

設定内容は次の通りです。

  • パネルタイプ:terms
  • Parameters->Field:host
  • ViewOptions->style:table
  • Queries->options->selected:*
アラート発生傾向

ホストごとにアラート発生件数の推移を線グラフで表示します。

az1_0333_kibana3.png

設定内容は次の通りです。

  • パネルタイプ:sparkline
  • Queries->selected:表示したい各サービスを選択
アラート発生件数

時系列でアラート発生件数を表示します。ホストごとの積み上げ棒グラフとしています。

az1_0334_kibana4.png

設定内容は次の通りです。

  • パネルタイプ: histogram
  • Queries->selected:表示したい各サービスを選択

設定内容は次の通りです。

各ホストの発生アラート内容

各ホストごとに、発生アラート内容のTOP3を表示します。

az1_0335_kibana5.png

設定内容は次の通りです。

  • パネルタイプ: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月中旬頃です。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA