ようこそ、オブザーバビリティの世界へ。
「本番環境でエラーが出たけれど、再現方法が全くわからない」
「ユーザーから『動きが重い』と言われたが、どの操作が原因か特定できない」
開発者なら一度は夜も眠れないほど悩まされる、この「再現不能な闇」に光を当てるのが、今回紹介するRollbar(ロールバー)です。
単なる「エラー通知ツール」だと思ったら大間違いですよ。Rollbarの真骨頂は、エラーが発生するまでの「足跡」を完全に記録するTelemetry(テレメトリ)機能にあります。これを使いこなせば、ユーザーがエラーに遭遇する直前にどのボタンを押し、どのAPIが遅延していたのか、まるで背後で操作を見ていたかのように手に取るようにわかるようになります。
今日は、フロントエンド開発の救世主となる「Rollbar Telemetry」のセットアップから、パフォーマンス改善に繋げる高度な活用術まで、優しく、かつ深く伝授しましょう。
—
1. なぜ「スタックトレース」だけでは足りないのか?
普通のエラートラッキングは、「どこで(ファイル名と行数)」エラーが起きたかを教えてくれます。しかし、現場で本当に必要なのは「なぜ(どんな経緯で)」その状態に陥ったかという文脈(コンテキスト)です。
特にフロントエンドでは、以下の3つの要素が複雑に絡み合います。
1. ユーザーの操作(DOMイベント):ボタンの連打や想定外の遷移。
2. ネットワークの状態(Fetch/XHR):APIのレスポンスが極端に遅い、または不安定。
3. ブラウザの負荷(パフォーマンス):メインスレッドの占有によるフリーズ。
これらをバラバラに監視するのではなく、Rollbar上で一本のタイムラインとして繋ぎ合わせる。それが「真のオブザーバビリティ」への第一歩です。
—
2. Rollbarを導入し、タイムラインを起動する
まずは、あなたのプロジェクトにRollbarを迎え入れましょう。今回はモダンなJavaScript環境(ReactやVue、Vanilla JSなど)を想定します。
インストール
npm install rollbar
基本セットアップ(ここが肝心です)
ただ導入するだけでなく、Telemetryを有効化する設定を最初から組み込みます。これが「魔法のタイムライン」を有効にする鍵です。
import Rollbar from ‘rollbar’;
const rollbar = new Rollbar({
accessToken: ‘YOUR_POST_CLIENT_ITEM_ACCESS_TOKEN’,
captureUncaught: true,
captureUnhandledRejections: true,
payload: {
environment: ‘production’,
client: {
javascript: {
// Source Mapsの設定をしておくと、圧縮後のコードも読めるようになります
source_map_enabled: true,
code_context: true,
// ここからがTelemetryの核心設定
guess_uncaught_frames: true
}
}
},
// Telemetryの自動収集設定
autoInstrument: {
network: true, // FetchやXHRのリクエスト・レスポンスを記録
log: true, // console.logなどの内容を記録
dom: true, // クリックなどのDOMイベントを記録
navigation: true, // URLの変更を記録
connectivity: true // オフライン・オンラインの切り替わりを記録
}
});
この `autoInstrument` を全て `true` にするだけで、Rollbarは「ユーザーがエラーに至るまでの物語」を自動的に書き始めます。
—
3. パフォーマンスとエラーを相関させる「Custom Telemetry」
ここからがプロの領域です。標準のTelemetryだけでも強力ですが、「動作が重い(パフォーマンス不足)」と「エラー」の因果関係を突き止めるために、カスタムテレメトリを仕込みましょう。
例えば、ユーザーが「もっさり」と感じるような重い処理や、APIの待機時間が閾値を超えた場合に、それをログとしてRollbarのタイムラインに刻みます。
実装例:遅延リクエストの可視化
async function fetchData(url) {
const startTime = performance.now();
try {
const response = await fetch(url);
const duration = performance.now() – startTime;
// 1秒以上かかったリクエストを「注意」としてタイムラインに刻む
if (duration > 1000) {
rollbar.captureEvent({
type: ‘network’,
metadata: {
method: ‘GET’,
url: url,
status: response.status,
duration_ms: duration,
message: ‘Slow API response detected’
},
level: ‘warning’
});
}
return await response.json();
} catch (error) {
// エラー発生時、直前の「Slow API」の記録がタイムラインに並ぶ
rollbar.error(“API Fetch Failed”, error);
throw error;
}
}
このように `captureEvent` を使うことで、エラーが発生した瞬間の直前に「何が起きていたか」の精度を劇的に高めることができます。
—
4. 精度高い「Hello World」で動作を確認する
設定ができたら、意図的にエラーを発生させてRollbarの管理画面(Dashboard)を見てみましょう。
// 1. テレメトリに残る操作をいくつか行う
console.log(“ユーザーが設定画面を開きました”);
// (ここで適当なボタンをクリックするなどの操作をシミュレート)
// 2. ネットワーク遅延をシミュレート(前述のカスタムテレメトリが動く)
// 3. 未定義の関数を呼び出してエラーを発生させる
function triggerError() {
const user = {};
console.log(user.profile.name); // TypeError: Cannot read property ‘name’ of undefined
}
triggerError();
Rollbarの管理画面で対象のアイテムを開き、「Telemetry」タブをクリックしてください。
そこには、エラーが起きる直前の `console.log`、クリックしたDOM要素、そしてあなたが仕込んだ「Slow API」の警告が、時系列順に美しく並んでいるはずです。
—
5. 現場で震えるほど役立つ「分析の極意」
このタイムラインを眺めるとき、私はいつも以下の3点に注目します。
1. 「クリック連打」の痕跡はないか?
Telemetryに `input` や `click` イベントが短時間に集中していれば、ユーザーが焦って操作した証拠。UIのフィードバック不足がエラーを誘発している可能性があります。
2. APIのレスポンス順序は正しいか?
複数のFetchが走っている場合、後に投げたリクエストが先に返ってくる「レースコンディション」がエラーの原因になっていることがTelemetryから一目でわかります。
3. エラー直前のメモリやリソースの状態は?
Custom Telemetryで定期的に `performance.memory` などを記録しておけば、メモリリークが原因でブラウザが不安定になり、結果としてJSエラーが発生したという「真犯人」を特定できます。
最後に
Rollbarを単なる「エラー通知」として使うのは、宝の持ち腐れです。Telemetryを活用し、エラーの背後にある「ユーザーの体験」を可視化することで、あなたのデバッグ時間は劇的に短縮され、サービスの品質は異次元のレベルへと引き上げられます。
「エラーは、システムの弱点を教えてくれるギフトである」
そう思えるようになった時、あなたは真のオブザーバビリティ・エンジニアへの階段を一つ登ったことになります。ぜひ、今日からこの強力な武器を使いこなしてください。応援していますよ。