メトリクス Web API(JSON) メトリクス
Play2アプリ ----------> guardian-management-play ------------> Rubyスクリプト --> gmetricコマンド ----------> Webサーバ内のgmond --------> 集約先のgmond/gmetad
- guardian-management-playはPlay2のフィルタを使ってメトリクスを計測し、管理Web経由で計測データをJSONファイルとして公開する
Play2アプリでMetricsを計測して、それをJSONファイルとしてWeb API経由で提供するところまでやる。 後にRubyスクリプトを使ってこのAPIをポーリングして、結果を定期的にGangliaへ送信します。
- guardian-management-playというプラグインを使います。
- 以下をプロジェクトのビルド定義に追加
resolvers += "Guardian Github Snapshots" at "http://guardian.github.com/maven/repo-releases"
libraryDependencies += "com.gu" %% "management-play" % "5.21"
- プロジェクト固有のMetriesをここを参考に定義。標準的なMetricsも用意されている。
- 上記で定義したMetricsをPlay 2.1のFilterとしてGlobalオブジェクトにmixin
- プロジェクト固有の管理ページを定義。ここがGangliaや人間へのインタフェースになる。
- guardian-management-playの管理ページを有効化するために、play.pluginsファイルを変更
1000:com.gu.management.play.InternalManagementPlugin
- play run!
- 管理Webにアクセスしてみる http://localhost:18080/management
- メトリクスのJSONデータにアクセスしてみる http://localhost:18080/management/status
- あとでこれをスクリプトで取得してGangliaへ流します
- Gangliaをインストールする
- Mac OS Xならbrew install ganglia。なんか失敗したらbrew updateしてからもう一回。
- gstatが既にあるよ!って言われたらbrew link --overwrite --dry-run gangliaしてgstatだけ上書きされることを確認して、brew link --overwrite gangliaで上書きしちゃえ〜)
mod_phpの組み込みもお忘れなく。httpd.confに以下のような設定を追加。
LoadModule php5_module /usr/local/Cellar/php54/5.4.16/libexec/apache2/libphp\
5.so
<IfModule mod_php5.c>
AddType application/x-httpd-php .php .php4 .php3 .phtml
AddType application/x-httpd-php-source .phps
DirectoryIndex index.html index.php
</IfModule>
次に、gmond, gmetadのログをtailしておく。
$ syslog -w
起動ォ
$ sudo gmond
$ sudo mkdir -p /var/lib/ganglia/rrds
$ sudo chown -R nobody:nobody /var/lib/ganglia
$ sudo gmetad
gmondはどのportでLISTENしてるのかな?
$ gmond --default_config | grep -nC 3 port
(省略)
49-udp_recv_channel {
50- mcast_join = 239.2.11.71
51: port = 8649
52- bind = 239.2.11.71
53-}
54-
--
--
55-/* You can specify as many tcp_accept_channels as you like to share
56- an xml description of the state of the cluster */
57-tcp_accept_channel {
58: port = 8649
59-}
(省略)
8649っぽい。そして、マルチキャストアドレス 239.2.11.71でマルチキャストするらしい。
管理Webを起動します。
まずApacheとPHPをインストールしておきます。まだインストールしていない場合、こちらを参考に。phpはこちらのhomebrew-phpのほうが簡単です。
以下にGangliaの管理WebのPHPソースがあります。
$ ls /usr/local/Cellar/ganglia/3.1.7/share/ganglia/web/
この内容をDocumentRootへgangliaという名前でシンボリックリンクさせて、Apacheを起動したいと思います。 そうすると、http://localhost/gangliaでアクセスできるはず。
DocumentRootを調べるために、まず、httpd.confの場所を特定します。
$ httpd -V | grep httpd.conf
-D SERVER_CONFIG_FILE="/usr/local/etc/apache2/httpd.conf"
DocumentRootを調べます。
$ grep DocumentRoot /usr/local/etc/apache2/httpd.conf
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/usr/local/Cellar/httpd/2.2.23/share/apache2/htdocs"
# This should be changed to whatever you set DocumentRoot to.
# access content that does not live under the DocumentRoot.
DocumentRootへGangliaの管理WebのPHPソースへシンボリックリンクを貼ります。
$ cd /usr/local/Cellar/httpd/2.2.23/share/apache2/htdocs
$ ln -s /usr/local/Cellar/ganglia/3.1.7/share/ganglia/web ganglia
$ ls
ganglia index.html
$ sudo apachectl start
http://localhost/gangliaへアクセスします。
管理Webが表示されたらOK。
メトリクスがGangliaへ送信されるためには、以下が送信側(gmetricコマンド, gmetric4j)と受信側(gmond)で一致している必要がある。
- 通信方法(unicast or multicast)
- unicast/multicastの送信先アドレスとポート
- gmetricプロトコルのバージョン
受信側に問題がないか確認するため、gmetricコマンドで適当なメトリクスを送信してみる。
$ gmetric -n "sample_int8" -v "1" -t int8
この例では、sample_int8という名前のメトリクスを送信した。数秒後、同盟のrrdファイルが/var/lig/ganglia/rrdsディレクトリに作成されていれば、正しく送受信できたといえる。findコマンドで確認してみる。
$ find /var/lib/ganglia/rrds | grep sample
/var/lib/ganglia/rrds/__SummaryInfo__/sample_int8.rrd
/var/lib/ganglia/rrds/unspecified/10.128.56.4/sample_int8.rrd
/var/lib/ganglia/rrds/unspecified/__SummaryInfo__/sample_int8.rrd
guardian-management-playの管理Webが提供するJSONの内容をgmetricコマンドで送信する。 このgistにあるjson_stats_fetcher.rbスクリプトを使う。 実際には、これをcronなどで定期的に実行するとよい。
- An example of Play 2.1 Filters
- この手順には関係ないが、こういうプラグインもあるよ、という情報。
- CodehaleのMetricsというJavaライブラリをPlay2から簡単に利用するためのPlay2プラグインplay2-metricsというものもある。
- Gangliaのチュートリアル
- Gangliaのもう少し詳細なチュートリアル
- OstrichのMetricsをGangliaへ送るサンプル