New Relic Insights: ファンネルやヒストグラムなど NRQL でいろいろ試してみよう(応用編)


デジカの宮澤です。Advent Calendar 8日目のNew Relic Insights: NRQL をいろいろ試しみよう(基本編)の続きです。

8日目を見ていない方に説明すると、New Relic Insights の Query 画面にNRQL のチュートリアル (Insights > Query > Analyze) があります。NQRL のサンプルが載っていて、基本(Basic)と応用(Advanced)に別れています。前回は、基本を紹介しました。ここでは、応用と弊社での利用例を紹介していきたいと思います。

NRQL って何?っていう人は、この記事を読む前に New Relic Insights: NRQL をいろいろ試しみよう(基本編) をご覧ください。

NRQL の応用編

サイトのトップから、ログイン、チェックアウトまでのユーザーの行動を見てみたい (Funnel の利用)

SELECT funnel(session, 
  WHERE pageUrl = 'http://www.home.com' AS 'Home', 
  WHERE pageUrl = 'http://www.home.com/signup' AS 'Signup', 
  WHERE pageUrl = 'http://www.home.com/thankyou' AS 'Checkout') 
FROM PageView SINCE 1 week ago

上記の例はそのままテストできない(一致するようなパスがあれば別だけど)ので、弊社では Pro スチーマーという EC サイトを運営しているので、そこで、カート > ログイン(またはユーザー登録) > 住所入力画面表示。の流れをファンネルで表示してみたいと思います。

SELECT funnel(session, 
  WHERE pageUrl = 'https://steam.degica.com/c/cart' AS 'Cart', 
  WHERE pageUrl = 'https://steam.degica.com/c/checkout/registration' AS 'Signup', 
  WHERE pageUrl = 'https://steam.degica.com/c/checkout/address' AS 'Address') 
FROM PageView SINCE 1 week ago

ファンネルでは、"A" を満たした人(上の例では Cart 部分)、"A"も"B"も満たしたい人(上の例では Signup 部分)、"A"も"B"も"C"も満たした人(上の例では Address 部分)を示しています。

全コントローラーのうち名前に "data" が含まれているコントローラー名とスループットのリストは?(ワイルドカード検索)

NRQL では、LIKE または NOT LIKE 句が使えます。ここでは、コントローラー名に data を含むトランザクションとその数を抽出しています。

SELECT count(*) FROM Transaction 
  WHERE name LIKE '%data%' FACET name SINCE 1 day ago

曜日ごとのスループットは?(コホート分析)

コホート分析は、タイムスタンプをベースにグループ化し、日付と時刻の指定した範囲をカバーするバケットにそれらを分離します。

特定のアプリの過去1週間のトランザクションを曜日別にその数を抽出しています。

SELECT count(*) 
FROM Transaction 
WHERE appName = '<app_name>' 
SINCE 1 week ago 
FACET weekdayOf(timestamp)

※ FACET は、SQL の 'GROUP BY' です。
※ <app_name> のところは各自のアプリ名に置き換えてください。

円グラフでみた場合

棒グラフでみた場合

バケットには以下の関数が使えます。意味は、yearOf なら年別とかです。

  • yearOf()
  • quarterOf()
  • monthOf()
  • weekOf()
  • weekdayOf()
  • dateOf()
  • dayOfMonthOf()
  • hourOf()

デフォルトで、"timestamp" 属性で上の関数は使えます。独自のタイムスタンプのカスタム属性を追加していた場合は、それらも使えます。例えば、アカウント作成日時とか購入日時など。

平均処理時間が1秒以上のアプリにおけるトランザクションの割合は?(percentage の利用)

特定のアプリの過去1日のトランザクションのうち、処理時間が1秒以上の割合を抽出しています

SELECT percentage(count(*), WHERE duration > 1) FROM Transaction WHERE appName = '<app_name>' SINCE 1 day ago

percentage 関数は、条件に一致したデータの割合を返します。文字列のデータに関しても使えます。コントローラー名に data が含まれるトランザクションの割合が見たい場合とか。Pageview データを元に特定のブラウザを使用しているユーザーの割合を見たい場合など。

※ <app_name> のところは各自のアプリ名に置き換えてください。

アプリの処理時間をパーセンタイルで表すとどうなる?(percentile の利用)

SELECT percentile(duration, 5, 50, 95) 
FROM Transaction 
WHERE appName = '<app_name>' 
TIMESERIES AUTO

※ <app_name> のところは各自のアプリ名に置き換えてください。

percentile 関数は、指定されたパーセンタイルに含まれる数(ここではトランザクション数)を返します。この関数と一緒にTIMESERIESを使うと、時系列グラフでパーセンタイルの推移をみることができます。

percentile 関数の仕様は、ここ

アプリにおけるレスポンスタイムの分布はどうなっている?(histogram の利用)

SELECT histogram(duration, width: 2, buckets: 20) 
FROM Transaction 
WHERE appName = '<app_name>' 
SINCE 1 day ago

※ <app_name> のところは各自のアプリ名に置き換えてください。

※ 引数の widthbucketsというキー名はなくても同じ結果ぽい。histogram(duration, 2, 20) でもいいのかな。

histogram 関数は、引数としてデータ分割に必要な時間幅とバケット数を取ります。第2引数は、グラフの上限(ここでは、x軸の上限が2.0となっている)。第3引数は、x軸を何分割で表すか(ここでは、20分割している)

histogram 関数の仕様は、ここ

処理時間帯別における DB の処理時間の割合は?(buckets の利用)

SELECT average(databaseDuration) 
FROM Transaction 
FACET buckets(duration, width: 5, buckets: 10) 
WHERE appName = '<app_name>' 
SINCE 1 day ago

※ <app_name> のところは各自のアプリ名に置き換えてください。

buckets 関数は、指定されたデータを条件に従って、分割します。ここでは、全体の処理時間に対するDBの平均処理時間(average (databaseDuration))を抽出しています。平均の処理時間と全体の処理時間に相関関係があるのであれば、全体の処理時間が増えれば増えるほど、DBの処理時間も増えるはずです。

上記の結果をみると、途中(3.5 から 4.5)では(2.5-3.5)より平均処理時間が低いですね。ということは、3.5-4.5に関係する処理では、DB以外(たぶん外部サービス)で時間のかかる処理が多いと判断できそうです。

弊社での利用例

最後に簡単に、弊社で Insights をどうように利用しているかを紹介させていただきます。

デジカでは、Komoju という決済サービスを提供しています。その決済データを カスタムイベントを使って、Insights で各種データを見れるようにしています。

以下は、デジカで使っている NRQL のサンプルです。

一日あたりの売上の比較(前日と本日)

SELECT sum(total) 
FROM PaymentStatus 
WHERE appName='<app_name>' AND status = 'captured' 
TIMESERIES auto 
SINCE 1 day ago 
COMPARE WITH 1 day ago

決済情報は、PaymentStatus というイベント名でカスタムイベントを送っているので、そのテーブルを使います。

COMPARE WITHを使って、前日との比較を行っています。

エンドユーザーの Apdex スコア(直近1時間)

SELECT apdex(duration, t: 2.0) FROM PageView WHERE appName='<app_name>'

apdex の第2引数の t は、Apdex Tの閾値です。単位は秒です。

Apdex 関数の説明は、NRQL リファレンスをご覧ください。

支払方法別の使用割合(直近1週間)

SELECT count(*) from PaymentStatus facet payment_method where appName = '<app_name>' and status = 'captured' since 1 week ago

特に説明は必要ないかな。

コンビニ支払いのコンバージョン(直近1週間)

SELECT funnel(uuid, WHERE status='pending' as 'pending', WHERE status = 'authorized' as 'authorized', WHERE status = 'captured' AS 'captured') 
FROM PaymentStatus 
WHERE payment_method='konbini' and appName = '<app_name>' 
SINCE 1 month ago

これも特に説明は必要ないかな。

さいごに

どうでしたでしょうか?実際のビジネスで利用した際のイメージができたかと思います。ここでは、データソースとして、Transaction や Pageview くらいしか使っていませんが、その他にも、APM の TransactionError や Mobile のデータ、Sythetics のデータもあります。外部からも送ることができます。是非、データを横断、多角的に分析するツールとして活用してみてください。

もっと、NQRL について知りたい方は、是非公式ドキュメントをご覧ください。
- NRQL リファレンス
- NRQL で数式の利用
- コミュニティでも NRQL の例など載っていると思いますので、そちらものぞいてみると面白いかも