OpenTelemetryメトリクス

gRPCで利用可能なOpenTelemetry Metrics

OpenTelemetryメトリクス

gRPCで利用可能なOpenTelemetry Metrics

概要

gRPCは、システムトラブルシューティング、システムパフォーマンスの改善、継続的な監視とアラートの設定に役立つメトリクスを提供するOpenTelemetryプラグインをサポートしています。

  • システムをトラブルシューティングする
  • システムパフォーマンスの改善を反復する
  • 継続的な監視とアラートを設定する。

背景

OpenTelemetryは、テレメトリデータを作成および管理するためのオブザーバビリティフレームワークです。gRPCは以前、OpenCensusを通じてオブザーバビリティサポートを提供していましたが、これはOpenTelemetryを支持して廃止されました。

インストゥルメント

gRPC OpenTelemetryプラグインは、MeterProviderを受け入れ、OpenTelemetry APIに依存して、使用されているgRPCライブラリ(例:バージョン1.57.1grpc-c++)を識別するMeterを作成します。以下にリストされているインストゥルメントは、このメーターを使用して作成されます。ユーザーは、OpenTelemetryによってエクスポートされるビューをカスタマイズするために、OpenTelemetry SDKを使用する必要があります。

オブザーバビリティのためにinstrumentされているgRPCコンポーネントが増えています。現在、以下のコンポーネントがinstrumentされています。

  • 呼び出しごと:RPC自体を観測します(例:レイテンシ)。
    • クライアントの呼び出しごと(安定、デフォルトでオン):クライアントの呼び出しを観測します。
    • クライアントの試行ごと(安定、デフォルトでオン):クライアントの呼び出しの試行を観測します。呼び出しはリトライまたはヘッジングにより複数の試行を持つことができます。
    • クライアントの呼び出しごとのリトライ(実験的):リトライ、透過的リトライ、ヘッジングを観測します。
    • サーバー:サーバーで受信した呼び出しを観測します。
  • LBポリシー:さまざまなロードバランシングポリシーを観測します。
    • 加重ラウンドロビン(実験的)
    • Pick-First(実験的)
  • XdsClient(実験的)

一部のインストゥルメントはデフォルトでオフになっており、gRPC OpenTelemetryプラグインAPIから明示的に有効にする必要があります。実験的なメトリクスは常にデフォルトでオフです。(C++ API参照

呼び出しごとのメトリクス

クライアントの呼び出しごとのインストゥルメント

名前タイプ単位ラベル(必須)説明
grpc.client.call.durationHistogramsgrpc.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
Histogramsgrpc.method (必須), grpc.target (必須), grpc.status (必須), grpc.lb.locality (オプション), grpc.lb.backend_service (オプション)サブチャネルの選択にかかる時間を含む、RPC試行の完了にかかったエンドツーエンドの時間。
grpc.client.attempt.
sent_total_compressed_message_size
HistogramBygrpc.method (必須), grpc.target (必須), grpc.status (必須), grpc.lb.locality (オプション), grpc.lb.backend_service (オプション)RPC試行ごとの、すべてのリクエストメッセージ(メタデータを除く)で送受信された(圧縮済みだが暗号化されていない)合計バイト数。gRPCまたはトランスポートのフレーミングバイトは含まれません。
grpc.client.attempt.
rcvd_total_compressed_message_size
HistogramBygrpc.method (必須), grpc.target (必須), grpc.status (必須), grpc.lb.locality (オプション), grpc.lb.backend_service (オプション)RPC試行ごとの、すべてのレスポンスメッセージ(メタデータを除く)で送受信された(圧縮済みだが暗号化されていない)合計バイト数。gRPCまたはトランスポートのフレーミングバイトは含まれません。

詳細については、A66: OpenTelemetry Metricsを参照してください。

クライアントの呼び出しごとのリトライインストゥルメント

名前タイプ単位ラベル(必須)説明
grpc.client.call.retriesHistogram{retry}grpc.method, grpc.targetクライアントの呼び出し中に発生したリトライの数。リトライがなかった場合、0は報告されません。
grpc.client.call.transparent_retriesHistogram{transparent_retry}grpc.method, grpc.targetクライアントの呼び出し中に発生した透過的リトライの数。透過的リトライがなかった場合、0は報告されません。
grpc.client.call.hedgesHistogram{hedge}grpc.method, grpc.targetクライアントの呼び出し中に発生したヘッジの数。ヘッジがなかった場合、0は報告されません。
grpc.client.call.retry_delayHistogramsgrpc.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
HistogramBygrpc.method, grpc.statusRPCごとの、すべてのレスポンスメッセージ(メタデータを除く)で送受信された(圧縮済みだが暗号化されていない)合計バイト数。gRPCまたはトランスポートのフレーミングバイトは含まれません。
grpc.server.call.
rcvd_total_compressed_message_size
HistogramBygrpc.method, grpc.statusRPCごとの、すべてのリクエストメッセージ(メタデータを除く)で送受信された(圧縮済みだが暗号化されていない)合計バイト数。gRPCまたはトランスポートのフレーミングバイトは含まれません。
grpc.server.call.
duration
Histogramsgrpc.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.methodgrpc.targetとともに、各測定値が記録されます。

一部の属性はインストゥルメントでオプションとしてマークされています。これらはgRPC OpenTelemetryプラグインAPIから明示的に有効にする必要があります。(C++ API参照

名前説明
grpc.methodパッケージ、サービス、メソッドを含む完全なgRPCメソッド名。例:「google.bigtable.v2.Bigtable/CheckAndMutateRow」。
grpc.status受信したgRPCサーバーのステータスコード。例:「OK」、「CANCELLED」、「DEADLINE_EXCEEDED」。
grpc.targetgRPCチャネルの作成時に使用される正規化されたターゲット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.authorityxDSの権限。値は、古いスタイルの非xdstpリソース名の場合は「#old」になります。
grpc.xds.cache_statexDSリソースのキャッシュ状態を示します(「requested」、「does_not_exist」、「acked」、「nacked」、「nacked_but_cached」)。
grpc.xds.resource_typexDSリソースタイプ。例:「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++ 例
GoGo 例
JavaJava 例
PythonPython 例

追加リソース