バックエンド相関

Instanaは、バックエンドの相関関係を利用して、ウェブサイトの訪問などのユーザーアクティビティと、バックエンドまたはサーバーサイドで作成された作業との間のリンクを作成します。 バックエンドの相関関係では、以下の詳細を見ることができる:

  • ウェブサイトの活動によって実行されるバックエンドの仕事。
  • トレースビューでバックエンドの作業を引き起こしたアクティビティ。
  • トレースビューでトレースによって捕捉されなかった、バックエンド作業で使用される補助パラメータ。

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

バックエンドの相関関係は、3種類のビーコンと3種類のイベントに対応している:

  1. ページ・ロード
  2. リソースまたは資産の検索。
  3. HTTP リクエストは、 XMLHttpRequest および fetch APIを通じて行われる。

バックエンドの相関は自動的に行われる。 しかし、以下のような理由で、バックエンドの自動相関ができないことがある:

自動バックエンド相関プロセスは、ほとんどの環境とブラウザで動作するように設定できます。 バックエンド相関はビーコンの種類によって動作が異なるため、このドキュメントの情報はビーコンの種類ごとに説明される構造になっている。

重要な注意点

Instana のウェブサイトモニタリングを使用するために、このドキュメントの手順に従う必要はありません。 この手順では、古いウェブブラウザのバックエンド相関をサポートしたり、オリジン間のバックエンド相関をサポートするなど、バックエンド相関を改善または有効にする方法について説明します。 バックエンドの相関関係のほとんどは自動的に行われる。 バックエンドの相関カバレッジを拡張するには、以下の手順を参照してください。 これらのステップはオプションです。 不足しているバックエンドの相関関係を特定したら、順番に追っていくことができる。

バックエンドのトレースを確認する

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

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

Instanaトレースによるバックエンド相関

Instana トレースが正常に有効になると、トレースされたプロセスは Server-Timing HTTP レスポンスヘッダーで応答します。 これらのレスポンス・ヘッダは、ウェブ・ブラウザの開発ツールで調べることができる。 次の画像は、 Google Chrome 's development toolsの server-timing HTTP レスポンスヘッダーを示している:

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

この時点で、Instana の自動メカニズムは機能を開始できます。 以前はプロセスをトレースしていなかったのであれば、Instanaでの経験をチェックしてみてください。 これは、特に古いウェブブラウザにおいて、完全で信頼できるバックエンドの相関関係のロックを解除し続けたいかどうかを判断するのに役立ちます。

W3C トレースコンテキストによるバックエンド相関

バックエンドサーバーで W3C トレースコンテキストが有効になっている場合、トレースされたプロセスは、 traceparent コンテンツをメタデータとして HTML ページに埋め込むかもしれない( 仕様を参照)。 HTMLページに統合されたInstanaウェブサイト・モニタリング・スクリプトは、 traceparent を解析し、 parent-idbackendTraceId として抽出する。 この backendTraceId は、ビーコン相関のため、 pageLoad ビーコンとともにInstanaバックエンドに送信される。

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

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

起源の概念を理解する

バックエンドの相関プロセスについてさらに学び続けたいのであれば、起源の概念についてよく理解しておく必要がある。 Instanaの FAQの記事では、以下の手順を理解するために起源について知っておく必要があることを説明しています:

HTTP リクエスト( XMLHttpRequest または fetch)の相関性を向上させる

図 2. HTTP バックエンド相関リクエスト
HTTP リクエストとバックエンドの相関関係

XMLHttpRequestfetch のAPI使用の相関は、すべての同じオリジンのコールに対して確実に機能する。 同一オリジン・ポリシーと クロスオリジンのため、 HTTP コールのバックエンドの自動相関は不可能です。

複数のオリジンが関与している場合にバックエンドの相関を解除するために、 CORS(クロスオリジンリソースシェアリング )が使用される。 CORSは、同一オリジン・ポリシーのセキュリティ・メカニズムに対する制御された例外を確立するメカニズムである。 同一オリジン・ポリシーによる制限に対処するために、何が必要かを説明した以下のスクリーンショットをご覧ください。

図 3. クロスオリジン対応 XMLHttpRequest またはバックエンド相関をフェッチ
クロスオリジン可能な XMLHttpRequest またはフェッチバックエンド相関を説明する画像。

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

図 4. バックエンド相関によるページロード
バックエンドとの相関性を持つページのロード

Server-Timingを サポートするウェブブラウザでは、バックエンドのトレースとウェブサイトのページロード、つまり最初のHTMLファイルの取得は、自動的にバックエンドに関連付けられます。 最初のページ・ロードのトレース 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 配列の値として使用します。 バックエンドトレースが作成されるか、存在する場合、エージェントは自動的に X-INSTANA-T の値をその配列に追加します。 この値を取得するには、以下のコマンドを使用する:

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

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

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ウェブアプリケーションの場合、バックエンドのトレース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)

でトレースIDを取得する。 Python

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 への呼び出しで拡張する必要があります。 これはサーバーサイドで行われる必要があり、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 への呼び出しで拡張できます。 サーバーが traceparent メタデータをHTMLページに埋め込むと、Instana JavaScript エージェントは parent-id のコンテンツを解析し、 pageLoad ビーコンの backendTraceId として使用できる。

XMLHttpRequest または fetch の呼び出しで、 traceparenttracestate が生成され、元の HTTP ヘッダーに追加される。 tracestate は、Instana バックエンドに送信される xhr ビーコンの backendTraceId として使用されます。