Graph ExplorerでGraphiteのデータをいい感じに扱う

全国1億2000万人の監視ツール好きのみなさんこんにちは。
Graph ExplorerはGraphiteと連携して、Graphiteのデータを簡単に探してグラフ化してくれるツールです。GitHubで公開(https://github.com/vimeo/graph-explorer)されています。 Graphite標準だと、グラフ数が増えてくるとデータを探すのが著しく困難ですし、複数のデータをグループ化したりするのも、いちいち手作業でやらねばならず効率的ではありません。Graph Explorerを使うことでそういった問題を解決できます。
動作環境
Graph Explorerを動作させるためには、当然のことながら既に構築済みのGraphite環境が必要です。 またその他に検索機能を実現するために、ElasticSearchが必要になります。アプリケーション自体はpythonのbottleというフレームワークで作られていますので、pythonが動作する環境が必要です。
なお、Graphite環境や、ElasticSearchの環境は同一ホスト上である必要はありませんが、ネットワーク経由で通信できる必要があります。
今回は、Graphiteは既に構築済みの環境を利用し、ElasticSearchとGraph ExplorerはUbuntu 12.04の仮想マシン上に構築しました。
Graphiteサーバ側のapacheの設定変更
外部からGraphiteに対してPOSTする必要があるため、現在のGraphiteがPOSTメソッドを受け付けるようになっているか確認し、もし受け付けない場合は修正してください。修正が終わったらapacheを再起動しておきます。
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, OPTIONS, POST"
Header set Access-Control-Allow-Headers "origin, authorization, accept"
インストール
それではインストールしていきましょう。 ElasticSearchを動作させるためにはJavaが必要になります。 以下にようにインストールします(Ubuntu以外の環境を利用している場合はお使いの環境にあわせてください。また既にJavaが利用可能な環境の場合はスキップします)。
sudo apt-get install openjdk-7-jdk
次にElasticSearchをインストールします。Ubuntu用にはパッケージが提供されていますので、http://www.elasticsearch.org/download/ から必要なバイナリを入手しインストールしてください(他のOSの場合もそれぞれパッケージがありますので、それを利用します)。
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.1.1.deb
sudo dpkg -i elasticsearch-1.1.1.deb
sudo update-rc.d elasticsearch defaults 95 10
sudo /etc/init.d/elasticsearch start
Graph Explorerのインストール
ソースをGitHubから持ってきてインストールします。いくつかsubmoduleを使っているので、単純にcloneではなく、–recursiveオプションをつける必要があります。
git clone --recursive https://github.com/vimeo/graph-explorer.git
cd ./graph-explorer
sudo python setup.py install
ここで、既知の問題 ( https://github.com/vimeo/graph-explorer/issues/105 )で、jsがないのでコピーします。コピー先は利用しているPythonの環境によって異なりますので、上記でinstallした際にどこにインストールされたのかを確認してください。
sudo cp -ax graph_explorer/timeserieswidget /usr/local/lib/python2.7/dist-packages/graph_explorer-0.0.0-py2.7.egg/graph_explorer/
これでインストール自体は完了です。
設定ファイルの準備
次にGraph Explorerの設定ファイルを準備します。ソースコードをCloneしたディレクトリに、サンプルの設定ファイルがありますので適当な名前でコピーしてください。
cp config_example.cfg config.cfg
次にコピーしたファイルを編集します。項目の意味は以下の通りです。
- url_server はGraphiteに接続するためのURLを指定します。他のサーバ上にある場合は、通信可能なFQDNやIPアドレスで記述します。
- url_client はクライアント(ブラウザ)側からGraphiteに接続する場合のURLを記述します(例えばグラフへの直接リンクなど)。
- [anthracite]の項目の中のhostについても同様で、ElasticSearchのデータをブラウザ側から取得するためのFQDNやIPアドレスを設定します。
- [elasticsearch]の中のhostについては、Graph Explorerのコードからデータの入出力をするための接続先になります。ブラウザからの接続はありませんので、Graph Explorerが解決可能なIPアドレスかFQDNを記述します。同一ホスト上に配置するのであればlocalhostで構いません。
[graphite]
## need to connect to graphite
# the url that the graph-explorer daemon will use to connect to graphite
url_server = http://graphite.meguro.ryuzee.com
# the url that the graph renderer in browser will use to connect to graphite
url_client = http://graphite.meguro.ryuzee.com
username =
password =
[anthracite]
## optional, to get annotated events on your graphs
# (the clientside graph renderer talks directly to it)
# this will point to your anthracite index in elastic search
# host = "localhost"
# port = 9200
# index = "anthracite"
host = 192.168.33.101
port = 9200
index = "graphite_metrics2"
(略)
[elasticsearch]
## graph explorer daemon needs to connect to elasticsearch,
# you typically run an ES on the same host as GE.
host = localhost
port = 9200
index = graphite_metrics2
またログの出力用ディレクトリを作成しておきましょう。
sudo mkdir -p /var/log/graph-explorer/
sudo chmod -R 777 /var/log/graph-explorer/
メトリクス一式を更新
Graph Explorerでは、ElasticSearchにGraphiteでのメトリクスのメタデータの一式を登録します。以下のコマンドを実行してください。 これによって、Graphiteに接続してメトリクスの種類などを取得し、ElasticSearchにデータが登録されます。
sudo update_metrics.py config.cfg
コマンドを実行すると以下のように表示されます。なお、エラーになる場合は、[graphite]のusr_serverの箇所と[elasticsearch]のhostを確認してください。
(略)
2014-04-29 02:28:50,084 - update_metrics - INFO - fetching/saving metrics from graphite...
2014-04-29 02:28:50,313 - update_metrics - INFO - generating structured metrics data...
2014-04-29 02:28:50,315 - update_metrics - DEBUG - loading metrics
2014-04-29 02:28:50,317 - update_metrics - DEBUG - removing outdated targets
2014-04-29 02:28:50,319 - update_metrics - DEBUG - making sure index exists..
No handlers could be found for logger "elasticsearch"
2014-04-29 02:28:50,330 - update_metrics - DEBUG - making sure shard is started..
2014-04-29 02:28:50,334 - update_metrics - DEBUG - shard is ready!
2014-04-29 02:28:50,334 - update_metrics - DEBUG - making sure index exists..
2014-04-29 02:28:50,342 - update_metrics - DEBUG - making sure shard is started..
2014-04-29 02:28:50,345 - update_metrics - DEBUG - shard is ready!
2014-04-29 02:28:50,381 - update_metrics - DEBUG - removed 0 metrics from elasticsearch
2014-04-29 02:28:50,382 - update_metrics - DEBUG - updating targets
2014-04-29 02:28:50,383 - update_metrics - DEBUG - list_metrics with 23 plugins and 191 metrics
(略)
2014-04-29 02:28:50,649 - update_metrics - DEBUG - indexed 191 metrics
2014-04-29 02:28:50,652 - update_metrics - INFO - success!
なお、この処理はGraphiteに新しいメトリクスが追加になった場合には再度実行する必要がありますので、cronなどに登録しておくと良いでしょう。
サービス起動
これですべての準備が整いましたので、サービスを以下のように起動してください。
sudo run_graph_explorer.py config.cfg
起動しない場合は、コンソールに何かエラーが出ていると思いますので内容を確認してください。
画面にアクセスするためには、ブラウザで、 http://仮想サーバのIP:8080/ を開きます。 検索フィールドがありますので、そこに list と入力し、いま参照可能なメトリクスデータが表示されるかどうか確認してください。

その他の検索
テキストボックスにサーバ名やメトリクスの名前などを入力することでかなり自由に検索することができます。
例えば、以下のクエリは、catchall_statsdというタイプの中から、load_avg.oneに該当するものを検索しています。
catchall_statsd load_avg.one

例えば、期間や最小値・最大値などを指定することもできます。以下の例では、LXCという名前のサーバの過去1月のロードアベレージを取得しています。
load_avg.one LXC from -1month min 0 max 4

ということで楽しいモニタリングライフを!!
アジャイルコーチングやトレーニングを提供しています
株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。
詳細はこちら