ディストリビュートトレース は、分散システムの動作を監視・分析するのに役立ちます。分散トレースを有効にすると、UIツールを使ってトレースを検索したり、分析したりすることができます。
多くのサービスにまたがるトランザクションのエラーのトラブルシューティングを行う場合は、次のようにします。
- 分散トレーシング UI ページを開きます 。
- トレースをソートする フィルターを使って特定のリクエストを見つけ出し、エラーを含むトレースだけを表示することができます。
- トレースの詳細ページで、エラーの原因となったリクエスト ルートに沿ったスパンを確認します。
- エラークラスとメッセージに注意しながら、トレースのスパンからサービスに移動して、エラーが高い割合で発生していることを確認します。
ここでは、分散型トレースのUIに用意されたオプションについて説明します。
分散型トレーシングのUIを開く
特定のサービスのトレースを表示するには:
- one.newrelic.com > All entitiesに移動します。
- 左側のパネルの Your system [システム] で、検査するトレースを含むエンティティを選択します。
- 左ペインで 分散トレース をクリックします。
または、すべてのアカウントのトレースを表示するには:
- one.newrelic.com > All Capabilitiesに移動します。
- [トレース] タイルをクリックします。
ヒント
トレース内の一部のサービスのアカウントにアクセスできない場合、 それらのサービスの一部の詳細が難読化されます。
スパンデータをフィルタリングする
トレースとスパンを見つけて問題を解決できるようにするためのさまざまなツールが用意されています。分散トレーシングの開始ページには、トレースのデフォルトのリストが表示されます。次のツールを使用して、このリストをすばやく調整できます。
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 [見る者] ドロップダウンで 期間のタイプを選択します。
- バックエンド期間
- ルートスパン期間
- トレース時間
- Facet traces by[によるファセット トレース]で、次のいずれかのオプションを選択します。
- ルートエントリースパン: ルートサービスのエンドポイントであるルートトランザクションによってグループ化されます。サービスAがサービスBを呼び出し、サービスBがサービスCを呼び出すようなトレースでは、ルートエントリスパンはサービスAのエンドポイントとなります。例:"サービスA - GET /user/%".
- Root entity[ルート エンティティ]: トレース内の最初のエンティティの名前でグループ化します。サービス A がサービス B を呼び出し、サービス B がサービス C を呼び出すトレースでは、ルート エンティティはサービス A になります。
- Errors: トレースにエラーが含まれているかどうかでグループ化。
- 散布図のフィルターを変更する方法のヒントについては、左ペインのフィルターを確認してください。
ヒント
多数の結果を生成する一部のクエリは、グラフで誤検知になる場合があります。これは、トレース リストにないトレース結果を示すグラフとして現れる可能性があります。
その他のUIの詳細
ここでは、分散型トレーシングのUIの詳細、ルール、制限について説明します。
スパンレベルのエラーは、エラーがプロセスのどこで発生し、どのように上昇し、どこで処理されたかを示します。エラーで終わったすべてのスパンは、UI にエラーが表示され、そのトレースの合計エラー数に貢献します。
ここでは、スパンエラーを理解するための一般的なヒントをご紹介します。
エラーが発生したスパンは、分散型トレーシングのUIで赤くハイライトされます。各スパンの詳細情報は、 Error Details ペインで確認できます。
エラーで終了したすべてのスパンは、スパンエラー数にカウントされます。
同じスパンで複数のエラーが発生した場合、優先順位に従って1つだけがスパンに書き込まれます。
- A
noticeError
- そのスパンの範囲内での直近のスパンエラー
この表では、さまざまなスパンエラーの処理方法について説明します。
エラーの種類
説明
エラーで終わるスパン
スパンの境界を越えたエラーは、エラーが捕捉されるかトランザクションを終了するまで、そのスパンと、同じくエラーで終了するすべての祖先スパンでエラーが発生します。エラーが捕捉されるかトランザクションが終了するまで、そのスパンとエラーで終了する先祖のスパンでエラーが発生します。
通知エラー
エージェント
noticeError
APIの呼び出しまたは自動エージェントインストルメンテーションによって通知されたエラーは、現在実行中のスパンに付加されます。レスポンスコードエラー
レスポンスコードのエラーは、次のように関連するスパンに付けられます。
クライアントスパン:プレフィックスが
http
またはdb
の外部トランザクション。エントリースパン。レスポンスコードエラーで終わるトランザクションの場合。
これらのスパンの応答コードは、属性
http.statusCode
としてキャプチャされ、そのスパンにアタッチされます。
OpenTelemetryのエラー
右側のペインの[エラーの詳細]ボックスには、
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 という 単語が表示されます。
![Screenshot showing how to locate a fragmented trace Screenshot showing how to locate a fragmented trace](/static/distributed-tracing_screenshot-crop_fragmented-trace-cec855c49461907254ec5ebc0073666a.webp)
UI に示される孤立したスパン プロパティのタイプ:
ルートのスパンがない。 リクエストの最初の操作であるルートのスパンがない。この場合、最も古いタイムスタンプを持つスパンがルートとして表示されます。
孤児のスパン。 親スパンが存在しない単一のスパン。これは、親のスパンが子のスパンと一致しないIDを持っていることが原因と考えられます。
Orphaned trace fragment. グループ内の最初のスパンがオーファンスパンである連結スパンのグループ。
これには以下のような理由があります。
収集の限界。 高スループットのアプリケーションの中には、収集の限界を超えるものがあります(例えば、 APM エージェントの収集の限界 、または API の限界)。このような場合、トレースのスパンが不足することがあります。この問題を解決する1つの方法は、一部のレポートをオフにして、制限に達しないようにすることです。
インスツルメンテーションが正しく行われていない。 アプリケーションのインスツルメンテーションが正しく行われていないと、トレースコンテキストを正しく渡すことができず、その結果、トレースが断片的になります。この問題を解決するには、オーファンスパンを生成しているデータソースを調べ、インスツルメンテーションが正しく行われていることを確認します。スパンのデータソースを確認するには、そのデータソースを選択し、スパンの詳細を確認します。
Spans still arriving 。一部の親スパンがまだ収集されていない場合、トレース全体が報告されるまで一時的なギャップが生じる可能性があります。
UI display limits.(UI 表示の制限。) トレースが 10K スパンの表示制限を超えると、孤立したスパンが発生する可能性があります。
保存されたトレースは、元のトレースのスナップショットに似ています。以前に表示され、保存期間を過ぎた完全なトレースがアーカイブされます。延長保存を購入していない限り、完全なトレースは 7 日間のみ利用できます (これは UI に自動的に反映されます)。ただし、保存されたトレースは最長 1 年間存在し、通常は元のトレースと同様に機能します。
保存されたトレースには、スパン パフォーマンス データやスパン異常データは表示されないことに注意してください。保存されたトレース内のエンティティが削除されたり、有効期限が切れたり、データのレポートが停止されたりすると、保存されたトレースにアクセスできなくなる可能性があります。
![Screenshot showing how to locate a preserved trace Screenshot showing how to locate a preserved trace](/static/distributed-tracing_screenshot-crop_preserved-trace-74af2823652058607c709f0925ad45f4.webp)
他のサービスを監視する New Relic アカウントにアクセスできない場合、スパンやサービスの詳細の一部が UI で難読化されます。難読化には以下のようなものがあります。
アスタリスクで隠されたスパン名
サービス名をNew RelicのアカウントIDとアプリIDに変更
アカウントへのアクセスに影響する要因については、 アカウントへのアクセス をご参照ください。
言語エージェント: アダプティブ サンプリング を参照してください。
スパンの滝を表示する際、スパン名が完全なスパン名よりも人間が読みやすい不完全な形で表示されている場合があります。完全な名前を見つけるには、そのスパンを選択して、 Full span name を探してください。完全な名前を知ることは、そのデータを NRQL でクエリする際に有益です。
トレースには、時々、不足しているスパンやサービスがある(またはあるように見える)場合があります。これは、 trace list で表示されるトレースのスパンやサービスの数と、 trace details のページで表示される数との間の不一致として現れます。
スパンの欠落やカウントの不一致の理由は以下の通りです。
これらの UI ツールに加えて、「 分散トレース データのクエリ」で NRQL クエリの例を確認することもできます。