LoginSignup
4
4

More than 5 years have passed since last update.

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

Posted at

デジカの宮澤です。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

insights_nrql_ad_01.png

ファンネルでは、"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

insights_nrql_2.png

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

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

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

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

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

insights_nrql_03.png

円グラフでみた場合

insights_nrql_3_2_2.png

棒グラフでみた場合
insights_nrql_3_3_2.png

バケットには以下の関数が使えます。意味は、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

insight_nrql_4.png

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

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

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

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

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

insight_nrql_5.png

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) でもいいのかな。

insight_nrql_6.png

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> のところは各自のアプリ名に置き換えてください。

insight_nrql_7.png

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 の例など載っていると思いますので、そちらものぞいてみると面白いかも

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4