よしだのブログ

サブタイトルはありません。

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 アプリケーションで共通です。

  1. Java 用のagent(zip)をダウンロードする。
  2. zip を適当なところに解凍
  3. java の起動引数に newrelic の jar を以下のように追加。 -javaagent:/path/to/newrelic.jar

Elasticsearch の場合、JAVA_HOME に設定しておくか、service 化している場合は、以下のファイルを編集することで引数に追加することが出来ます。

/opt/elasticsearch/elasticsearch-1.3.2/bin/service/elasticsearch.conf

ちょっとした注意点

起動したけど、データが入ってこないことが有りました。以下を修正したところうまくいきました。

  1. 場所がわるい

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"

スクリーンショット

が、表示されない。。。一般的なコンテナじゃないと取れない?

f:id:yoshi0309:20141208204915p:plain

JVM は出る。

f:id:yoshi0309:20141208204903p:plain

ヒープの状態。全体だけではなく、Eden領域とSurvivor領域の割合。

f:id:yoshi0309:20141208204909p:plain

Concurrent Mark Sweep の情報。

f:id:yoshi0309:20141208204912p:plain

Parmanent 領域の情報や、GC の実行時間。

f:id:yoshi0309:20141208204907p:plain

うーん。プラグイン使ってみる?

調べてみると、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 で監視するために、コーディング不要で実現できる方法はなさそうです。バージョンが上がるのが何分速いので、追いつくのが難しいでしょうか。放置されているっぽいレポジトリも多く、ちょっと切ない気持ちになりました。

*1:しゅうりょー。。

*2:_cluster/status など

*3:どっちがどっちのプラグインかはアレですが。