はじめに
サーバーとアプリケーションを効率よく監視することで、組織を円滑に運営でき、さらには今後起こりうる災害にもうまく対応できます。今回のブログ記事では、Atlassian JIRA と Elastic 社のツールを使用してアプリケーションおよびサービスのステータスをすばやくレポートする方法について説明します。
監視の必要性について
組織がサーバーおよびアプリケーションの監視を実装すべき理由はいくつかあります。最も重要な理由は、サーバーおよびアプリケーションが期待どおりに確実に動作させるためです。効率良い監視を実装することで、アプリケーションやサーバーに問題が発生した際に適切なスタッフに通知が送られるようになります。
この 2 部構成のシリーズでは、Elastic 社 の ELK ソリューションを実例として取り上げます。
ELK とは
ELK とは、Elasticsearch、Logstash および Kibana の頭文字を組み合わせたものです。
- Logstash は、柔軟かつオープン ソースのデータ収集/トランスポート パイプラインです。一般的なインフラストラクチャへのコネクターを利用して簡単に統合できます。そして、Logstash は増え続けるログ、イベント、および構造化されていないデータ ソースの一覧を、Elasticsearch などに出力します。
- Elasticsearch は、分散型かつオープンソースの検索/解析エンジンです。水平方向のスケーラビリティと信頼性を念頭に設計されており、管理が容易です。検索速度と解析力を兼ね備えており、その洗練された開発者フレンドリーなクエリ言語は構造化、非構造化、および時系列データに対応しています。
- Kibana は、分散型かつオープンソースの検索/解析エンジンです。水平方向のスケーラビリティと信頼性を念頭に設計されており、管理が容易です。検索速度と解析力を兼ね備えており、その洗練された開発者フレンドリーなクエリ言語は構造化、非構造化、および時系列データに対応しています。
まず、Logstash を使用して JIRA ログを取り込みます。次に Elasticsearch を使用してそれらログの保管とインデックス作成を行います。最後に Kibana を使用してそのデータを視覚化します。この一覧の流れにより、JIRA のパフォーマンスを最適に監視できます。
Logstash、Elasticsearch、および Kibana は Java 上で動作します。最新バージョンの Java ランタイム環境 (JRE) をインストールすることで動作します (Oracle または JDK)。
Timothys-iMac:logstash-2.1.1 timothy.chin$ java -versionjava version "1.8.0_65"Java(TM) SE Runtime Environment (build 1.8.0_65-b17)Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
ログ ファイルの取り込み

JIRA のパフォーマンスを計測/監視するためには、どのログ ファイルを使用すべきでしょうか。ここでは Logstash を使用して JIRA のアクセス ログ ファイルの解析を行います。Logstash のセットアップは難しくありません。Logstash のダウンロード ページ では、複数の種類からダウンロードを選択できます。インストールの例としては、tar.gz をダウンロードし、それを解凍する方法が挙げられます。
Timothys-iMac:logstash-2.1.1 timothy.chin$ cd /Users/timothy.chin/opt/elk/logstash-2.1.1
次のステップでは Logstash の構成ファイルを用意します。Logstash の構成ファイルは、入力、フィルター、および出力の 3 種類に分けられます。
入力
bin/logstash -e 'input { stdin { } } output { stdout {} }'
stdin
は入力プラグインで、標準的な入力からイベントを読み込みます。
コマンド プロンプトで hello world
と入力した場合の Logstash の応答は以下のとおりです。
hello world 2013-11-21T01:22:14.405+0000 0.0.0.0 hello world
入力用には数多くのプラグインが存在しており、その中の 1 つを使用することで Logstash にログ ファイルのデータを取り込むことができます。
例 :
input { file { type => "jira-access-log" path => "/Users/timothy.chin/Desktop/client-logs/*" start_position => "beginning" sincedb_path => "/Users/timothy.chin/Desktop/sincedb" } }
上記構成の意味は、以下のとおりです。
- この構成ファイルで解析されるファイルの種類は
jira-access-log
です。 - ファイルの読み込み先は
client-logs
フォルダーです。 - この
start_position
とsincedb_path
との組み合わせは、ログを最初から読み込むことを想定しています (sincedb
が存在しない場合)。
フィルター
上記の入力セクションにより、ログが 1 行ずつ読み込まれます。構成のフィルター セクションでは、取り込んだイベントの内部処理を行います。以下はその例です。
Apache アクセス ログの例 :
83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
Grok プラグインを使用したフィルターの例 :
filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}"} } }
先ほどのログを Grok プラグインでフィルタリングした場合の出力結果の例は、以下のとおりです。
JSON 出力結果の例 :
{ "clientip":"83.149.9.216", "ident":"", "auth":"", "timestamp":"04/Jan/2015:05:13:42 +0000", "verb":"GET", "request":"/presentations/logstash-monitorama-2013/images/kibana-search.png", "httpversion":"HTTP/1.1", "response":"200", "bytes":"203023", "referrer":"http://semicomplete.com/presentations/logstash-monitorama-2013/", "agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36" }
出力
最後に出力セクションです。ここではフィルター セクションでフィルタリングされた JSON イベントが他方のアプリケーションに引き渡され、保管およびインデックスされます。以下の例では、イベントは Elasticsearch に引き渡され、インデックスされます。
output { elasticsearch { } }
この設定では、Logstash は HTTP プロトコルを使用して Elasticsearch に接続しています。上記の例では、Logstash および Elasticsearch は同一インスタンス上で稼動しています。hosts
を利用することで、リモート Elasticsearch インスタンスを指定できます (例 : hosts => "es-machine:9092"
)。
次回のブログ記事では、Elasticsearch 上のデータを Kibana アプリケーションを利用して何を行えるかについて解説します。貴社のアプリケーションおよびサーバーの監視に関して弊社がお手伝いできることの詳細については、気軽に お問い合わせ ください。