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 から、設定画面を開いてみましょう。
細部に渡るパフォーマンス計測は、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 { (なにか処理が書いてある…) } }
暫く待つと、Transactionの詳細で結果が見れるようになります。
なるほど、やはり、example.A/aでほぼ時間をつかっていることがわかります。
その中の実装をみてくと、example.B/bを呼んでいる様に見えるので、そこも可視化できるように設定を足してみます。
(設定例)
しばらく経つと、Transactionの詳細が見えるようになります。
これで、AとB,どちらがどのくらいボトルネックになっているのかがわかりました。ここから先は…頑張って改善しましょう!
まとめ
ということで、今回はJVM環境でのCustom Instrumentを紹介しました。まずは無設定の状態で試してください。それでもかなり多くの情報が得られるはずです。それ以上、標準のトランザクション分析よりも詳細な情報が欲しい場合に、お試しいただければと思います。
別の言語では多少の実装が必要があります。プロダクションコードに一時的な実装を加えて、試してみてください。くわしくは、カスタムインストゥルメンテーションのドキュメントを御覧ください。
それでは、Happy hacking🎉🎉🎉
本ブログに掲載されている見解は著者に所属するものであり、必ずしも New Relic 株式会社の公式見解であるわけではありません。また、本ブログには、外部サイトにアクセスするリンクが含まれる場合があります。それらリンク先の内容について、New Relic がいかなる保証も提供することはありません。