ディストリビュートトレース は、分散システムの動作を監視・分析するのに役立ちます。分散トレースを有効にすると、UIツールを使ってトレースを検索したり、分析したりすることができます。
多くのサービスにまたがるトランザクションのエラーのトラブルシューティングを行う場合は、次のようにします。
- 分散トレーシング UI ページを開きます 。
- トレースをソートする フィルターを使って特定のリクエストを見つけ出し、エラーを含むトレースだけを表示することができます。
- トレースの詳細ページで、エラーの原因となったリクエスト ルートに沿ったスパンを確認します。
- エラークラスとメッセージに注意しながら、トレースのスパンからサービスに移動して、エラーが高い割合で発生していることを確認します。
ここでは、分散型トレースのUIに用意されたオプションについて説明します。
分散型トレーシングのUIを開く
特定のサービスのトレースを表示するには:
左側のパネルの
Your system
の下で、検査するトレースが含まれるエンティティを選択します。
左側のペインで
Distributed tracing
をクリックします。
または、すべてのアカウントのトレースを表示するには:
one.newrelic.com > All Capabilities
に移動します。
Traces
タイルをクリックします。
ヒント
トレース内の一部のサービスのアカウントにアクセスできない場合、 それらのサービスの一部の詳細が難読化されます。
スパンデータをフィルタリングする
トレースとスパンを見つけて問題を解決できるようにするためのさまざまなツールが用意されています。分散トレーシングの開始ページには、トレースのデフォルトのリストが表示されます。次のツールを使用して、このリストをすばやく調整できます。
Find tracesクエリ バーを使用すると、トレースの検索範囲をすばやく絞り込むことができます。 クエリ バーに入力を開始するか、ドロップダウンを使用して複合クエリを作成することができます。
クエリの検索結果は、トレースの属性ではなく、 スパン の属性に基づいています。特定の条件を持つスパンを定義すると、検索ではそのスパンを含むトレースが表示されます。
複数の属性を持つフィルターを使用した場合、最初に選択された属性の影響を受けます。分散トレーシングでは、トランザクションイベントとスパンの2種類のデータをレポートします。フィルタで属性を選択すると、その属性が添付されているデータタイプによって、利用可能な属性が決まります。たとえば、トランザクション イベントに関連付けられた属性をフィルタリングした場合、属性値を追加してフィルタリングしようとすると、トランザクション イベントの属性しか利用できません。
トレースのクエリは NRQL (クエリ言語) に似ていますが、いくつかの主な例外があります。
文字列値には引用符は必要ありません(たとえば、
appName = MyApp
またはappName = 'MyApp'
のいずれかを使用できます)like
演算子は%
を必要としません(たとえば、appName like product
またはappName like %product%
のいずれかを使用できます)。以下に、クエリ バーの使用方法の 2 つの例を示します。
下の画像のクエリは、その痕跡を見つけます。
WebPortalとInventory Serviceの両方のアプリケーションを通過
インベントリサービスのデータストアの呼び出しに500ms以上の時間がかかる
任意の スパン のエラーを含みます。
に行く one.newrelic.com > All capabilities > Apps > Distributed tracing
下の画像のクエリは、その痕跡を見つけます。
WebPortalアプリケーションを通過するスパンを含み、WebPortalアプリケーションのいずれかのスパンでエラーが発生した場合
customer_user_email
属性にトレースの任意の場所でhotmail.com
で終わる値が含まれるスパンが含まれます。に行く one.newrelic.com > All capabilities > Apps > Distributed tracing
ページ上部のクエリ バーに加えて、左側のペインでさまざまなフィルターを使用して、関心のあるトレースを見つけることができます。
Infinite tracing data: 無限トレース機能に関連するトレースのみを表示する場合に選択します。
Multi span traces only: 単一スパンのトレースを非表示にするには、これを使用します。
Error filters: Errorsの下で、フィルタリングするエラーを選択します。
Histogram filters: 左ペインの下部にあるErrorsの下で、 More filtersをクリックするとヒストグラム フィルターが表示されます。 スライダーをドラッグして値を変更します(例: Trace duration 。
- 大なり比較を行うには、スライダの左端をドラッグします。
- 小なり比較を行うには、スライダの右端をドラッグします。
- スライダーの両端を中央に向かってドラッグして、範囲でフィルタリングします。
スライダーをドラッグすると、トレースのリストとトレース チャートに表示される内容の両方が変更されます。
スパンデータを整理する
ディストリビューティッド(分散)トレーシングのデフォルト ビューには、同じルート エントリ スパンでグループ化されたトレースが表示されます。 つまり、トレースは、New Relic がリクエストの記録を開始した範囲ごとにグループ化されます。 トグルGroup similar tracesをスライドしてオン/オフを切り替えることができます。
トレース グループを使用すると、トレースの概要を把握できるため、類似したトレースのグループに対する要求の動作を理解できます。これは、トレース数、期間、およびエラーの低下または急増を理解するのに役立ちます。トレース グループの 1 つをクリックすると、選択した特定のトレース グループのコンテキストですべての標準的な詳細が表示されます。
Group similar tracesがオンになっている場合、ディストリビューティッド(分散)トレーシングのページ上部に 3 つのグラフが表示されます。 これらのグラフには、グラフの下の表にリストされている各トレース グループのトレース数、95 パーセンタイル期間、およびエラー数が表示されます。 これらのグラフのフィルターを変更するには、左側のペインのフィルターを参照してください。
トレース散布図は、外れ値のトレースを見つけるための簡単な方法です。 これは、ページ上部のGroup similar tracesトグルをオフにすると、ディストリビューティッド(分散)トレーシングの開始ページで利用できます。
散布図では、グラフ上にカーソルを移動してトレースの詳細を表示したり、個々のポイントをクリックして詳細を表示することができます。
散布図に表示される内容を制御します。
View by
ドロップダウンで期間の種類を選択します。
Backend duration
Root span duration
Trace duration
Facet traces by
で、次のいずれかのオプションを選択します。
Root entry span
: ルート サービスのエンドポイントであるルート トランザクションでグループ化します。 サービス A がサービス B を呼び出し、サービス B がサービス C を呼び出すトレースでは、ルート エントリ スパンはサービス A のエンドポイントです。 たとえば、「サービス A - GET /ユーザー/%」などです。
Root entity
: トレースの最初のエンティティの名前でグループ化します。 サービス A がサービス B を呼び出し、サービス B がサービス C を呼び出すトレースでは、ルート エンティティはサービス A になります。
Errors
: トレースにエラーが含まれているかどうかでグループ化します。
- 散布図のフィルターを変更する方法のヒントについては、左ペインのフィルターを確認してください。
ヒント
多数の結果を生成する一部のクエリは、グラフで誤検知になる場合があります。これは、トレース リストにないトレース結果を示すグラフとして現れる可能性があります。
その他のUIの詳細
ここでは、分散型トレーシングのUIの詳細、ルール、制限について説明します。
スパンレベルのエラーは、エラーがプロセスのどこで発生し、どのように上昇し、どこで処理されたかを示します。エラーで終わったすべてのスパンは、UI にエラーが表示され、そのトレースの合計エラー数に貢献します。
ここでは、スパンエラーを理解するための一般的なヒントをご紹介します。
エラーのあるスパンは、ディストリビューティッド(分散)トレーシングUIで赤く強調表示されます。 各スパンのError Detailsペインで詳細情報を確認できます。
エラーで終了したすべてのスパンは、スパンエラー数にカウントされます。
同じスパンで複数のエラーが発生した場合、優先順位に従って1つだけがスパンに書き込まれます。
- A
noticeError
- そのスパンの範囲内での直近のスパンエラー
この表では、さまざまなスパンエラーの処理方法について説明します。
エラーの種類
説明
エラーで終わるスパン
スパンの境界を越えたエラーは、エラーが捕捉されるかトランザクションを終了するまで、そのスパンと、同じくエラーで終了するすべての祖先スパンでエラーが発生します。エラーが捕捉されるかトランザクションが終了するまで、そのスパンとエラーで終了する先祖のスパンでエラーが発生します。
通知エラー
エージェント
noticeError
APIの呼び出しまたは自動エージェントインストルメンテーションによって通知されたエラーは、現在実行中のスパンに付加されます。レスポンスコードエラー
レスポンスコードのエラーは、次のように関連するスパンに付けられます。
クライアントスパン:プレフィックスが
http
またはdb
の外部トランザクション。エントリースパン。レスポンスコードエラーで終わるトランザクションの場合。
これらのスパンの応答コードは、属性
http.statusCode
としてキャプチャされ、そのスパンにアタッチされます。
OpenTelemetryのエラー
右側のペインのError Detailsボックスには、
otel.status_code = ERROR
を含むスパンが入力され、otel.status_description
の内容が表示されます。ヒント
アプリ/サービスによって処理される OpenTelemetry スパン イベントは、スパン エラー ステータスとは独立して表示され、必ずしもスパン エラー ステータスに関連付けられているわけではありません。 右側のペインでView span eventsをクリックすると、スパン イベントの例外と非例外を表示できます。
- A
UIでスパンが異常と表示される場合は、以下の両方が当てはまることを意味します。
- 過去6時間の同一サービスの同名のスパンの平均値と比較して、2標準偏差以上遅れる。
- スパンの持続時間がトレースの持続時間の10%以上である。
あるプロセスが別のプロセスを呼び出し、両方のプロセスがNew Relicによってインスツルメンテーションされている場合、トレースには呼び出しのクライアント側の表現とサーバー側の表現の両方が含まれます。 クライアント側のスパン (呼び出し側のプロセス)は、サーバー側のスパン (呼び出されたプロセス)と比較して、時間に関連した差異が生じる可能性があります。このような違いは、以下のような原因が考えられます。
システムクロックの時間差によるクロックスキュー
ネットワークの遅延やDNS解決の遅れなどによる期間の違い
UIでは、サーバーのスパンと同じスペースに、クライアントのスパンのアウトラインを表示することで、これらの時間的な違いを示しています。このスパンは、クライアントのスパンの継続時間を表しています。
このような時間のズレの要因をすべて特定することはできませんが、よくあるスパンのパターンとそれを理解するためのヒントをご紹介します。
A.クライアントスパンがサーバースパンよりも長い場合、これは、ネットワーク時間、キュー時間、DNS解決時間、または表示されないロードバランサーからの遅延などの多くの領域での遅延が原因である可能性があります。 B.サーバースパンが開始する前にクライアントスパンが開始および終了する場合、これはクロックスキューが原因であるか、サーバーが応答の送信後に継続する非同期作業を実行していることが原因である可能性があります。 C.クライアントスパンがサーバースパンの後に開始する場合、これはクロックスキューである可能性があります。
断片化されたトレースは、スパンが欠落しているトレースです。 スパンの欠落または親スパン ID が無効な場合、その子スパンはトレースの残りの部分から分離され、「孤立」状態になります。 孤立したスパンはトレースの下部に表示され、トレースの残りの部分への接続線がなくなります。 断片化されたスパンがある場合は、詳細ページの上部にFragmentedという単語が表示されます。
UI に示される孤立したスパン プロパティのタイプ:
No root span. リクエストの最初の操作であるルート スパンがありません。 この場合、最も古いタイムスタンプを持つスパンがルートとして表示されます。
Orphaned span. 親スパンが欠落している単一のスパン。 これは、親スパンの ID が子スパンと一致しないことが原因である可能性があります。
Orphaned trace fragment. グループ内の最初のスパンが孤立スパンである、接続されたスパンのグループ。
これには以下のような理由があります。
Collection limits. 一部の高収益アプリケーションでは、収集制限 ( APMエージェント収集制限やAPI制限など) を超える場合があります。 このような状況が発生すると、トレースのスパンが欠落する可能性があります。 この問題を解決する 1 つの方法は、制限に達しないように一部のレポートをオフにすることです。
Incorrect instrumentation. アプリケーションが誤ってインストゥルメントされた場合、トレースコンテキストを正しく渡さず、トレースが断片化されます。 この問題を解決するには、孤立したスパンを生成しているデータ ソースを調べて、インストゥルメンテーションが正しく行われていることを確認します。 スパンのデータ ソースを見つけるには、そのデータ ソースを選択して、そのスパンの詳細を調べます。
Spans still arriving一部の親スパンがまだ収集されていない場合は、トレース全体がレポートされるまで一時的なギャップが発生する可能性があります。
UI display limits. トレースが 10K スパンの表示制限を超えると、孤立したスパンが発生する可能性があります。
保存されたトレースは、元のトレースのスナップショットに似ています。以前に表示され、保存期間を過ぎた完全なトレースがアーカイブされます。延長保存を購入していない限り、完全なトレースは 7 日間のみ利用できます (これは UI に自動的に反映されます)。ただし、保存されたトレースは最長 1 年間存在し、通常は元のトレースと同様に機能します。
保存されたトレースには、スパン パフォーマンス データやスパン異常データは表示されないことに注意してください。保存されたトレース内のエンティティが削除されたり、有効期限が切れたり、データのレポートが停止されたりすると、保存されたトレースにアクセスできなくなる可能性があります。
他のサービスを監視する New Relic アカウントにアクセスできない場合、スパンやサービスの詳細の一部が UI で難読化されます。難読化には以下のようなものがあります。
アスタリスクで隠されたスパン名
サービス名をNew RelicのアカウントIDとアプリIDに変更
アカウントへのアクセスに影響する要因については、 アカウントへのアクセス をご参照ください。
言語エージェント: アダプティブ サンプリング を参照してください。
スパンのウォーターフォールを表示すると、スパン名が完全なスパン名よりも人間が判読しやすい不完全な形式で表示される場合があります。 完全な名前を見つけるには、そのスパンを選択し、 Full span nameを探します。 完全な名前を知っていると、NRQL を使用してそのデータをクエリするときに役立ちます。
トレースには、時々、不足しているスパンやサービスがある(またはあるように見える)場合があります。これは、 trace list で表示されるトレースのスパンやサービスの数と、 trace details のページで表示される数との間の不一致として現れます。
スパンの欠落やカウントの不一致の理由は以下の通りです。
これらの UI ツールに加えて、「 分散トレース データのクエリ」で NRQL クエリの例を確認することもできます。