言語エージェント: ディストリビューティッド(分散)トレーシングの有効化

当社の言語エージェントで標準のディストリビューティッド(分散)トレーシングやInfiniteトレーシングを有効にするには、次のことを知っておく必要があります。

始める前に状況について理解を深めたい場合、次のトピックをチェックしてください。

ディストリビューティッド(分散)トレーシングを有効にするプロセスでは、次のステップを経ます。

  1. 前提条件を満たす
  2. (Infiniteトレーシング)トレース オブザーバーを設定する
  3. エージェントを設定する
  4. トレースを表示

ステップ1。前提条件

次のセクションをチェックし、希望するディストリビューティッド(分散)トレーシングオプションをお使いの環境で使用できることを確認します。主たるオプションは次のとおりです。

ご希望の機能のあるエージェントのバージョンが見つかったら、エージェントをインストールまたはアップデートするヘルプについてのリンクに従います。最善の結果を得るには、既存エージェントを最新バージョンに更新してください。

C SDK

必要なC SDKバージョンをインストール(コンパイル)するか、またはそのバージョンに更新します。最善の結果を得るには、最新バージョンのC SDKに更新してください。

オプション C SDKのバージョン
標準のディストリビューティッド(分散)トレーシング

1.1.0以降(W3Cトレースコンテキストはご利用いただけません)

Infinite Tracing 利用不可
Go

必要なGoエージェントバージョンをインストールするか、そのバージョンに更新します。最善の結果を得るには、Goエージェントの最新バージョンに更新してください。

オプション Goエージェントのバージョン
標準のディストリビューティッド(分散)トレーシング

2.1.0以降

W3Cトレースコンテキストを使用:3.1.0 以降

Infinite Tracing

v3.5.0(W3Cトレースコンテキストを含む)

サポートされた環境:Go 1.9以降

Java

必要なJavaエージェントバージョンをインストールするか、そのバージョンに更新します。最善の結果を得るには、Goエージェントの最新バージョンに更新してください。

種類 Javaエージェントバージョン
標準のディストリビューティッド(分散)トレーシング

4.3.0以降

W3Cトレースコンテキストを使用:5.10以降

Infinite Tracing

5.12.1以降(W3Cトレースコンテキストを含む)

サポートされた環境:

  • Java 8:アップデート252以降
  • Java 9以降のすべてのバージョン

特別な場合については、Infinite Tracing: Java 7および8でのSSLの設定をご覧ください。

.NET

必要な.NETエージェントバージョンをインストールするか、そのバージョンに更新します。最善の結果を得るには、最新の.NETエージェントバージョンに更新してください。

オプション .NETエージェントのバージョン
標準のディストリビューティッド(分散)トレーシング

8.6.45.0以降

W3Cトレースコンテキストを使用:8.27.139.0以降

Infinite Tracing

8.30.0(W3Cトレースコンテキストを含む)

サポートされた環境:

  • .NET Framework 4.5またはそれ以降
  • .NET Core 2.0以降
Node.js

必要なNode.jsエージェントバージョンをインストールするか、そのバージョンに更新します。最善の結果を得るには、最新のNode.jsエージェントバージョンに更新してください。

オプション Node.jsエージェントバージョン
標準のディストリビューティッド(分散)トレーシング

4.7.0以降

W3Cトレースコンテキストを使用:6.4以降

Infinite Tracing

6.7.0(W3Cトレースコンテキストを含む)

サポートされた環境:Nodeバージョン10.10.0以降

PHP

必要なPHPエージェントバージョンをインストールするか、そのバージョンに更新します。最善の結果を得るには、Goエージェントの最新バージョンに更新してください。

オプション PHPエージェントのバージョン。
標準のディストリビューティッド(分散)トレーシング

8.4以降

W3Cトレースコンテキストを使用:9.8以降

Infinite Tracing 9.12.0.268以降
Python

必要なPythonエージェントバージョンをインストールするか、そのバージョンに更新します。最善の結果を得るには、最新のPythonエージェントのバージョンに更新してください。

オプション Pythonエージェントのバージョン
標準のディストリビューティッド(分散)トレーシング

4.2.0.100以降

W3Cトレースコンテキストを使用:5.6以降

Infinite Tracing

5.12.0.140(W3Cトレースコンテキストを含む)

サポートされた環境:CPythonのみ(pypyはサポート対象外)

Ruby

必要なRubyエージェントバージョンをインストールするか、そのバージョンに更新します。最善の結果を得るには、Rubyエージェントの最新バージョンに更新してください。

また、Infinite Tracing 用の追加の Ruby エージェント gem をインストールします。

オプション Rubyエージェントのバージョン
標準のディストリビューティッド(分散)トレーシング

newrelic_rpm 5.3.0.346 以降

W3Cトレースコンテキストを使用:newrelic_rpm 6.9 以降

Infinite Tracing

newrelic_rpm 6.11.0.365 以降(W3Cトレースコンテキストを含む)

newrelic-infinite_tracing 6.11.0.375 以降

ステップ2。(Infiniteトレーシング)トレース オブザーバーを設定する

このセクションは、Infinity Tracingにのみ適用されます。標準のディストリビューティッド(分散)トレーシングを有効にしている場合、エージェントを設定するに進んでください。

Infinite トレーシングでは、スパンを受信するトレース オブザーバーをプロビジョニングする必要があります。トレース オブザーバーがスパンを調べ、実行可能なスパンを維持します。New Relic Edgeと呼ばれるAWSサービスのクラスターでトレース オブザーバーをプロビジョニングします。

EUプロバイダー地域のいずれかのトレース オブザーバーにデータを送信する場合でも、テールベースのサンプリングデータは米国のデータセンターに報告されるため、米国ベースのNew Relicアカウントが必要です。ご不明な点がございましたら、アカウント担当者にお問い合わせください。

Edgeアプリを使用して、トレース オブザーバーを設定します。このアプリには、いくつかのオプションの設定も含まれています。トレース オブザーバー モニタリングおよびスパン属性トレース フィルターです。これらのオプションを設定するかどうかわからない場合は、後で設定できます。

次の項目を完了します:

2a. トレース オブザーバー エンドポイントのセットアップ
  1. one.newrelic.comに移動します。
  2. メニューバーで、[アプリ]をクリックし、[Your apps(自分のアプリ)]を展開して、[New Relic Edge]をクリックします。
  3. 左上のドロップダウンでアカウントを選択します。

    複数のアカウント階層にアクセスできる場合は、トレース オブザーバーが必要な階層にいることを確認します。

  4. トレース オブザーバーがリストされていない場合は、[新しいトレースオブザーバー]をクリックして追加し、分かりやすい名前を挿入して地域を選択し、[作成]をクリックします。
  5. 使用するトレース オブザーバーについては、[エンドポイント] ドロップダウンに移動し、隣接するクリップボードアイコンをクリックして、次の値をコピーします。
    [エンドポイント] ドロップダウンの値 説明
    言語エージェントの場合 コピーして後ほどステップ3YOUR_TRACE_OBSERVER_HOSTとして使用します。エージェントを設定します。
    その他のインテグレーションの場合 (オプション)保存して後ほどYOUR_TRACE_OBSERVER_URLとして2b. テストデータをトレース オブザーバーに送信するで使用します。
  6. (オプション)トレース オブザーバー メトリックの収集を開始する場合は、トレースオブザーバー モニタリングのトグルをクリックします。詳細については、トレース オブザーバー モニタリングを参照してください。
  7. (オプション)スパン属性トレースフィルターをカスタマイズする場合は、トレースフィルターの下にある歯車アイコンをクリックして、現在のルールを確認します。詳細については、スパン属性フィルターを参照してください。
2b. (オプション)テストデータをトレースオブザーバーに送信

このテストには、同じサービスからの1つのトレースと2つのスパンのあるサンプルペイロードが含まれます。Test Service A。このサービスに従い、テストリクエストを送信します:

  1. Insert APIキーを取得または生成して、後ほどテストで使用できるようにします。
  2. 次のcurlリクエストをテキストエディタにコピーします:
    curlリクエスト
    curl -i -H "Content-Type: application/json" \
      -H "Api-Key: YOUR_INSERT_API_KEY" \
      -H 'Data-Format: newrelic' \
      -H 'Data-Format-Version: 1' \
      -X POST \
      -d '[
          {
              "common": {
              "attributes": {
                  "environment": "staging"
              }
              },
              "spans": [
              {
                  "trace.id": "123456",
                  "id": "ABC",
                  "attributes": {
                      "duration.ms": 12.53,
                      "host": "host123.test.com",
                      "name": "/home",
                      "service.name": "Test Service A"
                  }
              },
              {
                  "trace.id": "123456",
                  "id": "DEF",
                  "attributes": {
                      "duration.ms": 2.97,
                      "host": "host456.test.com",
                      "error.message": "Invalid credentials",
                      "name": "/auth",
                      "parent.id": "ABC",
                      "service.name": "Test Service B"
                  }
              }
              ]
          }
          ]' \
    'YOUR_TRACE_OBSERVER_URL'
    
  3. 自身の値をcurlリクエストに挿入します:
    説明
    YOUR_INSERT_API_KEY これをInsert APIキーに置き換えます(NerdGraph APIエクスプローラーのパーソナル APIキーとは異なります)
    YOUR_TRACE_OBSERVER_URL これを 2a トレース オブザーバー エンドポイントのセットアップでコピーした値に置き換えます。
  4. テキストエディタの内容をターミナルにコピーし、リクエストを実行します。
  5. テストで、成功を示すHTTP/1.1 202 Acceptedが返されない場合、次の項目をチェックしもう一度行ってください:
    • Edgeアプリの値その他のインテグレーションの場合YOUR_TRACE_OBSERVER_URLとして使用したことを確認します。
    • YOUR_TRACE_OBSERVER_URLについて挿入した値の引用符が一重引用符であることを確認します。
    • (ライセンスではなく)Insert APIキーを使用していることを確認します。
  6. テストでHTTP/1.1 202 Acceptedが返された場合、New Relic Oneに移動し、スパン属性service.name = Test Service Aを使用してテストデータのクエリを表示します。サンプルペイロードにはエラー属性が含まれるため、エラーサンプラーにより保存するよう印が付けられます。エラー属性を削除するようペイロードを変更すると、ランダムサンプラーは、この特定のトレースを保存することを選択できません。

    トレースオブザーバーとTrace APIの両方でトレースを処理するには、最大で1分ほどかかります。

ステップ3。エージェントの設定

ディストリビューティッド(分散)トレーシングは、設定全体で有効になります。ディストリビューティッド(分散)トレーシングで変更する必要がある設定は、希望のタイプにより異なります:

  • 標準のディストリビューティッド(分散)トレーシング
  • Infinite Tracing(ステップ2YOUR_TRACE_OBSERVER_HOSTが必要)

エージェントの次のセクションを見直し、必要な設定を確認します。詳細については、エージェントの設定をご覧ください。

サーバーサイドコンフィグレーションは、Infinity Tracingでは使用できません。

C SDK

設定の概要は次のとおりです。設定の詳細については、Cアプリケーションについてディストリビューティッド(分散)トレーシングを有効にするをご覧ください。

種類 必要な設定
標準のディストリビューティッド(分散)トレーシング

設定の例:

  • newrelic_app_config_t 構成:
     newrelic_app_config_t* config; config = newrelic_create_app_config(app_name, license_key); config->distributed_tracing.enabled = true; 
Infinite Tracing 利用不可
Go

設定の概要は次のとおりです。設定の詳細については、Goアプリケーションについてディストリビューティッド(分散)トレーシングを有効にするをご覧ください。

種類 必要な設定
標準のディストリビューティッド(分散)トレーシング

設定の例:

  • ConfigOption構成:

    newrelic.NewApplication(
      newrelic.ConfigAppName("Example App"),
      newrelic.ConfigLicense(os.Getenv("NEW_RELIC_LICENSE_KEY")),
      newrelic.ConfigDistributedTracerEnabled(true),
    )
  • 環境変数:

    NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
Infinite Tracing

設定の例:

  • newrelic.Config 構成:

    app, err := newrelic.NewApplication(
        newrelic.ConfigAppName(YOUR_APP_NAME),
        newrelic.ConfigLicense(YOUR_LICENSE_KEY),
        func(cfg *newrelic.Config) {
            cfg.DistributedTracer.Enabled = true
            cfg.InfiniteTracing.TraceObserver.Host = YOUR_TRACE_OBSERVER_HOST
        },
    )
    
  • 環境変数:

    NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
    NEW_RELIC_INFINITE_TRACING_TRACE_OBSERVER_HOST=YOUR_TRACE_OBSERVER_HOST
Java

設定の概要は次のとおりです。設定の詳細については、Javaエージェント設定: 設定ファイルをご覧ください。

種類 必要な設定
標準のディストリビューティッド(分散)トレーシング

設定の例:

  • 設定ファイル(newrelic.yml)(commonスタンザの下にあり、スペース2個分のインデント付き):

      distributed_tracing:
        enabled: true
  • Javaシステムプロパティ:

    -Dnewrelic.config.distributed_tracing.enabled=true
  • 環境変数:

    NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
Infinite Tracing

設定の例:

  • 設定ファイル(newrelic.yml)(commonスタンザの下にあり、スペース2個分のインデント付き):

      distributed_tracing:
        enabled: true
      infinite_tracing:
        trace_observer:
          host: "YOUR_TRACE_OBSERVER_HOST"
  • Javaシステムプロパティ:

    -Dnewrelic.config.distributed_tracing.enabled=true
    -Dnewrelic.config.infinite_tracing.trace_observer.host="YOUR_TRACE_OBSERVER_HOST"
  • 環境変数:

    NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
    NEW_RELIC_INFINITE_TRACING_TRACE_OBSERVER_HOST="YOUR_TRACE_OBSERVER_HOST"
.NET

設定の概要は次のとおりです。設定の詳細については、.NETエージェント設定をご覧ください。

種類 必要な設定
標準のディストリビューティッド(分散)トレーシング

設定の例:

  • 設定ファイル(newrelic.config):
     <configuration . . . > <distributedTracing enabled="true" /> </configuration>
  • 環境変数:
     NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
Infinite Tracing

設定の例:

  • 設定ファイル(newrelic.config):
     <configuration . . . > <distributedTracing enabled="true" /> <infiniteTracing> <trace_observer host="YOUR_TRACE_OBSERVER_HOST" /> </infiniteTracing> </configuration>
  • 環境変数:

    NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
    NEW_RELIC_INFINITE_TRACING_TRACE_OBSERVER_HOST="YOUR_TRACE_OBSERVER_HOST"
Node.js

設定の概要は次のとおりです。設定の詳細については、Node.jsエージェント設定をご覧ください。

種類 必要な設定
標準のディストリビューティッド(分散)トレーシング

設定の例:

設定ファイル(newrelic.js):

distributed_tracing: {
  enabled: true
}

環境変数:

NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
Infinite Tracing

設定の例:

設定ファイル(newrelic.js):

distributed_tracing: {
  enabled: true
}
infinite_tracing: {
  trace_observer: {
    host: 'YOUR_TRACE_OBSERVER_HOST'
  }
}

環境変数:

NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
NEW_RELIC_INFINITE_TRACING_TRACE_OBSERVER_HOST="YOUR_TRACE_OBSERVER_HOST"
PHP

設定の概要は次のとおりです。設定の詳細については、PHPエージェント向けディストリビューティッド(分散)トレーシングをご覧ください。

種類 必要な設定
標準のディストリビューティッド(分散)トレーシング

設定の例:

  • 設定ファイル(newrelic.ini):

    newrelic.distributed_tracing_enabled = true
Infinite Tracing

設定の例:

  • 設定ファイル(newrelic.ini):

    newrelic.distributed_tracing_enabled = true
    newrelic.span_events_enabled = true
    newrelic.infinite_tracing.trace_observer_host= YOUR_TRACE_OBSERVER_HOST
    
Python

設定の概要は次のとおりです。設定の詳細については、Pythonエージェント設定をご覧ください。

種類 必要な設定
標準のディストリビューティッド(分散)トレーシング

設定ファイル(newrelic.ini):

distributed_tracing.enabled = true

環境変数:

NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
Infinite Tracing

次のインストールコマンドを使用します:

pip install newrelic[infinite-tracing]

設定ファイル(newrelic.ini):

distributed_tracing.enabled = true
infinite_tracing.trace_observer_host= YOUR_TRACE_OBSERVER_HOST

環境変数:

NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
NEW_RELIC_INFINITE_TRACING_TRACE_OBSERVER_HOST="YOUR_TRACE_OBSERVER_HOST"
Ruby

設定の概要は次のとおりです。設定の詳細については、Rubyエージェント設定をご覧ください。

種類 必要な設定
標準のディストリビューティッド(分散)トレーシング

設定の例:

  • 設定ファイル(newrelic.yml):

      distributed_tracing:
            enabled: true
  • 環境変数:
     NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
Infinite Tracing

設定の例:

  • 設定ファイル(newrelic.yml):

      distributed_tracing: 
          enabled: true
      infinite_tracing: 
          trace_observer: 
              host: 'YOUR_TRACE_OBSERVER_HOST'
    				
  • 環境変数:

    NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
    NEW_RELIC_INFINITE_TRACING_TRACE_OBSERVER_HOST="YOUR_TRACE_OBSERVER_HOST"

プロキシ設定についてサポートが必要な場合は、プロキシサポートを参照してください。

ステップ4。トレースを表示

APMエージェントを更新し、データをトレースオブザーバーに送信するよう設定すると、トレースを表示できるようになります。次の2つの代わりの方法があります:

特定のサービスを含むトレースを表示

エンティティエクスプローラーを使用して、特定のサービスに移動し、そのサービスを含むトレースを表示できます。

  1. one.newrelic.comに移動します。
  2. 上部のメニューバーでエンティティエクスプローラーをクリックします。
  3. サービス名を入力してInfinity Tracingについて有効なサービスを絞り込み、Enterを押します。
  4. 左側のナビゲーションのモニターセクションで、ディストリビューティッド(分散)トレーシングをクリックします。
アカウント全体でトレースを表示

このオプションを使用して、アクセスできる、組織のすべてのNew Relicアカウント全体ですべてのトレースを検索できます。

  1. one.newrelic.comに移動します。
  2. 上部のメニューバーでアプリケーションをクリックします。
  3. お気に入りの下にあるディストリビューティッド(分散)トレーシングをクリックします。
  4. トレースを検索...検索で、検索語句を入力してサービスを検索します。たとえば、service.nameまたはtrace.idクエリを行うには:

    service.name = YOUR_SERVICE_NAME
    trace.id = YOUR_TRACE_ID

手動でのインストゥルメント(自動インストゥルメントを行えない場合)

推奨事項:カスタムインストゥルメントを行う前に、以下をお読みください:

サービスでトレースヘッダーがその他のサービスに渡されない場合、ディストリビューティッド(分散)トレーシングのペイロードAPIを使用して、サービスの呼び出しおよび呼び出されたサービスをインストゥルメントできます。サービスの呼び出しでは、API呼び出しを使用して、呼び出されたサービスにより認められるペイロードを生成します。

サービスの呼び出しをインストゥルメントする

サービスの呼び出しをインストゥルメントするには:

  1. サービスの呼び出しを監視するAPMエージェントのバージョンが、ディストリビューティッド(分散)トレーシングをサポートしていることを確認します。

  2. ディストリビューティッド(分散)トレースのペイロードを生成するため、エージェントAPIの呼び出しを行います:C SDK | Go | Java | .NET | Node.js | PHP | Python | Ruby

    トレースでスパンの順序を適切に保つため、ペイロードを送信するスパンのコンテキストでペイロードを生成していることを確認します

  3. そのペイロードを、宛先のサービスに行われた呼び出し(例としてはヘッダー内)に追加します。
  4. (オプション)外部の呼び出しとして呼び出しを特定:

呼び出されたサービスをインストゥルメントする

呼び出されたサービスをインストゥルメントするには:

  1. 呼び出されたサービスを監視するAPMエージェントのバージョンが、ディストリビューティッド(分散)トレーシングをサポートしていることを確認します。

  2. 呼び出されたサービスのNew RelicエージェントがNew Relicトランザクションを特定しない場合、エージェントAPIを使用してトランザクションを宣言します:

    C SDK

    トランザクションが進捗していないことを伝える1つの方法:newrelic_create_distributed_trace_payload()が呼び出されると、NULLポインターが返される。この問題を解決するには、手順に従い、C SDKを使用してトランザクションを作成します。

    Go

    トランザクションが進捗していないことを伝える1つの方法:Transaction.InsertDistributedTraceHeaders(h http.Header)が呼び出されている場合、ヘッダが挿入されていません。トランザクションを作成するには、Goトランザクションのインストゥルメントをご覧ください。

    Java

    トランザクションが進捗していないことを伝える1つの方法:createDistributedTracePayload()が呼び出されると、空の文字列が返される。トランザクションを作成するには、Javaエージェントトランザクション関連のAPIをご覧ください。

    .NET

    トランザクションが進捗していないことを伝える1つの方法:CreateDistributedTracePayload()空のペイロードを返す。トランザクションを作成するには、.NETカスタムインストゥルメンテーションの概要をご覧ください。

    Node.js

    トランザクションが進捗していないことを伝える1つの方法:Node.jsエージェントログが、次のものと同様のエラーをレポートする:

    No transaction found when calling Transaction.acceptDistributedTracePayload.

    startWebTransactionを使用してウェブトランザクションを作成するか、startBackgroundTransactionを使用してウェブ以外のトランザクションを取得します。

    PHP

    トランザクションが進捗していないことを伝える1つの方法:newrelic_insert_distributed_trace_headers()falseを返します。トランザクションを作成するには、newrelic_start_transactionをご覧ください。

    Python

    トランザクションが進捗していないことを伝えるには:transaction = current_transaction()を実行している際に、transactionNoneである。または、result = accept_distributed_trace_payload(payload)を実行している場合、結果がFalseである。

    background_taskを使用して、ウェブ以外のトランザクションをレポートします。Pythonインストゥルメンテーションの詳細については、トランザクションとセグメントの監視をご覧ください。

    Ruby

    ラックベースのウェブフレームワークを使用しており、New Relicのラックインストゥルメンテーションが有効になっている場合、Rubyエージェントがトランザクション開始を扱います。その他の使用例については、add_transaction_tracer APIメソッドをご覧ください。

  3. 受信した呼び出しからペイロードを抽出します(一例としてヘッダーで)。
  4. ペイロードを受け入れるため呼び出しを行います:C SDK | Go | Java | .NET | PHP | Node.js | Python | Ruby

その他のヘルプ

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