• /
  • ログイン

New Relicディストリビューティッド (分散) トレーシングの仕組み

New Relicのディストリビューティッド(分散)トレーシングのしくみについての技術的な詳細は、次のとおりです。

ヒント

ディストリビューティッド(分散)トレーシングの設定の概要については、概要: ディストリビューティッド(分散)トレーシングを有効にするを参照してください。

トレースのサンプリング

トレースのサンプリング方法は、ユーザーのセットアップ、および使用するNew Relicトレーシングツールによって異なります。たとえば、サードパーティのテレメトリサービス(OpenTelemetryなど)を使って、データが当社に届く前にトレースのサンプリングが実行されている可能性があります。または、Infinite Tracingを使用している場合、すべてのトレースデータが当社に送信され、当社のサンプリングが使用されていると思われます。

いくつかのサンプリング戦略が利用可能です。

ヘッドベースのサンプリング(標準のディストリビューティッド(分散)トレーシング)

Infinite Tracing機能を除き、当社のトレーシングツールのほとんどは、ヘッドベースのサンプリングアプローチを使用します。このアプローチでは、トレース内のすべてのスパンが到着する前に、個々のスパンにフィルターを適用します。つまり、スパンを受け入れるかどうかの決定は、フィルタリングプロセスの最初(「ヘッド」)に行われます。当社ではこのサンプリング戦略を使用して、ストレージとパフォーマンスの問題を避けながら、アクティビティの代表的なサンプルを取得します。

標準のディストリビューティッド(分散)トレーシングツールでのヘッドベースのサンプリングの実行方法の詳細を、以下に示します。

テールベースのサンプリング(Infinite Tracing)

当社のInfinite Tracing機能は、テールベースのサンプリングアプローチを使用します。「テールベースのサンプリング」では、トレース保持の決定は、トレースのすべてのスパン到着後の処理の最終時点で行われます。

Infinite Tracingでは、お使いのアプリケーションまたはサードパーティのテレメトリサービスからトレースデータを100%当社に送信でき、Infinite Tracingが最も重要なトレースデータを解明します。また、重要なトレースが保持されるようにサンプリングを設定することができます。

サンプリングなし

当社の一部のツールはサンプリングを使用しません。これらのツールのサンプリング詳細を、以下に示します。

トレースデータの構成方法

ディストリビューティッド(分散)トレースの構造を理解すると以下のようなことに役立ちます。

ディストリビューティッド(分散)トレーシングには木のような構造があり、一つの「親」スパンを参照する「子」スパンがあります。この図ではトレースの重要なスパン関係を示しています。

New Relicディストリビューティッド(分散)トレーシング構造図

この図では、ディストリビューティッド(分散)トレーシングのスパンが相互にどのように関連しているかを示しています。

この図では、以下のような重要な概念を示しています。

  • トレースのルート。トレースにおける最初のサービスまたはプロセスは、ルートサービスまたはプロセスと呼ばれます。

  • プロセスの境界。プロセスはコードの論理部分の実行を表します。プロセスの例には、バックエンドサービスまたはLambda関数が含まれます。プロセス内のスパンは、以下のどれかに分類されます。

    • 開始スパン:プロセスの最初のスパン。
    • 終了スパン:a)開始スパンの親である場合、または b) http.またはdb.属性を有し、そのため外部呼び出しを表す場合は、終了スパンと見なされます。
    • インプロセススパン:インターナルメソッド呼び出しまたは関数を表し、終了または開始スパンではないスパン。
  • クライアントスパン。クライアントスパンは、別のエンティティまたは外部依存関係への呼び出しを表します。現在、以下の2つのクライアントスパンタイプがあります。

    • データストア。クライアントスパンにdb. (例:db.statement)の属性プレフィックスがある場合ば、データストアスパンに分類されます。
    • 外部。クライアントスパンにhttp. (例:http.url) の属性プレフィックスがある、または別のプロセスに子スパンがある場合は、外部スパンに分類されます。これはデータストアクエリではない外部呼び出しに対する一般的な分類です。
  • トレース持続時間。トレースの合計持続時間は、最初のスパンの開始から最後のスパンの終了までの時間の長さで決まります。

api.newrelic.com/graphiqlNerdGraph GraphiQLエクスプローラーを使用して、スパン関係データのクエリを行えます。

トレースデータの保存法

トレースデータの保存方法を理解するとご自分のトレースデータをクエリするのに役立ちます。

トレースデータは、次のように保存します。

  • スパンスパンはディストリビューティッド(分散)トレーシングの一部であるオペレーションを表します。スパンが表すオペレーションには、ブラウザ側のインタラクション、データストアクエリ、他のサービスの呼び出し、メソッドレベルのタイミング、Lambda関数が含まれます。一例として、HTTPサービスでは、スパンはHTTPリクエストの初めに作成され、HTTPサーバーがレスポンスを返した時に完了します。スパンの属性には、トレースの関係の詳細(traceId、GUIDなど)を含め、オペレーションに関する重要な情報(持続時間、ホストデータなど)が含まれています。スパン関連のデータについては、スパン属性を参照してください。
  • トランザクション:トレースのエンティティがエージェントによってモニターされる場合、そのエンティティへのリクエストが、単一トランザクションイベントを生成します。トランザクションでは他のNew Relic機能と結びついたトレースデータを利用できます。トランザクション関連データについてはトランザクション属性を参照してください。
  • コンテキスト連動メタデータ。トレースとそのスパン間の関係についての計算を表示するメタデータを保存します。このデータのクエリを行うには、NerdGraph GraphiQLエクスプローラー を使用します。

アプリケーション間でトレースコンテキストを渡す方法

当社はW3Cトレースコンテキスト標準をサポートしているため、ネットワークやサービス間のトランザクションのトレースを簡単にします。ディストリビューティッド(分散)トレーシングが有効な場合、New Relicエージェントは、サービスの外部送信リクエストにHTTPヘッダーを追加します。HTTPヘッダーは、海外旅行でのパスポートのように機能します。さまざまなネットワーク、プロセス、セキュリティシステムを移動する際にソフトウェアのトレースを識別し、重要な情報を伝達します。

The headers also contain information that helps us link the spans together later: metadata like the trace ID, span ID, the New Relic account ID, and sampling information. See the table below for more details on the header:

Item

説明

accountId

This is your New Relic account ID. However, only those on your account and New Relic Admins can associate this Id with your account information in any way.

appId

This is the application ID of the application generating the trace header. Much like accountId, this identifier is not going to provide any information unless you're a user on the account.

guid

With Distributed Tracing, each segment of work in a trace is represented by a span, and each span has a guid attribute. The guid of the last span within the process is sent with the outgoing request so that the first segment of work in the receiving service can add this guid as the parentId attribute which connects data within the trace.

Parent type

The source of the trace header, as in Mobile, Browser, Ruby app, etc. This becomes the parent.type attribute on the Transaction triggered by the request this header is attached to.

Priority

A randomly generated priority ranking value that helps determine which data is sampled when sampling limits are reached. This is a float value set by the first New Relic agent that’s part of the request so all data in the trace will have the same priority value.

Sampled

A boolean value that tells the agent if traced data should be collected for the request. This is also added as an attribute on any span and transaction data collected. If you want to read more about this sampling process, this guide goes into more detail.

Timestamp

Unix timestamp in milliseconds when the payload was created.

traceId

The unique ID (a randomly generated string) used to identify a single request as it crosses inter- and intra- process boundaries. This ID allows the linking of spans in a distributed trace. This also is added as an attribute on the span and transaction data.

transactionId

The unique identifier for the transaction event.

Trusted acount key

This is a key that helps identify any other accounts associated with your account. So if you have multiple sub-accounts that the trace crosses, we can confirm that any data included in the trace is coming from a trusted source, and tells us what users should have access to the data.

Version and data key

This identifies major/minor versions, so if an agent receives a trace header from a version with breaking changes from the one it is on, it can reject that header and report the rejection and reason.

This header information is passed along each span of a trace, unless the progress is stopped by something like middleware or agents that don't recognize the header format (see Figure 1).

プロプライエタリヘッダーで失敗したトレースの図。

図1

ヘッダー伝搬の問題に対処するため、当社は、2つの標準化されたヘッダーを必要とするW3Cトレースコンテキスト仕様をサポートしています。当社の最新のW3C New Relicエージェントは、この2つの必要なヘッダーを送受信し、デフォルトで以前のNew Relicエージェントのヘッダーも送受信します。

  • W3C(traceparent):トレース全体(トレースID)と呼び出しサービス(スパンID)を識別するプライマリヘッダー。
  • W3C(tracestate):ベンダー固有の情報を伝達し、トレースされた場所を追跡する必須ヘッダー。
  • New Relic(newrelic):以前のNew Relicエージェントとの下位互換性を維持するために引き続き送信される、元のプロプライエタリヘッダー。

3つのヘッダーを組み合わせることで、これらのタイプのエージェントでインストゥルメントされたサービス全体にトレースを伝搬できるようになります。

  • W3C New Relicエージェント
  • W3C以外のNew Relicエージェント
  • W3Cトレースコンテキスト対応エージェント

重要

リクエストがW3Cトレースコンテキスト対応エージェントにのみタッチする場合、New Relicヘッダーをオフにすることを選択できます。newrelicヘッダーをオフにする詳細については、エージェント設定ドキュメントを参照してください。

以下のシナリオには、さまざまな種類の適切なヘッダ伝搬が示されています。

その他のヘルプ

さらに支援が必要な場合は、これらのサポートと学習リソースを確認してください:

問題を作成するこのページを編集する
Copyright © 2020 New Relic Inc.