0Pricing
React Academy · レッスン

フロントエンドとバックエンドのトレースを関連付ける

fetchリクエストを通じてトレースコンテキストを伝播し、バックエンドのスパンを、きっかけとなったUI操作と同じトレースに表示します。

「フロントエンドとバックエンドのトレースを関連付ける」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

分散トレースの目標

フロントエンドのオブザーバビリティにおける最終的な目標は、React でのユーザーのクリックからネットワーク、API ハンドラー、サービス呼び出しを経て、遅いレスポンスの原因となったデータベースクエリまでを 1 つにつなぐトレースです。このエンドツーエンドのトレースにより、根本原因を即座に分析できます。

W3C TraceContext 標準

W3C TraceContext 仕様では、traceparent ヘッダーの形式を version-traceId-parentSpanId-flags と定義しています。値の例は次のとおりです:00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01。trace ID は分散トレース全体で共有され、parent span ID はホップごとに変わります。

ヘッダーの自動注入

OTel の fetch インストルメンテーションは、送信されるすべての fetch リクエストに traceparent ヘッダーを自動的に注入します。このヘッダーには現在の trace ID と、親として機能するフロントエンドの fetch span の span ID が含まれているため、バックエンドはフロントエンドの span に関連付けられた子 span を作成できます。

バックエンドでのトレース継続

サーバー上では、Node.js/Express 用の OTel HTTP インストルメンテーションが受信した traceparent ヘッダーを読み取り、フロントエンドの fetch span の子 span を作成します。trace ID は保持されるため、Jaeger や Grafana Tempo では、ブラウザー span → Express span → データベース span という一連のチェーン全体を、1 つのウォーターフォール表示で確認できます。

Jaeger または Grafana Tempo でトレースを表示する

フロントエンドとバックエンドの両方をインストルメンテーションしたら、Jaeger または Grafana Tempo を開き、trace ID で検索します。最上部に React コンポーネントの span、その下に fetch span、続いて Express のルートハンドラー span、さらにデータベースクエリ span が表示され、すべての実行時間と属性を確認できます。

ユーザーによる関連付け

span.setAttribute('user.id', userId) を使用して、React アプリのすべての span に user.id を属性として設定します。バックエンドでも同じことを行います。これで、オブザーバビリティバックエンドを特定のユーザー ID でフィルタリングし、そのユーザーに関するすべてのトレースを表示できるため、特定の顧客が報告した問題を診断できます。

セッションによる関連付け

ページの読み込み時に一意のセッション ID を生成し、すべてのフロントエンド span に session.id として設定します。リクエストヘッダーにも含めることで、バックエンドでもバックエンド span に設定できます。セッションの関連付けにより、1 回のセッションでユーザーが行った操作の完全な順序を再構成できます。

RUM セッションとトレースの関連付け

Datadog のような商用ツールは、RUM セッションと APM トレースを標準で統合します。Datadog RUM SDK は特定のヘッダー(X-Datadog-Trace-Id)を fetch リクエストに注入し、バックエンドの Datadog APM SDK がそれを読み取って、RUM セッションのリプレイを分散トレースに関連付けます。これにより、セッションのリプレイとトレースを同時に確認できます。

関連付けによる効果

あるユーザーからチェックアウトが遅いという苦情が寄せられたとします。関連付けられたトレースがあれば、オブザーバビリティバックエンドで user.id を検索してチェックアウトのトレースを見つけ、すぐに、2 つの大きなテーブルを結合する 900 ミリ秒のデータベースクエリが遅延の原因だったと確認できます。これはフロントエンドのメトリクスだけでは見えません。

プロキシとしての OpenTelemetry Collector

ブラウザーは、CORS の制限や認証情報の漏えいのため、Jaeger などのバックエンドにトレースを直接送信できません。代わりに、OTel Collector をプロキシとして実行します。OTLPTraceExporter の送信先を Collector のエンドポイントに設定し、Collector から Jaeger、Grafana Tempo、その他のバックエンドへ分配します。

プライバシーに関する考慮事項

フロントエンドのトレースには、意図せず機密データが含まれることがあります。たとえば、URL 内のフォームフィールドの値、span 属性内の PII、ヘッダー内のセッショントークンなどです。span 属性に機密データが含まれていないことを確認するため、インストルメンテーションを見直してください。span.setAttribute は必要最小限に使用し、記録する前に URL のクエリパラメーターをサニタイズします。

traceparent ヘッダーの形式

W3C TraceContext の traceparent ヘッダーはどのような形式ですか。

レッスンのまとめ

フロントエンドとバックエンドのトレースを関連付けると、ユーザーのリクエスト全体をエンドツーエンドで可視化できます。W3C TraceContext の traceparent ヘッダーは、OTel のインストルメンテーションによってブラウザーの fetch span とバックエンドの span を自動的に接続します。対象を絞ったデバッグのために、すべての span に user.id と session.id を付加してください。CORS の問題と認証情報の漏えいを避けるため、ブラウザーとバックエンドの間のプロキシとして OTel Collector を使用します。

よくある質問

「フロントエンドとバックエンドのトレースを関連付ける」レッスンは無料ですか?

はい。「フロントエンドとバックエンドのトレースを関連付ける」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「フロントエンドとバックエンドのトレースを関連付ける」で何を学びますか?

fetchリクエストを通じてトレースコンテキストを伝播し、バックエンドのスパンを、きっかけとなったUI操作と同じトレースに表示します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「フロントエンドとバックエンドのトレースを関連付ける」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. フロントエンドのオブザーバビリティ:概要と重要性
  2. ブラウザーからOpenTelemetryトレースを取得する
  3. リアルユーザーモニタリングとWeb Vitals
  4. フロントエンドとバックエンドのトレースを関連付ける
← React Academyに戻る