OpenTelemetry 指标(Metrics)

gRPC 中可用的 OpenTelemetry 指标

概述

gRPC 提供对 OpenTelemetry 插件的支持,提供了有助于:

  • 排查系统问题

  • 优化系统性能

  • 设置持续监控和报警

背景

OpenTelemetry 是一个观察性框架,用于创建和管理遥测数据。gRPC 以前通过 OpenCensus 提供观察性支持,但现在已 弃用,并转而支持 OpenTelemetry。

仪器(Instruments)

gRPC OpenTelemetry 插件接受 MeterProvider,并依赖 OpenTelemetry API 创建一个 Meter,用于标识所使用的 gRPC 库,例如 grpc-c++ 版本 1.57.1。以下列出了一些通过此 Meter 创建的仪器。用户可以使用 OpenTelemetry SDK 自定义 OpenTelemetry 导出的视图。

越来越多的 gRPC 组件正在进行观察性仪器化。目前,已对以下组件进行了仪器化:

  • 每个调用(稳定,默认启用):观察 RPC 本身(例如,延迟)。

    • 客户端每次调用:观察客户端调用

    • 客户端每次尝试:观察客户端调用的尝试,因为一次调用可能会由于重试或竞态条件有多次尝试。

    • 服务器:观察接收到的服务器调用。

  • 负载均衡策略:观察各种负载均衡策略:

    • 加权轮询(实验性)

    • 优先选择(实验性)

  • XdsClient(实验性)

某些仪器默认关闭,需要从 gRPC OpenTelemetry 插件 API 明确启用。实验性指标始终默认关闭。( 参考 C++ API

每个调用指标(Per-Call Metrics)

客户端每个调用仪器(Client Per-Call Instruments)

名称 类型 单位 标签(必需) 描述

grpc.client.call.duration

Histogram

grpc.method, grpc.target, grpc.status

此指标旨在度量从应用程序的角度,gRPC 库完成 RPC 所需的端到端时间。

参考 A66: OpenTelemetry Metrics 了解详情。

客户端每次尝试仪器(Client Per-Attempt Instruments)

名称 类型 单位 标签(处理方式) 描述

grpc.client.attempt.started

Counter

{attempt}

grpc.method (required),grpc.target (required)

启动的 RPC 尝试总数,包括那些尚未完成的。

grpc.client.attempt.duration

Histogram

s

grpc.method (required), grpc.target (required), grpc.status (required), grpc.lb.locality (optional)

完成 RPC 尝试的端到端时间,包括选择子通道的时间。

grpc.client.attempt.sent_total_compressed_message_size

Histogram

By

grpc.method (required), grpc.target (required), grpc.status (required), grpc.lb.locality (optional)

每次 RPC 尝试发送的所有请求消息的压缩字节总数(不包括元数据)。

grpc.client.attempt.rcvd_total_compressed_message_size

Histogram

By

grpc.method (required), grpc.target (required), grpc.status (required), grpc.lb.locality (optional)

每次 RPC 尝试接收的所有响应消息的压缩字节总数(不包括元数据)。

参考 A66: OpenTelemetry Metrics 了解详情。

服务器仪器(Server Instruments)

名称 类型 单位 标签(必需) 描述

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 Policy Instruments)

加权轮询 LB 策略仪器(Weighted Round Robin LB Policy Instruments)

名称 类型 单位 标签(处理方式) 描述

grpc.lb.wrr. rr_fallback

Counter

{update}

grpc.target (required), grpc.lb.locality (optional)

grpc.lb.wrr. endpoint_weight_not_yet_usable

Counter

{endpoint}

grpc.target (required), grpc.lb.locality (optional)

grpc.lb.wrr. endpoint_weight_stale

Counter

{endpoint}

grpc.target (required), grpc.lb.locality (optional)

grpc.lb.wrr. endpoint_weights

Histogram

{weight}

grpc.target (required), grpc.lb.locality (optional)

优先选择 LB 策略仪器(Pick First LB Policy Instruments)

名称 类型 单位 标签(处理方式) 描述

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

XdsClient 仪器(XdsClient Instruments)

名称 类型 单位 标签(处理方式) 描述

grpc.xds_client. connected

Gauge

{bool}

grpc.target, grpc.xds.server

grpc.xds_client. server_failure

Counter

{failure}

grpc.target, grpc.xds.server

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

参考 A78: gRPC OTel Metrics for WRR, Pick First, and XdsClient 了解详情。

标签/属性(Labels/Attributes)

在仪器记录测量时,gRPC 可能会提供一些附加信息作为属性或标签。例如,grpc.client.attempt.started 具有 grpc.methodgrpc.target 标签,这些标签与正在观察的 RPC 尝试相关。

某些属性在仪器上标记为可选,需要从 gRPC OpenTelemetry 插件 API 显式启用。( 参考 C++ API

名称 描述

grpc.method

完整的 gRPC 方法名称,包括包、服务和

方法,例如 “google.bigtable.v2.Bigtable/CheckAndMutateRow”。

grpc.status

接收到的 gRPC 服务器状态码,例如 “OK”、“CANCELLED”、“DEADLINE_EXCEEDED”。

grpc.target

创建 gRPC Channel 时使用的规范化目标 URI,例如“dns:///pubsub.googleapis.com:443”, “xds:///helloworld-gke:8000”。

grpc.lb.locality

发送流量的局部性。

grpc.xds.server

对于客户端,指示使用 XdsClient 的 gRPC 通道目标;对于服务器,字符串为“#server”。

grpc.xds.authority

xDS 权限,旧版资源名称的值为“#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”。

常见问题(FAQ)

问:如何获取吞吐量或 QPS(每秒查询数)?

使用延迟直方图指标进行计数聚合:grpc.client.attempt.duration / grpc.client.call.duration(对于客户端)或 grpc.server.call.duration(对于服务器)。

问:如何计算 RPC 的错误率?

可以通过在延迟直方图指标 grpc.client.attempt.duration / grpc.client.call.duration(对于客户端)或 grpc.server.call.duration(对于服务器)上使用过滤器 grpc.status != OK 来计算错误计数。

语言示例(Language Examples)

语言 示例

C++

C++ 示例

Go

Go 示例

Java

Java 示例

Python

Python 示例