halookで始めるHadoop/HBaseトラブルシューティング

第7回 halookを支える技術「ENdoSnipe」

この記事を読むのに必要な時間:およそ 2.5 分

これまでの連載では,halookを使ってHadoop/HBaseの内部動作を可視化しながら,各処理がどのように動作しているのかを紹介してきました。今回から数回は少し趣向を変えて,halookを支えるプロダクトであるENdoSnipeについて紹介します。これまでの連載でも何度となく登場したENdoSnipeですが,これまで特に説明していませんでした。そこで,これから3回にわたってENdoSnipeについて紹介します。

図1 halookを支えるENdoSnipe

図1 halookを支えるENdoSnipe

halookを生んだENdoSnipe

ENdoSnipeはAcroquest Technology株式会社が開発した,Javaシステムの可視化・診断ツールです。元々はプロプライエタリな製品でしたが,halookの公開と同時にオープンソース化して,業務や自宅開発など様々な用途で利用してもらえるようになりました。またENdoSnipeはAPM(アプリケーション性能監視ソフト)として使える側面もあり,数少ないオープンソースのAPMとして利用することができます。

ENdoSnipeは,以下のモジュールで構成されています。

1.Javelin

Javaクラスに測定ポイントを仕掛けて,そこから情報を収集するエージェント。

2.DataCollector

Javelinで収集した情報を蓄積するデータストア。複数のJavelinから情報を収集することができます。

3.Dashboard

収集した情報を可視化するためのWebアプリケーション。グラフや表での表示を行うほか,PerformanceDoctorによる診断などができます。

対象アプリケーションと共にJavelinを動作させることで情報を収集し,DataCollectorにいったん蓄積したうえで,その情報を後からDashboardで可視化したり,PerformanceDoctorで診断することで,アプリケーションに障害が潜んでないかを確認・診断することができます。

また,ENdoSnipeは以下の用途を想定しています。

タイミング用途
開発中の動作確認問題の種になりそうなバッドプラクティスの検出のため
パフォーマンス試験性能測定や性能問題の検出のため
トラブルシューティング問題解析や原因の特定のため
実運用性能監視のため
問題発生時の情報収集のため

このように開発から運用まで幅広い開発工程で利用することを想定しています。

halookはこのENdoSnipeのプラグインとして開発しており,Javelinを拡張してHadoopの情報を取得できるようにしたり,DashboardにHadoop用のビューを追加することで,Hadoopを解析できるようにしています。同様の手法で,他のOSSなアプリケーションやミドルウェアを解析するためのツールも構築することができるでしょう。

Javelin : ENdoSnipeのコア機能

では,どのようにしてENdoSnipeはJavaの内部情報を取得しているのでしょうか。Java内部の情報を取得する方法としては,たとえばスレッドダンプやヒープダンプがあります。これらを取得すれば,Java内部で動いている全てのスレッドの情報やヒープメモリの状況は分かりますが,情報として十分ではありません。たとえば引数や戻り値,途中で呼び出したユーティリティクラスのメソッドなどは取得できないでしょう。

ENdoSnipeではJava内部の詳しい情報を取得するために,BCI(Bytecode Instrumentation)を利用して,ソースコードを一切書き換えることなく,Javaクラスの書き換えを行っています。このクラス書き換えと,情報の取得を行うプロダクトがJavelin(JAVa Extensible Logging INfrastructure)です。Javelinは解析対象のアプリケーションに対するエージェント(javaagent)として振る舞い,動的にJavaクラスを書き換えることで,解析に必要な情報の取得を行っています。たとえばArrayListクラスのaddメソッドを書き換えて,メソッドが呼び出された際に「add後のオブジェクト数を取得してログデータに出力する」という処理を追加することで,ArrayListのオブジェクト数を取得する,といった形です。なお,JavelinはBCIのライブラリとしてjavassistを利用しており,ソースコードに手を入れずにクラスの書き換えを行っています。

DataCollector:データの収集・中継役

Javelinで取得したJava内部の情報は,いったんDataCollectorに集約されてからDashboardで可視化されます。つまりDataCollectorはJavelinから取得した情報の収集・中継役と言えるでしょう。DataCollectorに情報を集約することで,複数のJavaプロセスから情報を収集し,まとめて可視化することができます。

著者プロフィール

谷本心(たにもとしん)

Acroquest Technology株式会社システムズコンサルティングディヴィジョン所属。フレームワークの開発/支援を中心に行うほか,ENdoSnipeの開発やトラブルシューティングの教育などを行っている。本業以外でもJavaコミュニティで活動しており,日本Javaユーザーグループ(JJUG)幹事,関西Javaエンジニアの会の主催を務める。

http://www.acroquest.co.jp/

コメント

コメントの記入