New Relicに関するメモ

New RelicはAPM(Application Performance Management。日本語では「アプリケーションパフォーマンス管理ツール」と呼ぶ)である。

New Relicによって、インフラストラクチャ・バックエンド・クライアントサイドの性能を分析するための重要な情報を収集することができ、可視化やアラートによって問題の検知を可能にする。

New Relicにおけるデータの種類

データの種類にはTransaction、MobileRequest、BrowserInteractionなどのイベントと、メトリック、ログ、スパンのデータ型がある。主に見ることが多いのは、イベントかもしれない。Data explorerからEventを選択すると、何種類ものイベントがあるのが見える。それぞれのイベントがDBにおけるテーブルのような役目を担っており、それぞれに行としてデータが格納されている。

デフォルトのイベント(New Relicが勝手に取得する)には主に以下のような種類がある。

AjaxRequest

Ajaxリクエストが発生すると、AjaxRequestイベントが自動的に作成される。イベント属性(カラム)は、都市や緯度・経度などの地理情報や通信時間、単一セッションのID、リクエスト本文のペイロードサイズを取得する。

BrowserInteraction

ユーザーがWebページを操作することによって引き起こされる、ブラウザーセッションの作業単位。インタラクションの結果として発生したセッション、AJAX呼び出し、カスタムJavaScriptタイミングに関する情報を取得する。初期のロードとルートの変更は、特別なタイプのブラウザーの相互作用としてキャプチャされ、SPAの監視に使用される。以下のようなイベント属性がある。

  • actionText - ブラウザの操作が開始されたときにクリックされたHTML要素のテキスト。ボタンの文言としてありうる「チケット検索」「検索エリアの設定」といったテキストが入る
  • ajaxCount - SPAインタラクションのタイミングに含まれるすべてのXHRの数
  • appName - リクエストを処理したアプリケーションの名前
  • jsDuration - JavaScriptの実行に費やされた合計時間(秒単位)。(この属性は、最初のページ読み込みイベントには存在しない)
  • timestamp - 通信が発生した時刻(日付、時間、分、秒)
  • session - 単一セッションの一意の識別子。セッションCookieは、ユーザーがブラウザを閉じると期限切れになる(たとえば、Chromeを完全に終了するなど)。ユーザーがブラウザの新しいインスタンスを開くと、新しいセッションIDが割り当てられる。
PageView

PageViewイベントは、ユーザーが新しいページに移動(ロード)したときに発生。ブラウザページの読み込みごとに地理データとタイミングデータを追跡する。

  • backendDuration - 秒単位のバックエンド応答時間
  • name - 呼び出されたWebトランザクションの名前。例:Controller/deals/show
  • pageUrl - PageView用にロードされたページのURL
Transaction

トランザクションは、HTTPリクエスト、SQLクエリ、バックグラウンドプロセス、メッセージキューアクティビティなど、アプリケーションの論理的な作業を意味する。Transactionイベントには、アプリ、データベース呼び出し、トランザクションの期間などに関する情報が含まれる。Transactionにはシステム監視に役立つ情報が多いと見られる。

  • databaseCallCount - 1トランザクションによって行われたデータベース呼び出しの数。
  • databaseDuration - データベースの応答時間(秒単位)。
  • duration - トランザクションのサーバー側の合計応答時間(秒単位)。リクエストのキューイング時間は含まない。
  • error - 実行中にエラーが発生したかどうかを示す。boolean。
  • externalDuration -すべての外部(他社サービスの決済API呼び出しとか)サービスの合計応答時間(秒単位)。
  • guid - トランザクションの識別子。
  • request.headers.accept - HTTPAcceptリクエストヘッダーから読み取られたタイプ。例:( application/xml, text/html, image/gif)

カスタム属性

newrelic.com

一方、分析のためにアプリケーション固有の情報を活用することが必要になってくる場合がある。例えば、ユーザーがどの記事をお気にしたかどうかなどを判断する場合などである。この時、カスタム属性というのを設定することで独自にデータを送ることができる。以下はRubyの例。

::NewRelic::Agent.add_custom_attributes({ 'x-times.user_id' => current_user&.id, 'x-times.favorite_article' => article.id,  'x-times.bookmark_id' => bookmark.id})

カスタムイベント

カスタムイベントとは、個別に作成できるイベントのタイプ。新しいイベントタイプ(APM の TransactionsやPageView、BrowserInteractionに相当)を作成できる。新しいテーブルを追加するイメージ。送信されたカスタムイベントは、Data Explore で確認することができる。

::NewRelic::Agent.record_custom_event('MyApplicationEvent', attrs)

グラフ

NRQLから直接、グラフで生成される。 グラフの種類 docs.newrelic.com

NRQLの事例1 newrelic.com

NRQLの事例2 qiita.com

ファネル

ファネルは行動履歴を見るのにいい。 funnel(user_id で集計するのをuser_idとする。 そして、whereでそれぞれの階層で集計する。 下に行くほど、集計対象数は減る。上に比べて、下は何%とかいったことを調べるといい。

SELECT funnel(session,
    WHERE pageUrl like '%/index.html' AS 'Landing',
    WHERE pageUrl LIKE '%/browse/phones' AS 'Browse ',
    WHERE pageUrl LIKE '%/shoppingcart' AS 'Cart',
    WHERE pageUrl LIKE '%/checkout' AS 'Purchased')
    FROM PageView where appName = 'WebPortal' AND duration < 1
    SINCE 1 week ago

円グラフ

facetを使う。これはgroup byと同じ機能。 以下の場合、coupon_shop.bought_ticket_is_bookmarkedをtrue, falseでグループ分けしている。グラフで表示するテキストは「AS」で変えることができる。

SELECT count(*) AS '直近約3ヶ月でチケットを購入したユーザーがそれをお気に入りに登録していた・いなかったの割合' 
  FROM Transaction 
  FACET cases(
    where coupon_shop.bought_ticket_is_bookmarked IS true AS '登録していた', 
    where coupon_shop.bought_ticket_is_bookmarked IS false AS '未登録') 
  SINCE 90 days ago