JMXのメトリクスをfluentd経由で蓄積する

みなさんJMXは使っていますか?Javaアプリケーションのメモリ使用量を始めとした統計情報を取得したりできる、運用には欠かせないモニタリング・管理の仕組みですが、統計情報を蓄積する方法に悩んでいる方も多いのではないでしょうか。

今回はアプリケーションから取得できる様々な統計情報をfluentd経由で蓄積し、分析やトラブルシュートに活用する方法を紹介します。

JMX用のfluentdプラグイン

JMXの統計情報をfluentdで収集するfluent-plugin-jolokiaというプラグインを使います。

fluent-plugin-jmxではなくfluent-plugin-jolokia?と思われるかもしれません。

JolokiaはJMXをJSONベースのREST APIとして提供するためのエージェントです。fluentdのプラグインはRubyで書かれていますが、Rubyから直接JMXのプロトコルでの通信はできないので、JolokiaをJavaアプリケーションに組み込み、REST API経由でJMXの統計情報を取得します。

Jolokiaをアプリケーションに組み込む

まずはJolokiaをアプリケーションに組み込んでプラグインが通信できる状態にしましょう。Jolokiaのエージェントは4種類ありますが、JVMエージェント版はSun/Oracle製のJVMであれば、どのようなアプリケーションにも組み込めるので、こちらの方法でGlassFishに組み込んでみます。

# エージェントのダウンロード
$ wget -P $GF_HOME/lib -q http://labs.consol.de/maven/repository/org/jolokia/jolokia-jvm/1.1.5/jolokia-jvm-1.1.5-agent.jar

# 起動オプションに設定
$ $GF_HOME/bin/asadmin create-jvm-options '-javaagent\:${com.sun.aas.installRoot}/lib/jolokia-jvm-1.1.5-agent.jar'

# 再起動
$ $GF_HOME/bin/asadmin restart-domain

たったこれだけで、アプリケーションに影響をあたえることなくJolokiaの組み込みができました。キモは-javaagentでjolokiaのjarを指定するところですね。

試しにREST APIを叩いてみましょう。デフォルトではポート8778で通信できます。

# Jolokiaのバージョン確認
$ curl http://localhost:8778/jolokia/version
{"timestamp":1389101423,"status":200,"request":{"type":"version"},"value":{"protocol":"7.0","agent":"1.1.5","info":{"product":"glassfish","vendor":"Oracle","extraInfo":{},"version":"4.0"}}}

# メトリクスを取得してみる
$ curl http://localhost:8778/jolokia/read/java.lang:type=Memory/NonHeapMemoryUsage
{"timestamp":1389101489,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":251658240,"committed":43253760,"init":24313856,"used":43049000}}

これで準備はできました。

fluent-plugin-jolokiaのインストール

続いてプラグインをインストールしましょう。td-agentがインストールされている前提で話を進めます。

fluent-plugin-jolokiaはgemリポジトリに登録されていないので自分でビルドする必要があります。

# GitHubからリポジトリをクローン
$ git clone https://github.com/lburgazzoli/lb-fluent-plugin-jolokia.git
Cloning into 'lb-fluent-plugin-jolokia'...
remote: Counting objects: 37, done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 37 (delta 10), reused 37 (delta 10)
Unpacking objects: 100% (37/37), done.

$ cd lb-fluent-plugin-jolokia/

# GEMパッケージの作成
$ /usr/lib/fluent/ruby/bin/rake
fluent-plugin-jolokia 0.0.1 built to pkg/fluent-plugin-jolokia-0.0.1.gem

# インストール
$ sudo /usr/lib/fluent/ruby/bin/fluent-gem install pkg/fluent-plugin-jolokia-0.0.1.gem
1 gem installed
Installing ri documentation for fluent-plugin-jolokia-0.0.1...
Installing RDoc documentation for fluent-plugin-jolokia-0.0.1...

インストールはこれだけです。

td-agentの設定

最後にtd-agentの設定を行います。/etc/td-agent/td-agent.confに以下のように設定を追記します。

<source>
  # typeはjolokiaを指定
  type jolokia

  # とりあえずTreasure Data DWHに送る
  tag td.glassfish.memory

  # JolokiaのREST APIエンドポイント。末尾のスラッシュ必須
  jolokia_url http://localhost:8778/jolokia/

  # 取得するMBeanを指定。試しにメモリの使用量を取得
  jmx_bean java.lang:type=Memory
  jmx_attribute NonHeapMemoryUsage

  run_interval 5s
</source>

td-agentを再起動すれば無事fluentd経由でJMXのメトリクスを取得できるようになります!

まとめ

いかがでしょか。JMXのメトリクスなんてjconsoleかjmcでしか見たことない、運用には使ってなーい!なんて方でも簡単に導入できるのではないでしょうか。

アプリケーション固有の統計情報をモニタリングするMBeanさえ書いておけば、あとはfluentd経由で統計情報を取得して煮るなり焼くなり好きにできます。ぜひお試しください。

「JMXのメトリクスをfluentd経由で蓄積する」への3件のフィードバック

コメントを残す

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

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>