OpenTelemetryメトリクス
gRPCで利用可能なOpenTelemetry Metrics
OpenTelemetryメトリクス
概要
gRPCは、システムトラブルシューティング、システムパフォーマンスの改善、継続的な監視とアラートの設定に役立つメトリクスを提供するOpenTelemetryプラグインをサポートしています。
- システムをトラブルシューティングする
- システムパフォーマンスの改善を反復する
- 継続的な監視とアラートを設定する。
背景
OpenTelemetryは、テレメトリデータを作成および管理するためのオブザーバビリティフレームワークです。gRPCは以前、OpenCensusを通じてオブザーバビリティサポートを提供していましたが、これはOpenTelemetryを支持して廃止されました。
インストゥルメント
gRPC OpenTelemetryプラグインは、MeterProviderを受け入れ、OpenTelemetry APIに依存して、使用されているgRPCライブラリ(例:バージョン1.57.1のgrpc-c++)を識別するMeterを作成します。以下にリストされているインストゥルメントは、このメーターを使用して作成されます。ユーザーは、OpenTelemetryによってエクスポートされるビューをカスタマイズするために、OpenTelemetry SDKを使用する必要があります。
オブザーバビリティのためにinstrumentされているgRPCコンポーネントが増えています。現在、以下のコンポーネントがinstrumentされています。
- 呼び出しごと:RPC自体を観測します(例:レイテンシ)。
- クライアントの呼び出しごと(安定、デフォルトでオン):クライアントの呼び出しを観測します。
- クライアントの試行ごと(安定、デフォルトでオン):クライアントの呼び出しの試行を観測します。呼び出しはリトライまたはヘッジングにより複数の試行を持つことができます。
- クライアントの呼び出しごとのリトライ(実験的):リトライ、透過的リトライ、ヘッジングを観測します。
- サーバー:サーバーで受信した呼び出しを観測します。
- LBポリシー:さまざまなロードバランシングポリシーを観測します。
- 加重ラウンドロビン(実験的)
- Pick-First(実験的)
- XdsClient(実験的)
注一部のインストゥルメントはデフォルトでオフになっており、gRPC OpenTelemetryプラグインAPIから明示的に有効にする必要があります。実験的なメトリクスは常にデフォルトでオフです。(C++ API参照)
呼び出しごとのメトリクス
クライアントの呼び出しごとのインストゥルメント
| 名前 | タイプ | 単位 | ラベル(必須) | 説明 |
|---|---|---|---|---|
| grpc.client.call.duration | Histogram | s | grpc.method, grpc.target , grpc.status | このメトリクスは、アプリケーションの観点からgRPCライブラリがRPCを完了するのにかかるエンドツーエンドの時間を測定することを目的としています。 |
詳細については、A66: OpenTelemetry Metricsを参照してください。
クライアントの試行ごとのインストゥルメント
| 名前 | タイプ | 単位 | ラベル(処置) | 説明 |
|---|---|---|---|---|
| grpc.client.attempt. started | Counter | {attempt} | grpc.method (必須), grpc.target (必須) | 完了していないものを含む、開始されたRPC試行の総数。 |
| grpc.client.attempt. duration | Histogram | s | grpc.method (必須), grpc.target (必須), grpc.status (必須), grpc.lb.locality (オプション), grpc.lb.backend_service (オプション) | サブチャネルの選択にかかる時間を含む、RPC試行の完了にかかったエンドツーエンドの時間。 |
| grpc.client.attempt. sent_total_compressed_message_size | Histogram | By | grpc.method (必須), grpc.target (必須), grpc.status (必須), grpc.lb.locality (オプション), grpc.lb.backend_service (オプション) | RPC試行ごとの、すべてのリクエストメッセージ(メタデータを除く)で送受信された(圧縮済みだが暗号化されていない)合計バイト数。gRPCまたはトランスポートのフレーミングバイトは含まれません。 |
| grpc.client.attempt. rcvd_total_compressed_message_size | Histogram | By | grpc.method (必須), grpc.target (必須), grpc.status (必須), grpc.lb.locality (オプション), grpc.lb.backend_service (オプション) | RPC試行ごとの、すべてのレスポンスメッセージ(メタデータを除く)で送受信された(圧縮済みだが暗号化されていない)合計バイト数。gRPCまたはトランスポートのフレーミングバイトは含まれません。 |
詳細については、A66: OpenTelemetry Metricsを参照してください。
クライアントの呼び出しごとのリトライインストゥルメント
| 名前 | タイプ | 単位 | ラベル(必須) | 説明 |
|---|---|---|---|---|
| grpc.client.call.retries | Histogram | {retry} | grpc.method, grpc.target | クライアントの呼び出し中に発生したリトライの数。リトライがなかった場合、0は報告されません。 |
| grpc.client.call.transparent_retries | Histogram | {transparent_retry} | grpc.method, grpc.target | クライアントの呼び出し中に発生した透過的リトライの数。透過的リトライがなかった場合、0は報告されません。 |
| grpc.client.call.hedges | Histogram | {hedge} | grpc.method, grpc.target | クライアントの呼び出し中に発生したヘッジの数。ヘッジがなかった場合、0は報告されません。 |
| grpc.client.call.retry_delay | Histogram | s | grpc.method, grpc.target | クライアントの呼び出し中にアクティブな試行がない間に発生した遅延の合計時間。 |
詳細については、A96: OTel Metrics for Retriesを参照してください。
サーバーのインストゥルメント
| 名前 | タイプ | 単位 | ラベル(必須) | 説明 |
|---|---|---|---|---|
| grpc.server.call. started | Counter | {call} | grpc.method | 完了していないものを含む、開始されたRPCの総数。 |
| grpc.server.call. sent_total_compressed_message_size | Histogram | By | grpc.method, grpc.status | RPCごとの、すべてのレスポンスメッセージ(メタデータを除く)で送受信された(圧縮済みだが暗号化されていない)合計バイト数。gRPCまたはトランスポートのフレーミングバイトは含まれません。 |
| grpc.server.call. rcvd_total_compressed_message_size | Histogram | By | grpc.method, grpc.status | RPCごとの、すべてのリクエストメッセージ(メタデータを除く)で送受信された(圧縮済みだが暗号化されていない)合計バイト数。gRPCまたはトランスポートのフレーミングバイトは含まれません。 |
| grpc.server.call. duration | Histogram | s | grpc.method, grpc.status | このメトリクスは、サーバーのトランスポート(HTTP2/inproc)の観点からRPCにかかるエンドツーエンドの時間を測定することを目的としています。 |
詳細については、A66: OpenTelemetry Metricsを参照してください。
LBポリシーのインストゥルメント
加重ラウンドロビンLBポリシーのインストゥルメント
| 名前 | タイプ | 単位 | ラベル(処置) | 説明 |
|---|---|---|---|---|
| grpc.lb.wrr. rr_fallback | Counter | {update} | grpc.target (必須), grpc.lb.locality (オプション), grpc.lb.backend_service (オプション) | 実験的:有効な重みを持つエンドポイントが不足していたため、WRRポリシーがRR動作にフォールバックしたスケジューラ更新の数。 |
| grpc.lb.wrr. endpoint_weight_not_yet_usable | Counter | {endpoint} | grpc.target (必須), grpc.lb.locality (オプション), grpc.lb.backend_service (オプション) | 実験的:各スケジューラ更新からのエンドポイントで、まだ使用可能な重み情報を持っていないもの(つまり、ロードレポートがまだ受信されていないか、ブラックアウト期間内である)の数。 |
| grpc.lb.wrr. endpoint_weight_stale | Counter | {endpoint} | grpc.target (必須), grpc.lb.locality (オプション), grpc.lb.backend_service (オプション) | 実験的:各スケジューラ更新からのエンドポイントで、最新の重みが有効期限より古いもの。 |
| grpc.lb.wrr. endpoint_weights | Histogram | {weight} | grpc.target (必須), grpc.lb.locality (オプション), grpc.lb.backend_service (オプション) | 実験的:スケジューラ更新ごとに記録されるエンドポイントの重み。 |
詳細については、A78: gRPC OTel Metrics for WRR, Pick First, and XdsClientを参照してください。
Pick First LBポリシーのインストゥルメント
| 名前 | タイプ | 単位 | ラベル(必須) | 説明 |
|---|---|---|---|---|
| grpc.lb.pick_first. disconnections | Counter | {disconnection} | grpc.target | 実験的:選択されたサブチャネルが切断された回数。 |
| grpc.lb.pick_first. connection_attempts_succeeded | Counter | {attempt} | grpc.target | 実験的:成功した接続試行の数。 |
| grpc.lb.pick_first. connection_attempts_failed | Counter | {attempt} | grpc.target | 実験的:失敗した接続試行の数。 |
詳細については、A78: gRPC OTel Metrics for WRR, Pick First, and XdsClientを参照してください。
XdsClientのインストゥルメント
| 名前 | タイプ | 単位 | ラベル(必須) | 説明 |
|---|---|---|---|---|
| grpc.xds_client. connected | Gauge | {bool} | grpc.target, grpc.xds.server | 実験的:xDSクライアントが現在xDSサーバーとの有効なADSストリームを持っているかどうか。 |
| grpc.xds_client. server_failure | Counter | {failure} | grpc.target, grpc.xds.server | 実験的:正常から異常になったxDSサーバーのカウンター。 |
| grpc.xds_client. resource_updates_valid | Counter | {resource} | grpc.target, grpc.xds.server, grpc.xds.resource_type | 実験的:有効と見なされたリソースのカウンター(変更がない場合も含む)。 |
| grpc.xds_client. resource_updates_invalid | Counter | {resource} | grpc.target, grpc.xds.server, grpc.xds.resource_type | 実験的:無効と見なされたリソースのカウンター。 |
| grpc.xds_client. resources | Gauge | {resource} | grpc.target, grpc.xds.authority, grpc.xds.cache_state, grpc.xds.resource_type | 実験的:xDSリソースの数。 |
詳細については、A78: gRPC OTel Metrics for WRR, Pick First, and XdsClientを参照してください。
ラベル/属性
インストゥルメントに測定値が記録されると、gRPCは属性またはラベルとして追加情報を提供する場合があります。たとえば、grpc.client.attempt.startedには、観測されているRPC試行に関連するメソッドとターゲットを示すラベルgrpc.methodとgrpc.targetとともに、各測定値が記録されます。
注 一部の属性はインストゥルメントでオプションとしてマークされています。これらはgRPC OpenTelemetryプラグインAPIから明示的に有効にする必要があります。(C++ API参照)
| 名前 | 説明 |
|---|---|
| grpc.method | パッケージ、サービス、メソッドを含む完全なgRPCメソッド名。例:「google.bigtable.v2.Bigtable/CheckAndMutateRow」。 |
| grpc.status | 受信したgRPCサーバーのステータスコード。例:「OK」、「CANCELLED」、「DEADLINE_EXCEEDED」。 |
| grpc.target | gRPCチャネルの作成時に使用される正規化されたターゲットURI。例:「dns:///pubsub.googleapis.com:443」、「xds:///helloworld-gke:8000」。 |
| grpc.lb.backend_service | トラフィックが送信されているバックエンドサービス。これは、単一チャネルターゲットが異なるサーバーセットに送信される場合に役立ちます。xDSを使用する場合、これはクラスター名になります。関連しない場合は、値は空文字列になります。 |
| grpc.lb.locality | トラフィックが送信されているロケーション。 |
| grpc.xds.server | クライアントの場合、XdsClientが使用されているgRPCチャネルのターゲットを示します。サーバーの場合は、「#server」という文字列になります。 |
| grpc.xds.authority | xDSの権限。値は、古いスタイルの非xdstpリソース名の場合は「#old」になります。 |
| grpc.xds.cache_state | xDSリソースのキャッシュ状態を示します(「requested」、「does_not_exist」、「acked」、「nacked」、「nacked_but_cached」)。 |
| grpc.xds.resource_type | xDSリソースタイプ。例:「envoy.config.listener.v3.Listener」。 |
よくある質問
Q. スループットまたはQPS(秒間クエリ数)を取得するにはどうすればよいですか?
レイテンシヒストグラムメトリクス(クライアントの場合はgrpc.client.attempt.duration / grpc.client.call.duration、サーバーの場合はgrpc.server.call.duration)でカウント集計を使用します。
Q. RPCのエラー率を取得するにはどうすればよいですか?
エラーカウントは、レイテンシヒストグラムメトリクスgrpc.client.attempt.duration / grpc.client.call.duration(クライアントの場合)またはgrpc.server.call.duration(サーバーの場合)で、grpc.status != OKというフィルター値を使用して計算できます。
言語の例
| 言語 | 例 |
|---|---|
| C++ | C++ 例 |
| Go | Go 例 |
| Java | Java 例 |
| Python | Python 例 |