バックエンド相関

Instana バックエンドの相関分析を活用し、ウェブサイトの訪問といったユーザーの行動と、バックエンドやサーバーサイドで生成された成果物との関連性を明らかにします。 バックエンド相関を使用すると、以下の詳細を表示できます。

  • Web サイト・アクティビティーによって実行されるバックエンド作業。
  • バックエンド作業の原因となったアクティビティーがトレース・ビューに表示されます。
  • トレース・ビューでトレースによって収集されなかったバックエンド作業で使用される補助パラメーター。

リンクは、 バックエンド・トレース ID が Web ブラウザーに公開されることによって確立されます。 JavaScript エージェントは、バックエンドのトレースIDを取得し、それらを Instana のサーバーに送信されるビーコンに含めます。

バックエンド相関は、以下の 3 つのタイプのビーコンと 3 つのタイプのイベントでサポートされます。

  1. ページ・ロード
  2. リソースまたは資産の検索。
  3. HTTP および fetchXMLHttpRequest APIを介したリクエスト。

バックエンド相関は自動的に行われます。 ただし、以下の理由により、自動バックエンド相関が不可能な場合があります。

  • デフォルトの Web セキュリティー設定 (例えば、応答ヘッダー内の Timing-Allow-Origin )。
  • 一部のブラウザでは、 HTTP 接続は安全ではありません。
  • ブラウザーは必要な API をサポートしていません。

自動バックエンド相関プロセスは、ほとんどの環境およびブラウザーで機能するように構成できます。構成については、以下のセクションを参照してください。 ビーコン・タイプごとに動作が異なるバックエンド相関のため、この資料の情報は、ビーコン・タイプごとにアプローチが説明されるように構造化されています。

重要な注意点

Instana のウェブサイト監視機能を利用するには、このドキュメントの手順に従う必要はありません。 このステップでは、古い Web ブラウザーのバックエンド相関をサポートしたり、起点間のバックエンド相関をサポートしたりするために、バックエンド相関を改善または使用可能にする方法について説明します。 ほとんどのバックエンド相関は自動的に行われます。 バックエンド相関範囲を拡張するには、以下のステップを参照してください。 これらのステップはオプションです。 欠落しているバックエンド相関を識別するときに、それらの順序に従うことができます。

バックエンドが確実にトレースされるようにする

Instana バックエンドのアクティビティを追跡することで、バックエンドとウェブサイトのアクティビティとの関連性を特定することができます。 相関関係の前提条件として、トレースとも呼ばれるバックエンドデータの収集を有効にする必要がある。 トレース機能を有効にするには、 『 Instana 』の「トレース」の項目を参照してください。

Instana このWebサイト監視スクリプトは、以下の種類のバックエンド相関技術をサポートしています:

Instana トレースとのバックエンド相関

Instana のトレースが正常に有効化されると、トレース対象のプロセスは ` Server-TimingHTTP ` レスポンスヘッダーを返します。 Webブラウザの開発者ツールを使って、これらのレスポンスヘッダーを確認できます。 次の画像は、 Google Chrome の開発者ツールに表示される「 server-timingHTTP 」レスポンスヘッダーを示しています:

図 1. Server-Timing レスポンスヘッダー
Server-Timing レスポンスヘッダーを含む HTTP レスポンス

この時点で、Instana の自動メカニズムは機能を開始できます。 これまでプロセスのトレースを行っていなかった場合は、 Instana を使ってその使い心地を確認してみてください。 これは、特に古い Web ブラウザーで、完全で信頼性の高いバックエンド相関を引き続きアンロックするかどうかを決定するのに役立ちます。

W3C のトレースコンテキストとのバックエンド相関

バックエンドサーバーで W3C トレースコンテキストが有効になっている場合、トレース対象のプロセスは、HTMLページにメタデータとしてコンテンツを traceparent 埋め込むことがあります( 仕様を参照)。 HTMLページに組み込まれた Instana のWebサイト監視スクリプトは、 traceparent を解析し、を parent-id として抽出します backendTraceId。 これは、ビーコンの相関分析を行うために、 backendTraceIdpageLoad ビーコンと共に Instana バックエンドに送信されます。

API が呼び出されると、 XMLHttpRequestInstanafetch の Web サイト監視スクリプトは、 W3C トレースコンテキスト仕様に準拠した および tracestate メタデータを traceparent 生成し、それらをリクエストの HTTP ヘッダーとして追加します。 はとして tracestate 使用され、ビーコンの相関分析 backendTraceId のためにxhrビーコンとともに Instana バックエンドに送信されます。

OpenTelemetry と互換性のあるバックエンドサーバーは、 W3C トレースコンテキストをサポートしています。

「起源」という概念を理解する

バックエンド相関プロセスについてさらに詳しく知りたい場合は、オリジンの概念を十分に理解している必要があります。 ここでは、次の手順を理解するために、起源 Instanaよくある質問(FAQ) について知っておくべきことを説明します:

HTTP リクエスト( XMLHttpRequest またはfetch)の相関関係を改善する

図 2. HTTP バックエンド相関を伴うリクエスト
バックエンド相関機能付き HTTP リクエスト

fetchXMLHttpRequestAPI の使用に関する相関関係は、すべての同一オリジン呼び出しにおいて確実に機能します。 同源ポリシー およびクロスオリジン制限のため、 HTTP への自動呼び出しによるバックエンドの相関付けは行えません。

複数のオリジンが関与する場合にバックエンドの相関関係を有効にするには、 クロスオリジン・リソース・シェアリング( CORS ) が使用されます。 CORS これは、同一生成元ポリシーのセキュリティメカニズムに対して、制御された例外を設定する仕組みです。 同一オリジンのポリシーによる制約事項に対処するには、必要なものを説明する以下のスクリーン・ショットを参照してください。

図 3. クロスオリジン対応の XMLHttpRequest またはfetchバックエンドの相関関係
クロス・オリジン対応 XMLHttpRequest またはフェッチ・バックエンド相関を説明する図。

ページ・ロードの相関を改善する

図 4. バックエンドとの相関分析を伴うページ読み込み
バックエンド相関を持つページ・ロード

バックエンド・トレースおよび Web サイト・ページ・ロード (つまり、初期 HTML ファイルの取得) は、 Server-Timingをサポートする Web ブラウザーに対して自動的にバックエンド相関されます。 最初のページ・ロードのトレース ID を JavaScript エージェントに手動で公開することにより、すべての Web ブラウザーでバックエンド相関を有効にできます。 バックエンド相関を有効にするには、以下のステップを実行する必要があります。

  1. バックエンド側のトレース ID を取得します
  2. トレースIDを Instana の JavaScript スニペットに変換する

バックエンド・サイドでトレース ID を取得する

以下の各セクションでは、 Instana がサポートするさまざまな言語のトレースIDを取得する方法について説明します。 これらのメソッドは、バックエンドプロセスがトレース対象であり、かつ HTTP リクエストによってトレースが存在するか、または作成された場合にのみ機能します。

Java でのトレース ID の取得

Java では、バックエンド・トレース ID は、着信 HTTP 要求の要求属性として使用できます。 バックエンド・トレースが存在するか作成されると、エージェントは自動的に X-INSTANA-T 属性を追加します。 JavaScript 部分でこの値を取得するには、次のコマンドを使用します:

// via plain Java Servlet request object (standard API)
// http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html
servletRequest.getAttribute("X-INSTANA-T")

PHP でのバックエンドトレース ID の取得

PHP では、受信した ` HTTP ` リクエストを処理する際、バックエンドのトレース ID が ` $_SERVER array` の値として利用可能です。 バックエンド・トレースが作成されるか存在する場合、エージェントは自動的に X-INSTANA-T 値をその配列に追加します。 この値を取得するには、以下のコマンドを使用します。

// via the  $_SERVER superglobal array (standard API)
// http://php.net/manual/en/reserved.variables.server.php
$_SERVER["X-INSTANA-T"]

Node.js でのバックエンドトレース ID の取得

Node.js および Node.js コレクターをインストールすると、バックエンドのトレースIDが、受信する HTTP リクエストのリクエストヘッダーとして利用可能になります。 バックエンドトレースが存在するか、または作成されると、 Node.js コレクターは自動的にヘッダーを追加します X-INSTANA-T 。 この値を取得するには、以下のコマンドを使用します。

// via plain Node.js HTTP request objects (standard API)
// https://nodejs.org/api/http.html#http_class_http_incomingmessage
req.headers['x-instana-t']

// via express.js request objects
// https://expressjs.com/en/4x/api.html#req.get
req.get('x-instana-t')

.NET でのバックエンドトレース ID の取得

.NET のWebアプリケーションにおいて、バックエンドのトレースIDを取得する手順は、他の言語の場合と同様です。 使用しているフレームワークに応じて、異なる式を使用してバックエンド・トレース ID を抽出する必要があります。 トレーサーは、要求時または応答時にトレース ID をアプリケーションのコンテキストに追加します。これは、次のように抽出できます。

// For ASP.NET WebForms
HttpContext.Current.Items["X-INSTANA-T"]

// For ASP.NET MVC Applications
Context.ApplicationInstance.Context.Items["X-INSTANA-T"]

Ruby でのトレース ID の取得

Ruby 言語エージェントは、現行のトレース・コンテキストを ::Instana.tracer.context で保持します。

注: 現在実行中のトレースがない場合、この値は nil となる可能性があります。
::Instana.tracer.context &&
  ::Instana::Util.id_to_header(::Instana.tracer.context.trace_id)

Python でのトレース ID の取得

Python アプリケーションの場合、現在のトレース ID の場所は、同期フレームワークを使用しているか非同期フレームワークを使用しているかによって異なります。

# Synchronous (Django, Flask etc..)
from instana.singletons import tracer

from instana.singletons import async_tracer as tracer

tracer.active_span and tracer.active_span.context.trace_id

Go でのトレース ID の取得

Go アプリケーションでは、トレース ID は現行のスパンで使用できます。

import instana "github.com/instana/go-sensor"

span := opentracing.StartSpan("MySpanName)
spanContext := span.Context().(instana.SpanContext)
traceId := instana.FormatID(spanContext.TraceID)

Instana の JavaScript スニペットにトレース ID を追加する

サーバー側でトレースIDを取得した後、 Instana の JavaScript スニペットに、 ineum('traceId', *TraceID*);API への呼び出しを1つ追加する必要があります。 これはサーバー側で処理する必要があり、通常は Java のJSPや Node.js のExpressといったテンプレートエンジンを使用して行われます。 次の例は、 Instana の JavaScript スニペットを拡張し、 Mustacheテンプレートエンジンを使用して API を1回呼び出す方法を示しています。 その他のテンプレート・エンジンは、異なる構文を持つことができます。

<script>
  (function(i,s,o,g,r,a,m){i['InstanaEumObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://eum.instana.io/eum.min.js','ineum');

  // API calls as generated by the Instana user interface

  ineum('traceId', '*TraceID*');
</script>

リソースまたはアセットの検索結果の関連性を向上させる

図 5. アセット取得のバックエンド相関
バックエンド相関を使用したリソースまたは資産の取得

画像、JavaScript,、CSS ファイルなどのリソースやアセットのバックエンド相関は、自動的に行われます:

複数のオリジンが関与する場合にバックエンド相関をアンロックするには、Timing-Allow-Origin 応答ヘッダーを使用します。 このヘッダーは、 JavaScript および Instana JavaScript エージェントに対してデータを公開する timing allow check よう指示します。

HTML 文書のオリジンとは異なるオリジンから取得されたリソースのバックエンド相関機能をアンロックするには、以下のスクリーン・ショットを参照してください。

図6. クロスオリジン対応のリソースまたはアセット取得バックエンドの相関関係
クロス・オリジン対応リソースまたはアセット取得バックエンド相関を説明する図。

OpenTelemetry-compatible バックエンドの相関関係を改善する

バックエンドサーバーが OpenTelemetry に対応している場合、 Instana の JavaScript スニペットに ineum('enableW3CHeaders', true);API への呼び出しを追加することができます。 サーバーがHTMLページにメタ traceparent データを埋め込む場合、 Instana JavaScript エージェントはそのコンテンツを解析し parent-id 、それを pageLoad ビーコンの backendTraceId として使用できます。

または XMLHttpRequest を使用するか、 fetch 電話をかけることで、 traceparent および tracestate が生成され、元の HTTP ヘッダーに追加されます。 tracestate InstanabackendTraceId のバックエンドに送信されるXHRビーコンのヘッダーとして使用されます。