これは、New Relic Advent Calendar 2021 | 12日目の投稿です。
やりたいこと
New Relic APMでシステムのパフォーマンスのボトルネックを調査する際、はじめに確認するのはTransactions > Most time consuming
ではないでしょうか。
このビューはWebのリクエストを処理時間×リクエスト数が多い順に表示しているため、ユーザが待機しているサーバ処理時間の中で支配的なリクエスト特定するために役立ちます。また、リアルタイムにユーザのアクセスパターンを知ることができるのも運用の知見を獲得する上でメリットがあります。
このような集計をする場合、GETリクエストはURIの中にユーザIDやアイテムIDを含むことが多く、アクセスログではグループ化が面倒なことがありますが、APMであればコントローラの処理単位となるため集計に頭を悩ませることがないのが良いですね。
この集計はAPMを導入しているアプリケーション単位で行われていますが、パフォーマンスのボトルネック調査はユーザ体験の改善に焦点を当てているため、同一アプリケーションの中でもクライアント別に集計したい要件がでてきます。
- Botや内部サーバからのリクエスト、ヘルスチェックは集計対象外にしたい
- Webとスマホアプリでアクセスパターンが異なるため、それぞれごとに集計したい
やりかた
New Relic APMのUI上ではクライアントによって集計範囲をカスタマイズする機能はなさそうだったので(New Relic MobileやNew Relic Browserと連携すればできるのかもしれませんが)、元データのNRDBを当たってみることにしました。
NRQLを叩いてAPMのデータソースであるTransactionsをみてみると、request.headers.userAgent
というデータが入っています。WHERE句で任意のフィルタを書いた上で、コントローラの処理の名称(name)でグループ化(facet)して、処理時間(duration)の合計(sum)を高い順に表示してあげれば、特定のUser AgentでTransactions > Most time consuming
とほぼ同じ集計結果を表示することができそうです。
FROM Transaction SELECT sum(duration) as total_duration
WHERE request.headers.userAgent NOT LIKE '{USER AGENTの文字列}%'
FACET name ORDER BY total_duration DESC
全体・Web・スマホアプリでリクエストの傾向の違いを可視化するダッシュボードを作成してみました。
まとめ
- 普段APMのUIでなんとなく見ているビューも大元のNRDBにあるデータをNRQLでクエリすればカスタマイズして表示することができる
-
SELECT * FROM Transactions
でどんなデータが入っているのかを一度確認しておくと何かに使えるデータを発見できるかも
New Relic APMを使いこなしてユーザ体験を改善しましょう!