概要
New Relicに取り込んだデータを詳細に分析することができるクエリ言語のNRQLですが、より細かい分析をする際に2つのデータを結合して分析したいと感じたことは無いでしょうか?
この度、New Relic アップデート(2023年5月)の中で、遂にNew Relicのクエリ言語にJOINが追加されたので試してみます!
このアップデートの詳細はこちら。New Relic アップデート(2023年5月)
JOINの構文
JOINは次の構文で指定します。基本的にはSQLのJOINと同じなのでイメージしやすいと思います。
詳細はこちらを参照ください。
FROM Event [INNER|LEFT] JOIN (subquery) ON [key =] key SELECT ...
JOINを活用するいくつかユースケースを紹介します。
1. パフォーマンスが悪いアプリのCPU使用率を確認
バックエンドのアプリケーションの応答時間であるレスポンスの情報は、Transactionイベントにdurationという属性で含まれていますが、アプリケーションが動いているサーバーのCPU使用率はTransactionイベントには含まれていないため、Transactionイベントだけでは、レスポンスとCPU使用率の相関関係を一つにして表すことができませんでした。
そこで、今回追加されたJOINを使ってアプリケーションの応答時間を含むTransactionイベントと、CPU使用率の情報を含むProcessSampleイベントをホスト名を使ってJOINで結合して、アプリケーションの応答速度が良くない場合に、ホストのCPU使用率がどのようになっているか一覧で確認できるようにしたいと思います。
まずはJOINする前にそれぞれのデータをNRQLで呼び出してみます。
FROM Transaction SELECT average(duration) FACET host
FROM SystemSample SELECT average(cpuPercent) FACET hostname
では、JOINの構文に従ってTransactionイベントのhostとSystemSampleイベントのhostnameをキーとして結合します。
サブクエリのcpuPercentはそのままでは結合後のSELECTで呼び出せないので、ASでエイリアス名cpuをつけて、average(cpu)
で使用しています。
FROM Transaction
JOIN (FROM SystemSample SELECT average(cpuPercent) AS cpu
FACET hostname) ON host = hostname
SELECT average(duration), average(cpu)
FACET appName, host
このように、TransactionイベントにSystemSampleイベントを結合することで、アプリケーションのレスポンスが遅い場合に、ホストのCPU使用率がどのくらい高くなっているか一覧で確認できるようになりました。
2. アプリが呼び出す処理がブラウザ操作の時間に与える影響
ユーザーがブラウザを操作したときに、そのブラウザの処理の中で必要となる時間の中には、バックエンドのアプリケーションが使用するデータベースや外部サービスへのアクセスなどの時間が含まれていますが、ブラウザセッションの処理に関するBrowserInteractionイベントではバックエンドのアプリケーションのデータベース処理や外部アクセスの時間などは把握することができません。
そこで、今回追加されたJOINを使ってアプリケーションの外部アクセスの時間を含むTransactionイベントと、ブラウザセッションの処理にかかった時間を持っているBrowserInteractionイベントをTransactionの名前を使ってJOINで結合していきたいと思います。
まずはJOINする前にそれぞれのデータをNRQLで呼び出してみます。
FROM Transaction SELECT name, externalDuration WHERE externalDuration IS NOT NULL
FROM BrowserInteraction SELECT backendTransactionName, duration AS 'session duration'
では、JOINの構文に従ってTransactionイベントのnameとBrowserInteractionイベントのbackendTransactionNameをキーとして結合します。
FROM Transaction
JOIN(FROM BrowserInteraction SELECT backendTransactionName,
duration AS total ) ON name=backendTransactionName
SELECT name, total AS 'session duration', externalDuration
WHERE externalDuration IS NOT NULL
このように、TransactionイベントにBrowserInteractionイベントを結合することで、ブラザセッションの処理時間とアプリケーションの外部アクセスの時間を一覧で確認できるようになり、ブラウザセッションのパフォーマンスにアプリケーションの外部アクセスがどの程度影響を与えているか把握しやすくなります。
3. 例外スローされたTransactionのログだけを一覧表示
構造化されたログを表形式で表示することで、どの時間帯にどんなメッセージがでているか確認することができますが、例外がスローされたTransactionのログだけを一覧で表示するには情報が足りないことがあります。
そこで、今回追加されたJOINを使ってログに関するLogイベントと、例外がスローされたTransactionを表すTransactionErrorイベントをトレースIDを使ってJOINで結合していきたいと思います。
まずはJOINする前にそれぞれのデータをNRQLで呼び出してみます。
FROM Log SELECT appName, trace.id, message
FROM TransactionError SELECT count(*) FACET traceId
では、JOINの構文に従ってLogイベントのtrace.idとTransactionErrorイベントのtraceIdをキーとして結合します。
FROM Log
JOIN (FROM TransactionError SELECT count(*)
facet traceId as 'trace.id', appName) ON trace.id
SELECT appName, trace.id, message
このように、LogイベントにTransactionErrorイベントを結合することで、例外がスローされたTransactionのログだけを一覧で表示することができました。
まとめ
New Relic アップデート(2023年5月)に記載されているJOINを試してみました。
New Relicに取り込んだ2つのデータを結合して分析することができる強力な機能なのでぜひお試しください。
このアップデートの詳細はこちら。New Relic アップデート(2023年5月)