New Relic Browser で「ユーザーID」「会員ランク」「ABテスト群」などを分析に使いたい時、setCustomAttribute を使う方は多いと思います。
しかし、
「画面遷移したら値が消える」
「F5 を押した瞬間に属性が飛ぶ」
という挙動に悩んだことはないでしょうか。
newrelic.setCustomAttribute('userRank', 'Gold');
標準的な実装(引数2つ)の場合、画面遷移やリロードをすると値が消えてしまうという課題があります。
これを解決するために sessionStorage などを自前で実装する方法もありますが、実は New Relic の標準機能だけで解決できる場合があります。
今回は、第3引数 persist オプションについて、その仕組みと正しい使い分けを解説します。
最新のアップデートの詳細はこちら
New Relic アップデート一覧
無料のアカウントで試してみよう!
New Relic フリープランで始めるオブザーバビリティ!
第3引数「persist」とは?
setCustomAttribute には、オプションとなる3つ目の引数(boolean)が存在します。
// 第3引数を true にすると、永続化(Persist)モードになる
newrelic.setCustomAttribute('key', 'value', true);
これを true に設定すると、Browser Agent はカスタム属性の値をブラウザの LocalStorage に保存し、ページ遷移やリロードを行っても値を維持(復元)する ようになります。
※ persist: true は Cookie ではなく LocalStorage を利用したセッション管理 です。
通常(第3引数なし)の場合、カスタム属性はブラウザ上に一時的に保存されるだけです。そのため、ブラウザがページを読み込み直すタイミングでデータはすべて消えてしまいます。
しかし persist: true を設定すると、以下の表のように「リセットされるタイミング」でも値が維持されるようになります。
| シチュエーション | 第3引数なし(デフォルト) | persist: true |
|---|---|---|
| MPA でのページ遷移 | ❌ 消える | ✅ 引き継がれる |
| SPA でのブラウザリロード | ❌ 消える | ✅ 引き継がれる |
New Relic のデータで永続化を確認
では、実際に persist: true を設定した状態で、データがどのように New Relic に送られているかを確認してみましょう。
// 検証用コード:固定値をセット
newrelic.setCustomAttribute('testAttr', 'from_mpa_page1');
newrelic.setCustomAttribute('testAttr', 'from_spa_page1');
この状態で画面遷移を行い、遷移後の AjaxRequest や BrowserInteraction, PageView イベントにこの属性が含まれているかを確認します。
結果の確認には下記のNRQLを使用しています。
SELECT appName,eventType(), targetUrl or pageUrl, category or actionName,browserInteractionName, testAttr
FROM PageView, `BrowserInteraction`, PageAction, AjaxRequest
SINCE 30 minutes ago UNTIL now LIMIT MAX
ケース1:MPA でのページ遷移
MPAで、ページ1で属性をセットし、ページ2へリンク遷移した場合のデータです。

通常(persist: false)であれば、/page2.html に遷移した時点でブラウザがリロードされ、属性値は null になってしまいます。 しかし、persist: true を有効にしているため、セッションが切れない限り、どのページに遷移しても属性が付いてきていることが分かります。
これにより、「コンバージョンしたユーザーは、最初のページで何の属性を持っていたか?」といった分析が途切れずに実現できます。
ケース2:SPA でのブラウザリロード
次に、SPA(React/Vue等)で persist: true が真価を発揮する「F5リロード」のケースです。
SPAでは、リロードを行うと JavaScript のメモリが全てクリアされるため、通常であれば属性は消失します。 しかし、persist: true の場合、New Relic Agent が初期化された直後(PageViewイベント発生時)に LocalStorage から値を吸い上げ、即座に属性をセットし直している 様子が見て取れます。
これにより、ユーザーが誤ってリロードしてしまっても「誰が操作しているか」というコンテキストを見失わずに計測を継続できます。
裏側の仕組み:30分ルールと有効期限
「永続化」といっても、LocalStorage に半永久的に残り続けるわけではありません。 New Relic Browser Agent は、セッション管理のために以下の 「有効期限ルール」 を持っています。
| ルール | 内容 |
|---|---|
| アイドルタイムアウト | 最後の操作から 30分 経過するとリセット |
| 最大セッション時間 | 最初のアクセスから 4時間 経過するとリセット |
つまり、persist: true にした属性は、「ユーザーがサイトを利用している間(セッション中)は維持されるが、離脱して30分経てばリセット」 という、分析において非常に都合の良い挙動をしてくれます。
実際に persist: true が正しく動作しているか、およびセッションの有効期限が設定されているかは、Chrome DevTools で裏側のデータを見ることで確認できます。
- Chrome DevTools を開き、Application タブを選択します
- 左メニューの Local Storage > [開いているドメイン] を選択します
- NRBA_SESSION というキーを探します
ここには、以下のようなデータが保存されています。
{
"value": "7c9f3a85eeec3380",
"inactiveAt": 1767398603882,
"expiresAt": 1767410890360,
"custom": {
"testAttr": "from_mpa_page1"
},
// ...その他メタデータ
}
確認ポイント
custom: ここに setCustomAttribute(key, val, true) でセットした値が格納されます。画面遷移後にここを確認し、値が残っていれば永続化は成功しています。
inactiveAt: アイドルタイムアウト時刻(最終操作 + 30分)です。
expiresAt: セッション最大有効期限(開始 + 4時間)です。
このように、データの実体を見ることで、New Relic Agent が「属性」と「有効期限」をセットで管理している様子がはっきりと分かります。
使い分け戦略
便利な persist 機能ですが、実務では「すべてのデータを永続化すれば良い」わけではありません。 データの 「寿命(スコープ)」 に合わせて、MPAとSPAそれぞれで適切な実装方法を選択する必要があります。
特に 「特定のページだけで保持したい情報」 の扱いにおいて、両者の実装方法は大きく異なります。
ケース1:継続的な状態(User Context)の場合
会員ランク、ユーザーID、ログイン状態など、セッションを通じて変わらない情報については、アーキテクチャに関わらず 「永続化(persist: true)」 一択です。
-
MPA: 画面遷移(リロード)での消失を防ぐため
-
SPA: 誤操作によるリロード(F5)での消失を防ぐため
ここはシンプルに「セッション中ずっと維持したいものは true」と考えればOKです。
// MPA / SPA 共通:重要なユーザー情報は永続化する
newrelic.setCustomAttribute('userPlan', 'Premium', true);
ケース2:特定のページだけの情報(Page Context)の場合
記事のカテゴリー、著者名、その画面の商品IDなど 「ページを移動したら消えてほしい情報」 の扱いは、MPAとSPAで実装方法が分かれます。
MPAの場合:オプション無効(persist: false)を利用する
MPAは画面遷移のたびにメモリがリセットされる仕組みです。これを利用しない手はありません。
-
推奨実装:
newrelic.setCustomAttribute('category', 'tech');(第3引数なし) -
理由: 次のページに遷移すればブラウザが勝手にデータを消してくれます。「消し忘れ(データ汚染)」のリスクがないため、最も安全かつ簡単な方法です
SPAの場合:PageAction を利用する
ここが最大のポイントです。SPAでMPAと同じように setCustomAttribute を使ってしまうと、画面遷移(ルート変更)しても値が残り続けます。 これを防ぐために「画面遷移時に null をセットして消す」という実装も可能ですが、ルーターのイベント監視やコンポーネントの破棄処理(cleanup)ですべての属性を管理するのは実装難易度が高く、バグ(データ汚染)の温床になります。
そのため、SPAにおけるページ固有情報は、「状態(Attribute)」として持たせず、「イベント(PageAction)」として記録するのが実装難易度が低いです。
-
推奨実装:
newrelic.addPageAction('viewContent', { category: 'tech' }); -
理由:
- PageActionはその瞬間のイベントとして記録されるため、「次の画面に値が残る」という概念自体がありません
- 面倒なライフサイクル管理から解放され、実装コストを大幅に下げられます
注意点:LocalStorage だからこその挙動
persist: true は非常に便利ですが、裏側で LocalStorage を使っているがゆえの挙動も理解しておく必要があります。
1. 複数タブでの共有
LocalStorage は「オリジン(ドメイン)」単位で共有されます。 ユーザーがブラウザのタブを2つ開いている場合、タブAでセットした属性は、タブBにも即座に(あるいは次の再読み込み時に)反映されます。
-
メリット: 「カートに商品を入れた」などのステータスがタブ間で同期される
-
デメリット: タブごとに異なるコンテキストを持ちたい場合(例:タブAで商品A、タブBで商品Bを見ている時の商品IDなど)に persist: true を使うと、後から操作した方で上書きされてしまいます
こうした「タブ(画面)固有の情報」についても、やはり前述の「MPAなら persist: false」「SPAなら PageAction」という使い分けが有効です。
2. プライバシーとセキュリティ
persist: true で保存されたデータは、ブラウザの LocalStorage に保存されます。 New Relic への送信データ同様、クレジットカード番号、パスワード、個人特定性の高い機微情報は絶対にセットしない ようにしてください。誰でも DevTools から見ることができてしまいます。
まとめ
最後に、今回解説した persist オプションと PageAction の使い分けをマトリクスで整理します。
「このデータはいつまで残ってほしいのか?」というデータの寿命を軸に選定するのが正解への近道です。
| データの種類 | 具体例 | MPA (SSR/PHP/Rails等) | SPA (React/Vue等) |
|---|---|---|---|
| ユーザー属性(セッション中維持) | 会員ランク/ログインID/ABテスト群 | setCustomAttribute (persist: true) | setCustomAttribute (persist: true) |
| ページ属性(移動したら消える) | カテゴリ名/記事ID/商品ID | setCustomAttribute (persist: false) | addPageAction(イベントとして送信) |
New Relic Browser の setCustomAttribute は、第3引数 persist を使いこなすことで、自前で Cookie や Storage 管理コードを書くことなく、堅牢なセッション分析基盤を作ることができます。
- セッションを通して追いたいなら
true - そのページだけでいいなら
false(SPAなら PageAction)
このルールさえ覚えておけば、データ分析の精度は格段に上がり、実装工数は下がります。
New Relicでは、新しい機能やその活用方法について、QiitaやXで発信しています!
無料でアカウント作成も可能なのでぜひお試しください!
New Relic株式会社のX(旧Twitter) や Qiita Organizationでは、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
無料のアカウントで試してみよう!
New Relic フリープランで始めるオブザーバビリティ!


