顧客に提供する際に、New Relic Browserエージェントの機能をカスタマイズしたいと思ったことはありませんか?もしかしたら、Browserエージェントが ブラウザサポートマトリックスでサポートしているものとは異なるブラウザや、古いブラウザをサポートする必要があるかもしれません。オープンソースのBrowserエージェントには、リポジトリをフォーク(複製)したり、コードを変更したり、独自のカスタムBrowserエージェントを構築したりするオプションがあります。ただし、このプロセスには、コードの学習、システムの構築、ツールのテストなど、フォークされたリポジトリの管理という追加のオーバーヘッドが伴います。さらに、主要なブラウザエージェントリポジトリに加えられた変更を常に最新の状態に保つ必要があるため、フォークを管理するこの作業には労力がかかります。

Browserエージェントでは、解決策として、代わりにnpmパッケージを使用します。npmパッケージを使用すると、クライアント側アプリケーションにBrowserエージェントをインポートし、デプロイする機能を選択して、既に使用しているのと同じJavaScriptビルドプロセスにエージェントを含めることができます。このブログでは、例を用いて上記を実行する方法と、詳細を確認するにはどこにアクセスすればよいかについてご説明します。

なぜnpmパッケージを利用するのでしょう?それは、以下のユースケースにおいて、簡単にカスタマイズすることができるからです。

  • Browserエージェントに含まれる機能のサブセットをリリースする
  • Browserエージェントがネイティブにサポートしていないブラウザをサポートする
  • アプリケーションで使用するBrowserエージェントのバージョンと、バージョンの変更タイミングを制御する
  • アプリのインスタンス(複数の環境または顧客)ごとに異なる設定でBrowserAgentを挿入する
  • オープンソースBrowserエージェントからフォークしたリポジトリを維持・メンテナンスするための、各種コスト(TCO)を削減する

ブラウザアプリを作成し、設定値を取得

まず初めに、New Relicで新しいブラウザアプリを作成するか、npmパッケージで使用する既存のブラウザアプリを見つける必要があります。これは、対応するAPMエージェントの有無にかかわらず実行できます。アプリを作成するには、次の手順に従います。

  1. New Relicを開き、ナビゲーションパネルからAdd Dataを選択します
  2. [Browser & mobile]を選択し、Browser monitoringデータソースを選択します
  3. デプロイメント手法として、APMまたはコピー/ペーストを選択します
  4. APMで監視されている既存のアプリを選択するか、新しいアプリに名前を付けて[有効にする]をクリックします

次に、npmパッケージ経由でエージェントをインスタンス化する際のオプションの定義のため、ブラウザアプリの設定値を取得する必要があります。

  1. New Relicのナビゲーションパネルから[Browser]を選択して、ブラウザアプリを表示します
  2. 目的のアプリを選択し、Applicatoin settingsページに移動します
  3. Copy/Paste JavaScriptボックスから、NREUMオブジェクトに割り当てられた設定値(initinfoloader_config)をコピーします。これらの設定値は、npmパッケージを使用してエージェントをインスタンス化するときに使用します

npmパッケージを使用した、計装のセットアップ

アプリケーションでエージェントを使用できるようにするには、NPMまたはYarn経由でインストールします。

$ npm install @newrelic/browser-agent --save
$ yarn add @newrelic/browser-agent

最良の結果を得るには、Browserエージェントができるだけ早くページに読み込まれることが重要です。Browserエージェントはブラウザアプリケーションにバンドルされるため、早期に(できれば最初に)確実に実行される場所を選択する必要があります。ほとんどのブラウザアプリケーションには、エントリーポイントと呼ばれるJavaScriptまたはTypescriptファイルがあります。これは、サイトの読み込み時に実行される最初のファイルであり、Browserエージェントをインスタンス化するのに最適な場所です。

ブラウザアプリケーションのエントリポイントのソースファイルを変更します。おそらく、次の例と似たようになるかと思います。

import { BrowserAgent } from '@newrelic/browser-agent/loaders/browser-agent'
// 残りのクライアント側アプリケーションはインポート

// コピー&ペーストしたJavaScriptスニペットの値を使用してデータを入力。
const options = {
  init: { ... }, // NREUM.init
  info: { ... }, // NREUM.info
  loader_config: { ... } // NREUM.loader_config
}

// エージェントローダーコードは、インスタンス化時にすぐに実行。
new BrowserAgent(options) 
 // クライアント側アプリケーションの残りのコード

New RelicのNREUMオブジェクトの値(initinfoloader_configの値)でオプションオブジェクトを更新します。ブラウザアプリケーションを構築しデプロイして、変更を適用します。これで、コピー/ペーストやAPMインジェクション手法で得られるものと同じ、完全かつ自動のサイトインストルメンテーションを入手できます。

計装をカスタマイズする

BrowserAgentクラスは、Browserエージェントの利用可能なすべての機能を含むユーティリティクラスです。npmパッケージには、含めたい機能の配列を渡すことができるAgentクラスも含まれています。これにより、サイトに計装されるものや、New Relicへの報告内容をカスタマイズできます。

次のコードスニペットをご覧ください。この例には、Browserエージェントに対して有効にできる現在の機能がすべて含まれています。ただし、インポートしてfeatures配列に含める機能を選択することはできます。

import { Agent } from '@newrelic/browser-agent/loaders/agent'
import { Ajax } from '@newrelic/browser-agent/features/ajax';
import { JSErrors } from '@newrelic/browser-agent/features/jserrors';
import { Metrics } from '@newrelic/browser-agent/features/metrics';
import { PageAction } from '@newrelic/browser-agent/features/page_action';
import { PageViewEvent } from '@newrelic/browser-agent/features/page_view_event';
import { PageViewTiming } from '@newrelic/browser-agent/features/page_view_timing';
import { SessionTrace } from '@newrelic/browser-agent/features/session_trace';
import { Spa } from '@newrelic/browser-agent/features/spa';
// 残りのクライアント側アプリケーションはインポート

// コピー&ペーストしたJavaScriptスニペットの値を使用してデータを入力
const options = {
  init: { ... }, // NREUM.init
  info: { ... }, // NREUM.info
  loader_config: { ... }, // NREUM.loader_config
features: [
    Ajax,
    JSErrors,
    Metrics,
    PageAction,
    PageViewEvent,
    PageViewTiming,
    SessionTrace,
    Spa
  ]
}

// エージェントローダーコードはインスタンス化時にすぐに実行。
new Agent(options) 
 // ブラウザアプリケーションコードの残りの部分

JavaScriptツールチェーンのサポート

多数のクライアント側のビルドツールがあり、これらのツールの多くは、Browserエージェントのnpmパッケージを統合およびカスタマイズする上で便利な機能を提供します。たとえば、webpackでは、Browserエージェントのnpmパッケージに変換を適用するように設定することで、ブラウザサポートマトリックスにないブラウザのサポートを提供できるようになります。例については、次のコードスニペットを確認してください。

{ 
 ... // その他のwebpack構成設定
 rules: [{
 test: /\.(js|jsx)$/i, 
 exclude: /node_modules\/(?!@newrelic\/browser-agent).*/, 
 use: 'babel-loader' 
 }], 
 ... // その他のwebpack構成設定
 }

このwebpack設定では、babelルールのexcludeプロパティが更新され、Browserエージェントのnpmパッケージもbabelによって変換されます。npmパッケージコードの変換に対する同様のサポートは、他の多くのJavaScriptビルドツールでも利用できます。

デモ動画:Reactアプリにカスタマイズ可能なBrowserエージェントを追加

これらのプロセスのチュートリアルを確認するには、Johnathan Potterの以下の動画をご覧ください。この例では、newrelic-browser-agentパッケージをReactアプリに追加します。