Elasticsearch と NewRelic の連携について (うまくいきませんでした。。)
これは Elasticsearch Advent Calendar 2014 - Qiita 、8日目の記事です。
Elasticsearch については、このブログや ES Advent Calendar を見ている方には不要かと思います。NewRelic とは、パフォーマンス監視サービスで、ユーザー登録を行い、サーバー上にエージェントを登録することで様々な情報を収集、可視化することが出来ます。Java なら JVM のヒープの状態や、Webアプリケーションなら、リクエスト数や処理時間などです。個人的にすごいなと思ったのは、SQL や外部のWebサービスのレイテンシーを得ることも可能です。
というわけで、NewRelic で Elasaticsearch のステータスが監視できると便利かな、ということで試してみました。Elasticsearch には marvel というプラグインがあり、ノードごとで様々な情報をモニターすることが出来ます。 もし連携が可能であれば marvel と比較すると、全てのノードを登録することで、1つのページで一覧ができるなどのメリットが考えられます。また、Elasticsearch のノードだけではなく、自作のアプリケーションやサーバーのパフォーマンス情報など一式全てを一覧することが出来ます。
ですが、先に結論めいたことを書いておくと、今回の検証ではうまく連携することが出来ませんでした。 *1残念。おそらく、現状では簡単に連携する方法が無いと思われます。
標準の Java agent では、JVM のステータスのみしか取得することが出来ませんでした。Tomcat や Jetty などの標準的なコンテナエンジンに乗っていれば、色々と取得できたようですが。
Elasticsearch と NewRelic を連携させるプラグインが様々ありますが、いずれもうまく動きませんでした。ログを見る限りでは、Elasticsearch からは API 経由*2で情報を取得できているようなのですが、NewRelic にうまくデータを登録できていないようです。
環境
New Relic Agent v3.12.0 Elasticsearch 1.3.2 Amazon Linux
標準の Java Agent で監視してみる
以下、標準の Java Agent で監視してみる手順です。
手順
https://docs.newrelic.com/docs/agents/java-agent/installation/java-agent-manual-installation
基本的な手順はすべての Java アプリケーションで共通です。
- Java 用のagent(zip)をダウンロードする。
- zip を適当なところに解凍
- java の起動引数に newrelic の jar を以下のように追加。 -javaagent:/path/to/newrelic.jar
Elasticsearch の場合、JAVA_HOME に設定しておくか、service 化している場合は、以下のファイルを編集することで引数に追加することが出来ます。
/opt/elasticsearch/elasticsearch-1.3.2/bin/service/elasticsearch.conf
ちょっとした注意点
起動したけど、データが入ってこないことが有りました。以下を修正したところうまくいきました。
- 場所がわるい
NewRelic の展開した zip は application home 以下に置け、という記述が有ります。Elasticsearch の場合、以下のように、Elasticsearch の zip を添加した直下に置くとうまくいきました。
cd /opt/elasticsearch/elasticsearch-1.3.2 mv /opt/newrelic/ ./ export JAVA_HOME="-javeagent:/opt/elasticsearch/elasticsearch-1.3.2/newrelic/newrelic.jar"
スクリーンショット
が、表示されない。。。一般的なコンテナじゃないと取れない?
JVM は出る。
ヒープの状態。全体だけではなく、Eden領域とSurvivor領域の割合。
Concurrent Mark Sweep の情報。
Parmanent 領域の情報や、GC の実行時間。
うーん。プラグイン使ってみる?
調べてみると、Elasticsearch と NewRelic のプラグインが色々と有りました。*3 ざっと見つけたもので以下3点が有りました。上の2点を試してみましたが、いずれもデータを得ることは出来ませんでした。。3つ目は古く、Elasticsearch のバージョンとフィットしないので検証していません。
https://github.com/MeetMe/newrelic-plugin-agent
- Elasticsearch だけでなく、色々なプラットフォームをサポートする、より汎用的なプラグイン
https://github.com/secondimpression/newrelic_elasticsearch_agent
- Elasticsearch 専用のプラグイン。
https://github.com/viniciusccarvalho/elasticsearch-newrelic
- Elasticsearch の公式でも紹介されているが、ちょっと古い。2013 年からアップデートがされていない。
まとめ
大変残念ながら、現状では Elasticsearch の情報を NewRelic で監視するために、コーディング不要で実現できる方法はなさそうです。バージョンが上がるのが何分速いので、追いつくのが難しいでしょうか。放置されているっぽいレポジトリも多く、ちょっと切ない気持ちになりました。