ディストリビューティッド (分散) トレーシングUIの理解と使用

ディストリビューティッド(分散)トレーシングは、分散化されたシステムの動作を監視し分析するのに役立ちます。ディストリビューティッド(分散)トレーシングを有効にした後、UIツールを使用してトレースを検索し分析できます。

たとえば、皆さんが、多くのサービスにまたがる複雑なトランザクションでエラーのトラブルシューティングを行っているとしましょう。当社のUIでは次のことを行えます:

  1. ディストリビューティッド(分散)トレーシングのUIページを開く。
  2. フィルターを使用してトレースを並び替え、その特定のリクエストを検索してエラーを含むトレースのみを表示する。
  3. トレースの詳細ページで、エラーに端を発するリクエストルートに沿ってスパンを確認できます。
  4. エラークラスとメッセージに注意して、トレースのスパンからサービスに移動し、エラーが高頻度で発生していることを確認します。

ディストリビューティッド(分散)トレーシングUIでオプションを詳しく調べます。

ディストリビューティッド(分散)トレーシングのUIを開く

行う検索のタイプに応じて、次のようにディストリビューティッド(分散)トレーシングUIにアクセスできます:

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

エンティティエクスプローラーAPMは、特定のサービスに移動し、そのサービスを含むトレースを表示できる2つのメニューオプションです。

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

このオプションでは、アクセスできるすべてのNew Relicアカウント全体ですべてのトレースを検索できるディストリビューティッド(分散)トレーシングページを使用します。

  1. one.newrelic.comに移動します。
  2. 上部のメニューバーでアプリケーションをクリックします。
  3. お気に入りの下にあるディストリビューティッド(分散)トレーシングをクリックします。

データセキュリティのため、トレースでサービスを監視するアカウントにアクセスできない場合、こうしたサービスの詳細は難読化されます。

トレースを並び替え

最初のディストリビューティッド(分散)トレーシングのページにはトレースのリストが入力されるので、次のツールを使用してこのリストを絞り込むことができます:

これらのツールに加えて、ディストリビューティッド(分散)トレースデータのクエリで取り上げたその他のオプションも使用できます。

クエリバーを使用してフィルターを適用

トレースを検索クエリバーを使用して、トレースの検索を簡単に絞り込むことができます。クエリバーに入力を開始、またはドロップダウンを使用して複合クエリを作成できます。

クエリで何が返されるかは、トレース属性ではなくスパン属性に基づきます。特定の基準を有するスパンを定義すると、そのスパンを含むトレースが検索で表示されます。

トレースのクエリは、NRQL (当社のクエリ言語)と同じです。主な例外は次のとおりです:

  • 文字列の値で引用符は不要(例として、appName = MyApp または appName = 'MyApp'のいずれも使用可能)
  • like演算子で%は不要(例として、appName like product または appName like %product%のいずれも使用可能)

多数の結果を返すクエリは、誤検出を返す場合があります。トレースリストでは、こうした間違った結果を、返された結果の10%に制限します。誤検出により、ヒストグラムチャートの結果がトレースリストで表示されなくなる場合もあります。

2つのクエリバーの例は次のとおりです:

2つのサービスにタッチするトレースを検索

以下の画像にあるクエリは、次のようなトレースを検索します:

  1. WebPortalアプリケーションとInventory Serviceアプリケーションの両方を通過
  2. 500ミリ秒以上かかるInventory Serviceデータストア呼び出しがある
  3. いずれかのスパンにエラーが含まれる。
new-relic-one-distributed-tracing-query-example-1.png
one.newrelic.com > Apps > ディストリビューティッド(分散)トレーシングの順に移動します。
like演算子を使用してエラースパンを検索

以下の画像にあるクエリは、次のようなトレースを検索します:

  1. WebPortalアプリケーションを通過し、WebPortalアプリケーションのいずれかのスパンでエラーが発生したスパンを含む
  2. customer_user_email属性がトレースのどこかでhotmail.comで終わる値を含むスパンを含む。
New Relic Oneディストリビューティッド(分散)トレーシング - クエリの例2
one.newrelic.com > Apps > ディストリビューティッド(分散)トレーシングの順に移動します。

散布図を使用してフィルターを適用

ディストリビューティッド(分散)トレーシングの最初のページにあるトレースの散布図を使用して、簡単に中心から外れたトレースを検索できます。カーソルをチャートで移動してトレースの詳細を表示し、個別の点をクリックして詳細を把握できます。

ディストリビューティッド(分散)トレーシングの散布図を示すスクリーンショット。
one.newrelic.com > Apps > Favorites > Distributed tracing の順に移動するか、one.newrelic.com > APM > (アプリを選択) > Monitor > Distributed tracingの順に移動します。

トレースの散布図を表示すると、表示で期間のタイプを選択し、トレースをグループ化で次のオプションの1つを選択できます:

  • エラー: トレースにエラーが含まれるかどうかでグループ化します。
  • ルートサービス: トレースの最初のサービスの名前でグループ化します。サービスAがサービスBを呼び出し、サービスBがサービスCを呼び出すトレースでは、ルートサービスはサービスAとなります。
  • ルート入力スパン: ルートサービスのエンドポイントであるルートトランザクション別にグループ化します。サービスAがサービスBを呼び出し、サービスBがサービスCを呼び出すトレースでは、ルート入力スパンはサービスAのエンドポイントとなります。例えば:"Service A - GET /user/%".
  • サービス入力スパン: 現在APMで表示されているサービスのスパン名別にグループ化します。たとえば、サービスAがサービスBを呼び出し、サービスBがサービスCを呼び出すトレースについては、APMでサービスBを表示しておりこのグループ分けを選択する場合、トレースはそのサービスBのスパン名別に表されます。サービスがトレースで複数のスパンを有する場合、このグループ分けオプションでは、そのサービスの最初の入力ポイントを使用します。

ヒストグラムを使用してトレースにフィルターを適用

トレースのヒストグラムチャートは、グローバルのディストリビューティッド(分散)トレーシングのページでしか利用できません。

グローバルなディストリビューティッド(分散)トレーシングページのヒストグラムチャートにより、持続時間などの重要な値のトレース分布の概要が分かります。チャートの下にあるスライダーを使用して、どのトレースを表示するかをコントロールします。たとえば、トレースの持続時間チャートのスライダーをドラッグして、以下のヒストグラムの例に示されたように、500 ms超のトレースのみを表示できます。

New Relic Oneディストリビューティッド(分散)トレーシング - ヒストグラム

注: 多くの結果を生成するクエリでは、ヒストグラムに誤検出が表示される場合があります。これは、トレースリストにないトレース結果がヒストグラムに表示されていることを示している可能性があります。

トレース詳細UIページ

トレースリストからトレースを選択すると、トレースの時系列とスパンが表示されます:

New Relicディストリビューティッド(分散)トレーシングUI - トレース詳細ページ
one.newrelic.com > APM > (アプリケーションを選択)> Monitor > Distributed tracing >(トレースを選択)> (スパンを選択):トレースでスパンを表示します。個別のスパンの詳細を検証し、異常な動作のあるスパンの通知を確認します。

UIは、次のアイコンで一部のスパンのプロパティを示します:

スパンのプロパティ インジケーター 説明
サービス New Relicディストリビューティッド(分散)トレーシングのサービスアイコン このアイコンは、サービスの入力ポイントであるスパンを表します。
処理中 New Relicディストリビューティッド(分散)トレーシングの処理中のスパンのアイコン このアイコンは、処理中のスパンを表します。これは、(プロセス間のスパンではなく)プロセス内で発生するスパンです。例:ミドルウェアのインストゥルメンテーション、ユーザーが作成したスパン。
データストア New Relicディストリビューティッド(分散)トレーシングのデータストアスパンのアイコン このアイコンは、データストアへのスパンの呼び出しを表します。
外部 New Relicディストリビューティッド(分散)トレーシングの外部スパンのアイコン このアイコンは、HTTPを介して行われた外部サービスへの呼び出しを表すカテゴリを表します。
ブラウザアプリ New Relicディストリビューティッド(分散)トレーシングのブラウザスパンのアイコン このアイコンは、ブラウザアプリケーションスパンを表します。
Lambda New Relicディストリビューティッド(分散)トレーシングの外部スパンのアイコン このアイコンは、Lambda関数からのスパンを表します。

一部のスパンには、次のような追加のインジケーターがあります:

スパンのプロパティ インジケーター 説明
接続のタイプ New Relic ディストリビューティッド(分散)トレーシングをつなぐ線の画像 実線は、直接の親子関係、つまり、直接互いを呼び出す1つのプロセスまたは関数を表します。破線は直接でない関係を表します。スパン間の関係の詳細については、トレースの構成をご覧ください。
エラー New Relicディストリビューティッド(分散)トレーシングのエラーアイコン エラーのあるスパン。スパンエラーを理解する方法をご覧ください。
異常 New Relicディストリビューティッド(分散)トレーシングのデータストアスパンのアイコン このアイコンは、異常なスパンを検知したことを表します。
親のないスパン New Relicディストリビューティッド(分散)トレーシングの親のないスパンのアイコン 一部のスパンには「親がない」か、トレースから分けられています。このスパンは、トレースの下に表示されます。詳細については、断片化したトレースをご覧ください。
複数のアプリ名 New Relicディストリビューティッド(分散)トレーシングの複数のアプリ名のインジケータ スパン名の横にある場合、複数のアプリ名が設定されたエンティティを表します。これを選択して、インジケータがレポートするすべてのアプリ名を表示します。別のアプリ名でトレースデータを検索するには、appName属性を使用します。
クライアント/サーバーの時間差 New Relicディストリビューティッド(分散)トレーシングのクライアントとサーバーの時間差のインジケータ スパンの期間のインジケータに(この例のように)完全に色が付いていない場合、そのアクティビティでサーバー側の期間とクライアント側の期間に時間差があることを意味します。この点の詳細については、クライアント/サーバーの時間差をご覧ください。

トレース構成とスパンプロパティの決定方法の詳細については、トレース構成をご覧ください。

スパンの詳細ペイン

スパンを選択すると、スパンの詳細とともにペインが開きます。この詳細は、パフォーマンス問題のトラブルシューティングに有用です。詳細には次のものが含まれます:

スパンに何が表示されるかは、スパンのタイプに基づきます。たとえば、データストアスパンのname属性には、データストアクエリが含まれます。

追加のUIの詳細

追加のディストリビューティッド(分散)トレーシングUIの詳細や規則、制限は次のとおりです:

スパンエラーを理解する方法

スパンレベルのエラーは、プロセスのどこでエラーが発生したかやどのように現れたか、どこで扱われたかを示します。例外で終わるすべてのスパンは、UIでエラーとともに表示され、そのトレースの合計エラー数に加算されます。

スパンエラーの理解についての一般的なヒントは次のとおりです:

  • エラーのあるスパンは、ディストリビューティッド(分散)トレーシングUIで赤色でハイライト表示されます。詳細については、各スパンのエラーの詳細ペインをご覧ください。
  • エラーで終わるすべてのスパンは、スパンエラーカウントでカウントされます。
  • 複数のエラーが同じスパンで発生すると、次の優先順位でスパンに1つだけ書き込まれます:
    • noticeError
    • 直近のスパン例外

この表では、異なるスパンエラーの取り扱いを説明しています:

エラータイプ 説明
例外で終わるスパン スパンの境界が残る例外により、例外が見つかるか、トランザクションが終了するまで、そのスパンと、エラーで終わる上位のスパンでエラーが発生します。上位のスパンで例外が見つかっているかどうかを確認できます。
通知エラー エージェントnoticeErrorへの呼び出し、または自動エージェントインストゥルメンテーションにより通知されたエラーは、現在実行しているスパンに添付されます。
レスポンスコードエラー レスポンスコードエラーは、次のような関連するスパンに添付されます:
  • クライアントスパン:httpまたはdbでプリフィックス化された外部トランザクション。
  • 開始スパン:レスポンスコードエラーで終わるトランザクションの場合。

このスパンのレスポンスコードは、属性httpResponseCodeとして捕捉され、そのスパンに添付されます。

異常なスパン

スパンが異常としてUIに表示されている場合、次のものが両方とも正しいことを意味します:

  • スパンが、過去6時間で同じサービスからの同じ名前のすべてのスパンの平均より、2標準偏差以上遅い。
  • スパンの期間がトレースの期間の10%以上である。
クライアントスパンの期間:クライアントスパンとサーバースパンの時間差

プロセスが別のプロセスを呼び出し、両方のプロセスがNew Relicによりインストゥルメントされている場合、トレースには呼び出しのクライアント側の表現とサーバー側の表現の両方が含まれます。クライアントスパン(呼び出しているプロセス)には、サーバースパン(呼び出されたプロセス)との比較の際に、時間関連の差が生じる場合があります。この差は、次のものによる可能性があります:

  • システムクロックの時間差によるクロックの歪み
  • ネットワークレイテンシやDNS解決の遅延などによる、期間の差

UIは、サーバーのスパンと同じスペースでクライアントスパンの概要を表示して、この時間関連の差を示します。このスパンは、クライアントスパンの期間を表します。

この時間関連の違いに寄与するすべての要因を決定することはできませんが、一般的なスパンのパターンと、パターンを理解するヒントは次のとおりです:

New Relicディストリビューティッド(分散)トレーシングのクライアントとサーバーの時間差の図
  1. クライアントスパンがサーバースパンより長い場合、次のようないくつかのエリアでのレイテンシによる可能性があります:ネットワーク時間やキュー時間、DNS解決時間、または把握できないロードバランサーから。
  2. クライアントスパンがサーバースパンの開始前に開始し終了する場合、クロックの歪みや、サーバーがレスポンスの送信後に継続する非同期作業が原因である可能性があります。
  3. クライアントスパンがサーバースパンの後で開始する場合、クロックの歪みによる可能性が最も高いと言えます。
断片化したトレース

断片化したトレースは、スパンのないトレースです。スパンがないか、または無効な親スパンIDを有する場合、子スパンは残りのトレースから分かれます。これは「親のない」スパンと呼ばれます。親のないスパンはトレースの下に表示され、残りのトレースとつながる線がありません。UIで示される親のないスパンプロパティのタイプ:

  • ルートスパンなし。 リクエストでの最初の操作であるルートスパンがない。この場合、最も古いタイムスタンプのあるスパンがルートとして表示されます。
  • 親のないスパン。親スパンのない単独スパン。これは、親スパンに、子スパンと一致しないIDがあることによる可能性があります。
  • 親のないトレース断片。グループの最初のスパンが親のナイスパンである、つながったスパンのグループ。

これは、次のものを含むいくつかの理由で発生する場合があります:

  • 収集の制限。 一部の高スループットアプリケーションでは、収集の制限(例:APMエージェントの収集制限やAPIの制限)を超える場合があります。この場合、トレースにスパンがないことがあります。これを修正する1つの方法は、制限に達しないように一部のレポートをオフにすることです。
  • 間違ったインストゥルメンテーション。 アプリケーションが間違ってインストゥルメントされている場合、トレースコンテキストを正しく渡さず、トレースが断片化されます。これを修正するには、親のないスパンを生成しているデータソースを検証し、インストゥルメンテーションが正しく行われていることを確認します。スパンのデータソースを見つけるには、選択してスパンの詳細を検証します。
  • スパンがまだ到着中。一部の親スパンがまだ収集されていない場合、トレース全体がレポートされるまで一時的にギャップが生じる場合があります。
  • UI表示の制限。 トレースが10000というスパン表示の制限を超える場合、親のないスパンが生じる場合があります。
フィルター機能

New Relic OneとNew Relic APMでは、次のようにトレースフィルタリングの仕組みに違いがあります:

New Relic APM

トレースフィルタリングに適用されるルール:

  • 現在のアプリケーションに基づくフィルタリング。 フィルタリングに使用できる属性は、New Relicで現在表示されているアプリケーションで使用できるものに限られます。表示されるはずの属性が表示されない場合、表示しているアプリケーションで使用できないことが理由の可能性があります。この場合、アプリケーション索引に移動し、この属性を捕捉するアプリケーションを選択します。
  • 最初に選択した属性の影響を受ける複数属性フィルター ディストリビューティッド(分散)トレーシングは、次の2つのデータタイプについてレポートします:トランザクションイベントとスパン。フィルターで属性を選択すると、属性が添付されるデータタイプは、使用できる属性を表します。たとえば、Transactionイベントに添付された属性にフィルターを適用すると、追加の属性値でフィルターを追加仕様とする際には、Transactionイベント属性しか使用できません。
New Relic One

New Relic Oneディストリビューティッド(分散)トレーシングでは、トレースのすべてのスパンから属性を検索できます。

詳細については、New Relic Oneでのディストリビューティッド(分散)トレーシングをご覧ください。

アカウントアクセスに基づき難読化されたトレースの詳細

他のサービスを監視するNew Relicアカウントにアクセスできない場合、スパンとサービスの詳細の一部がUIで難読化されます。難読化には次のものが含まれます:

  • アスタリスクで隠されたスパン名
  • New RelicのアカウントIDとアプリIDで置換されたサービス名

この難読化に影響を与える2つの主な要因:

  • アカウントのアクセス権限. マスター/サブアカウントの関係が、アクセスに影響を与えます。アクセスできるのがサブアカウントのみの場合、そのサブアカウントの詳細しか確認できません。マスターアカウントにアクセスできる場合、そのアカウントのサブアカウントの詳細を確認できます。
  • 認証。現在のログインに基づきアクセスできるNew Relicアカウントについてのみ、スパンの詳細を確認できます。つまり、一例として、トレースが異なる認証の仕組みの境界を越える場合、マスターアカウントの管理者でもすべての詳細を確認することはできません。
スパンの収集および表示の制限、サンプリングの詳細

New Relic APMエージェントには、1エージェントインスタンスについて収集可能なスパン数に1000個の制限があります。エージェントはサンプリングを使用して、トレースについて選択されたリクエストを選択します。サンプリングとエージェントスパンの制限の詳細については、サンプリングをご覧ください。

UIで表示されるスパンの最大合計数は10,000です。

ウォーターフォール型表示での不完全なスパン名

スパンをウォーターフォール型で表示する場合、スパン名が、完全なスパン名より読みやすい不完全な形式で表示される場合があります。完全な名前を検索するには、そのスパンを選択し、完全なスパン名を検索します。完全な名前を知っていると、NRQLでそのデータのクエリを行う際に有用です。

スパンの欠落とスパン/サービス数の不一致

トレースでは、スパンやサービスがない(またはないと見られる)場合があります。これは、トレースリストに表示されたトレースのスパンやサービスの数と、トレースの詳細ページに表示された数とが一致しないことを表します。

スパンの欠落と数の相違の理由としては、次のものがあります:

表示されているものを含む、収集したすべてのスパンは、NRQLでクエリを行うことができます。

その他のヘルプ

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