Docs » Splunk APMでサービス、スパン、トレースを管理する » Splunk APMでエラースパンを分析する

Splunk APMでエラースパンを分析する 🔗

Splunk APMのエラー検出機能を使用して、システムやアプリケーションの具体的なエラー原因を特定できます。

How Splunk APM detects error spans 🔗

Each span in Splunk APM captures a single operation. Splunk APM considers a span to be an error span if the operation that the span captures results in an error as defined by the following conditions:

  • スパンの otel.status_code フィールドが ERROR である場合。 otel.status_code は、Splunk Distribution of the OpenTelemetryのインストルメンテーションで、ネイティブのOTel フィールド span.status を使って設定されます。 span.status と、それにしたがって otel.status_code は、HTTPステータスコードまたはgRPCステータスコードに基づいて設定されます。

  • スパンの error タグが真値( False または 0 以外の値)に設定されている場合。

otel.status_code の詳細は、GitHubの「OpenTelemetryの非OTLP形式への変換」の仕様の「スパンステータス」セクション( https://opentelemetry.io/docs/specs/otel/common/mapping-to-non-otlp/#span-status )を参照してください。span.status の詳細は、GitHubの「OpenTelemetryのトレースAPI仕様」の「ステータスの設定」セクション( https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#set-status )を参照してください。

OpenTelemetryによるHTTPステータスコードの処理方法 🔗

The following table provides an overview of how HTTP status codes are used to set the span.status field, and subsequently otel.status_code, in OpenTelemetry instrumentation in accordance with OpenTelemetry semantic conventions. To learn more, see the OpenTelemetry semantic conventions for HTTP spans on GitHub https://github.com/open-telemetry/semantic-conventions/blob/main/model/http/spans.yaml.

エラータイプ

サーバー側のスパン span.kind = SERVER

クライアント側のスパン span.kind = CLIENT

1xx2xx3xx

スパンに別のエラーがない限り、otel.status_code は未設定。

スパンに別のエラーがない限り、otel.status_code は未設定。

4xx

サーバー側のエラーとはみなされない。otel.status_code は未設定。詳細は 4xxステータスコードをエラーとしてカウントする を参照してください。

クライアントのエラーとしてカウント。otel.status_codeERROR に設定。

5xx

otel.status_codeERROR に設定。詳細は エラーロジックをカスタマイズして5xxステータスコードを破棄する を参照してください。

otel.status_codeERROR に設定。詳細は エラーロジックをカスタマイズして5xxステータスコードを破棄する を参照してください。

OpenTelemetryによるgRPCステータスコードの処理方法 🔗

gRPCスパンがサービスのエラー率にカウントされるかどうかを判断するために、Splunk APMはOpenTelemetryのインストルメンテーションによって設定された otel.status_code フィールドを調べます。以下のロジックが、OpenTelemetryのセマンティック規約に従ってインストルメンテーションにより適用されます:

コード

ステータス

サーバー側のスパン span.kind = SERVER

クライアント側のスパン span.kind = CLIENT

0

OK

未設定

未設定

1

CANCELLED

未設定

エラー

2

UNKNOWN

エラー

エラー

3

INVALID_ARGUMENT

未設定

エラー

4

DEADLINE_EXCEEDED

エラー

エラー

5

NOT_FOUND

未設定

エラー

6

ALREADY_EXISTS

未設定

エラー

7

PERMISSION_DENIED

未設定

エラー

8

RESOURCE_EXHAUSTED

未設定

エラー

9

FAILED_PRECONDITION

未設定

エラー

10

ABORTED

未設定

エラー

11

OUT_OF_RANGE

未設定

エラー

12

UNIMPLEMENTED

エラー

エラー

13

INTERNAL

エラー

エラー

14

UNAVAILABLE

エラー

エラー

15

DATA_LOSS

エラー

エラー

16

UNAUTHENTICATED

未設定

エラー

See the OpenTelemetry specification for information on the handling of gRPC status codes on GitHub https://github.com/open-telemetry/semantic-conventions/blob/main/model/rpc/spans.yaml.

MetricSetでのエラースパンのカウント方法 🔗

エンドポイントレベルのMonitoring MetricSetsを生成するために、Splunk APMはエンドポイントスパン( span.kind = SERVER または span.kind = CONSUMER のスパン)をエラーメトリクスデータに変換します。スパンがSplunk APMのエラールールによってエラーとみなされた場合、そのスパンは、そのスパンに関連するエンドポイントのMonitoring MetricSetのエラーとしてカウントされます。

サービスレベルのMonitoring MetricSetsは、サービスの各エンドポイントのエラースパンの数に基づいています。

サーバー側とクライアント側のエラーカウント 🔗

Splunk APMは、クライアント側のスパンと呼ばれるクライアントへのリクエストをキャプチャするスパンや、サーバー側のスパンと呼ばれるサービスが受信したリクエストなど、インストルメントされたすべてのサービスからのすべてのスパンをキャプチャします。特定のケースでは、サービスがエラーを返すと、開始スパンと受信スパンの両方にエラーが登録されることがあります。エラーレポートの重複を避けるため、Splunk APMはサーバー側のエラースパンのみをMetricSetsとエラー合計にカウントします。

たとえば、service_aservice_b にコールし、両方のサービスが完全にインストルメントされている場合、Splunk APMは以下の2つのスパンを受信します:

  • span_1service_b へのコールを行う service_a をキャプチャする span.kind = CLIENT のスパン。

  • span_2。リクエストを受信する service_b をキャプチャする span.kind = SERVER のスパン。

service_b500 エラーを返した場合、両方のスパンがそのエラーを受信します。エラーの二重カウントを避けるため、Splunk APMはサーバー側のスパン( span_2 )のみをMetricSetsおよびエラー合計にエラーとしてカウントします。

エラーと根本原因エラーの違い 🔗

エラーの根本原因を特定するために、Splunk APMはエラーと根本原因エラーを区別します。たとえば、Tag Spotlightのリクエストとエラーのグラフでは、濃い色を付けてエラー合計から根本原因エラーを区別します:

このスクリーンショットは、Tag Spotlightのpaymenterviceのリクエストとエラーのグラフです。グラフ上でエラー合計は薄いピンク色の領域のプロット、根本原因エラーは濃いピンク色になっています。

トレース内の特定のスパンでエラーが発生した場合、そのエラーはトレース内の他のスパンに伝搬する可能性があります。How Splunk APM detects error spans に記載されている基準に基づいてエラーを含むと判断されたスパンは、すべてエラースパンとなります。Splunk APMは、エラースパンの連鎖の起点となるエラーを 根本原因エラー として指定します。

例えば、次のスクリーンショットでcheckoutのトレースについて考えてみましょう:

このスクリーンショットは、Splunk APMのトレースビューの例を示しています。

checkout サービスは、authorization サービス、 checkout サービス、および payment サービスにHTTPリクエストを行っています。 payment サービスへのHTTPリクエストの結果、402 「Payment Required」というエラーが発生しています。 payment サービスへのリクエストが失敗したため、 checkout サービスへの開始リクエストと http.Request もエラーになります。

この場合、ソースエラー、つまり根本原因エラーは、payment サービス内の 402 エラーです。checkout および api のサービスに現れる 500 のエラーは、その結果として生じたエラーです。

根本原因エラーカウントは、これらの根本原因エラーのカウントを示し、標準のエラーカウントは、すべての根本原因エラーおよび後続エラーの合計カウントを示します。

Splunk APMでエラーロジックをカスタマイズする 🔗

一部のケースでは、エラーロジックのデフォルトをオーバーライドするようにインストルメンテーションを変更したり、自分にとって重要なエラーを追跡するための別の方法を考案したりする方が良い場合もあります。

4xxステータスコードをエラーとしてカウントする 🔗

デフォルトでは、Splunk APMは、4xx ステータスコードを持つサーバー側のスパンをエラーとしてカウントしません。4xx ステータスコードは、リクエストを処理するサービスの問題に関連するというよりも、リクエスト自体の問題に関連する場合が多いからです。

For example, if a user makes a request to endpoint/that/does/not/exist, the 404 status code the service returns does not mean there’s a problem with the service. Instead, it means there was a problem with the request, which is trying to call an endpoint that doesn’t exist. Similarly, if a user tries to access a resource they don’t have access to, the service might return a 401 status code, which is typically not the result of an error on the server side.

However, depending on your application’s logic, a 4xx status code might represent a meaningful error, particularly for client-side requests. To monitor for 4xx errors, try doing the following:

  • 利用可能な場合は、HTTPステータスコードのスパンタグごとにパフォーマンスを分析する。

  • インストルメンテーションをカスタマイズして、意味のある 4xx ステータスコードを持つスパンの span.statusError に設定する。

例えば、Kaiがあるサービスから返される 401 エラーの割合についてアラートを出したい場合は、次の手順を実行します:

  1. Index http.status_code in libraries that support OpenTelemetry semantic conventions version 1.16.0 or lower. Or index http.response.status_code in libraries that support OpenTelemetry semantic conventions version 1.17.0 or higher. See Index span tags to create Troubleshooting MetricSets.

  2. Create a custom Monitoring MetricSet on the status code tag for the service’s endpoints to get a time series for each status code. See Create a Monitoring MetricSet with a custom dimension.

  3. 全リクエスト数と比較した 401 のエラー率に関するアラートを設定する。Splunk APMでディテクターとアラートを設定する を参照してください。

エラーロジックをカスタマイズして5xxステータスコードを破棄する 🔗

デフォルトでは、Splunk APMは 5xx のステータスコードを持つサーバー側のスパンをエラーとしてカウントします。 5xx のエラーは一般的にサービスの利用不可の状況に関連するためです。

例えば、サーバー側のスパンにおける 503 「service too busy」のエラーは、デフォルトでエラーとしてカウントされます。監視しているサービスが公開ウェブサイトのフロントエンドである場合、 503 のエラーに遭遇したユーザーはウェブサイトを利用することができず、ユーザーインタラクションの損失や収益の損失につながります。この場合、 503 は真のエラーです。

しかし、アプリケーションのロジックによっては、5xx コードを意味のあるエラーと考えない可能性もあります。例えば、サービスがバッチプロセッサーである場合、503 のエラーは正常なフロー制御メカニズムで、後でのクライアントによるプロセスの再試行をトリガーするものである可能性があります。503 ステータスコードをエラーとしてカウントするデフォルト設定をオーバーライドするには、503 エラーが問題にならないスパンでは span.statusOK に設定するようにインストルメンテーションを修正することができます。

This page was last updated on 2024年11月01日.