Transaction詳細画面
Transaction詳細

APMをお使いの方は、Transactionの情報をよくご覧になると思います。Transactionの詳細画面では、それぞれのコントローラ内部の一連の処理のうち、何にどれくらい使われているのかの詳細がわかるようになっています。RDBにどのくらいかかっているか、外部サービス呼び出しがどのように行われているか…。ただし、アプリケーションコードの細部まで常にデータを取得しているわけではありません。通常は対応しているフレームワークやライブラリから、DBアクセスなど、一般的にパフォーマンスボトルネックになりやすい箇所を集めています。コードの内部でどのようなパフォーマンスになっているかを詳細に調べるために、Custom Instrumentの追加が必要な場面があります。

ということで、試してみましょう!

Custom Instrumentを試す

Custom InstrumentはすべてのAPMでサポートされていますが、今回は例としてJava環境で試してみましょう。Java, ScalaなどJVMでの環境ではなんと、New Relic APMのSettingsからCustom Instrument追加することができます。他の言語では多少の実装(つまりInstrument)が必要なのですが、Javaでは動的に設定を注入し、計測を開始できることになります。

APM > Settings > Instrumentation から、設定画面を開いてみましょう。

Custom Instrumentの初期画面
Custom Instrumentの初期画面です

細部に渡るパフォーマンス計測は、CPU使用率の増加やレスポンスタイムの悪化など、アプリケーションの挙動に副作用をもたらすことがあります。注意点は2点。

  • データ収集は1トランザクションあたり10回程度にしておく
  • ステージング環境などで最初に試すのがおすすめ

Thread Profilerの結果からメソッドを選ぶことはできますが、今回はあらかじめアタリをつけたメソッドを調べることにします。メソッドシグネチャで指定することができます。Class nameにはパッケージ名を含めたクラス名を指定するように注意してください。

例えば、コードはこんな感じだったとしましょう。コントローラである HelloServlet の中でAクラスインスタンスが生成され、aメソッドが呼ばれていることがわかっているので、そこを調べてみます。

package example;



(中略...)



public class HelloServlet extends HttpServlet {

    public void doGet(HttpServletRequest req, HttpServletResponse res) {

        try {

            A a = new A();

            a.a();

            res.getWriter().println("it works!");

        } catch (Exception e) {

            throw new RuntimeException(e);

        }

    }

}



class A {

    public void a() throws Exception {

        (なにか処理が書いてある…)

    }

}

Custom Instrumentationに設定を追加する
Custom Instrumentationに設定を追加する

暫く待つと、Transactionの詳細で結果が見れるようになります。

Aの処理がとにかく重いことがわかる
Aの処理がとにかく重いことがわかる

なるほど、やはり、example.A/aでほぼ時間をつかっていることがわかります。

その中の実装をみてくと、example.B/bを呼んでいる様に見えるので、そこも可視化できるように設定を足してみます。

(設定例)

Bの設定を足してみました
Bの設定を足してみました。xmlでのインポート/エクスポートもできます。

しばらく経つと、Transactionの詳細が見えるようになります。

Bがきた様子
example.B/bの負荷は少なめではある

これで、AとB,どちらがどのくらいボトルネックになっているのかがわかりました。ここから先は…頑張って改善しましょう!

まとめ

ということで、今回はJVM環境でのCustom Instrumentを紹介しました。まずは無設定の状態で試してください。それでもかなり多くの情報が得られるはずです。それ以上、標準のトランザクション分析よりも詳細な情報が欲しい場合に、お試しいただければと思います。

別の言語では多少の実装が必要があります。プロダクションコードに一時的な実装を加えて、試してみてください。くわしくは、カスタムインストゥルメンテーションのドキュメントを御覧ください。

それでは、Happy hacking🎉🎉🎉