OpenTelemetry 指标

gRPC 中可用的 OpenTelemetry 指标

OpenTelemetry 指标

gRPC 中可用的 OpenTelemetry 指标

概述

gRPC 提供对 OpenTelemetry 插件的支持,该插件提供有助于您以下方面的指标:

  • 排查系统问题
  • 迭代改进系统性能
  • 设置持续监控和警报。

背景

OpenTelemetry 是一个可观测性框架,用于创建和管理遥测数据。gRPC 之前通过 OpenCensus 提供可观测性支持,OpenCensus 已被 弃用,转而支持 OpenTelemetry。

指标项

gRPC OpenTelemetry 插件接受一个 MeterProvider 并依赖于 OpenTelemetry API 来创建一个 Meter,该 Meter 标识正在使用的 gRPC 库,例如版本 1.57.1grpc-c++。以下列出的指标项是使用此 Meter 创建的。用户应使用 OpenTelemetry SDK 来自定义 OpenTelemetry 导出的视图。

越来越多的 gRPC 组件正在进行仪表化以实现可观测性。目前,我们有以下组件已进行仪表化:

  • 按调用(稳定,默认开启):观察 RPC 本身(例如,延迟。)
    • 客户端按调用:观察客户端调用
    • 客户端按尝试:观察客户端调用的尝试,因为一次调用可能由于重试或对冲而有多次尝试。
    • 服务端:观察服务端接收到的调用。
  • 负载均衡策略:观察各种负载均衡策略
    • 加权轮询(实验性)
    • 优先选择(实验性)
  • XdsClient(实验性)

注意 某些指标项默认是关闭的,需要通过 gRPC OpenTelemetry 插件 API 显式开启。实验性指标默认始终关闭。(参考 C++ API

按调用指标

客户端按调用指标项

名称类型单位标签(必需)描述
grpc.client.call.duration直方图sgrpc.method, grpc.target , grpc.status此指标旨在衡量 gRPC 库从应用视角完成一次 RPC 所花费的端到端时间。

有关详情,请参阅 A66: OpenTelemetry 指标

客户端按尝试指标项

名称类型单位标签(处理方式)描述
grpc.client.attempt.
started
计数器{attempt}grpc.method(必需), grpc.target(必需)已开始的 RPC 尝试总数,包括尚未完成的尝试。
grpc.client.attempt.
duration
直方图sgrpc.method(必需), grpc.target(必需), grpc.status(必需), grpc.lb.locality(可选)完成 RPC 尝试所花费的端到端时间,包括选择子通道所花费的时间。
grpc.client.attempt.
sent_total_compressed_message_size
直方图字节grpc.method(必需), grpc.target(必需), grpc.status(必需), grpc.lb.locality(可选)每次 RPC 尝试发送的所有请求消息(不包括元数据)的总字节数(已压缩但未加密);不包括 gRPC 或传输帧字节。
grpc.client.attempt.
rcvd_total_compressed_message_size
直方图字节grpc.method(必需), grpc.target(必需), grpc.status(必需), grpc.lb.locality(可选)每次 RPC 尝试接收的所有响应消息(不包括元数据)的总字节数(已压缩但未加密);不包括 gRPC 或传输帧字节。

有关详情,请参阅 A66: OpenTelemetry 指标

服务端指标项

名称类型单位标签(必需)描述
grpc.server.call.
started
计数器{call}grpc.method已开始的 RPC 总数,包括尚未完成的尝试。
grpc.server.call.
sent_total_compressed_message_size
直方图字节grpc.method, grpc.status每次 RPC 发送的所有响应消息(不包括元数据)的总字节数(已压缩但未加密);不包括 gRPC 或传输帧字节。
grpc.server.call.
rcvd_total_compressed_message_size
直方图字节grpc.method, grpc.status每次 RPC 接收的所有请求消息(不包括元数据)的总字节数(已压缩但未加密);不包括 gRPC 或传输帧字节。
grpc.server.call.
duration
直方图sgrpc.method, grpc.status此指标旨在衡量 RPC 从服务端传输层(HTTP2/进程内)视角所花费的端到端时间。

有关详情,请参阅 A66: OpenTelemetry 指标

负载均衡策略指标项

加权轮询负载均衡策略指标项

名称类型单位标签(处理方式)描述
grpc.lb.wrr.
rr_fallback
计数器{update}grpc.target(必需), grpc.lb.locality(可选)实验性:调度器更新次数,其中没有足够的具有有效权重的端点,导致 WRR 策略回退到 RR 行为。
grpc.lb.wrr.
endpoint_weight_not_yet_usable
计数器{endpoint}grpc.target(必需), grpc.lb.locality(可选)实验性:每次调度器更新中,尚未获得可用权重信息(即,负载报告尚未收到或处于静默期)的端点数量。
grpc.lb.wrr.
endpoint_weight_stale
计数器{endpoint}grpc.target(必需), grpc.lb.locality(可选)实验性:每次调度器更新中,其最新权重早于过期时长的端点数量。
grpc.lb.wrr.
endpoint_weights
直方图{weight}grpc.target(必需), grpc.lb.locality(可选)实验性:每次调度器更新时记录的端点权重。

有关详情,请参阅 A78: gRPC OTel WRR、Pick First 和 XdsClient 指标

优先选择负载均衡策略指标项

名称类型单位标签(必需)描述
grpc.lb.pick_first.
disconnections
计数器{disconnection}grpc.target实验性:所选子通道断开连接的次数。
grpc.lb.pick_first.
connection_attempts_succeeded
计数器{attempt}grpc.target实验性:成功的连接尝试次数。
grpc.lb.pick_first.
connection_attempts_failed
计数器{attempt}grpc.target实验性:失败的连接尝试次数。

有关详情,请参阅 A78: gRPC OTel WRR、Pick First 和 XdsClient 指标

XdsClient 指标项

名称类型单位标签(必需)描述
grpc.xds_client.
connected
测量仪{bool}grpc.target, grpc.xds.server实验性:xDS 客户端当前是否与 xDS 服务器建立工作正常的 ADS 流。
grpc.xds_client.
server_failure
计数器{failure}grpc.target, grpc.xds.server实验性:xDS 服务器从健康变为不健康的计数。
grpc.xds_client.
resource_updates_valid
计数器{resource}grpc.target, grpc.xds.server, grpc.xds.resource_type实验性:接收到的被视为有效的资源计数,即使它们未更改。
grpc.xds_client.
resource_updates_invalid
计数器{resource}grpc.target, grpc.xds.server, grpc.xds.resource_type实验性:接收到的被视为无效的资源计数。
grpc.xds_client.
resources
测量仪{resource}grpc.target, grpc.xds.authority, grpc.xds.cache_state, grpc.xds.resource_type实验性:xDS 资源数量。

有关详情,请参阅 A78: gRPC OTel WRR、Pick First 和 XdsClient 指标

标签/属性

对于指标项的记录测量值,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 Channel 的目标。对于服务器,将是字符串“#server”。
grpc.xds.authorityxDS 授权。对于旧式的非 xdstp 资源名称,该值将为“#old”。
grpc.xds.cache_state指示 xDS 资源的缓存状态(“requested”、“does_not_exist”、“acked”、“nacked”、“nacked_but_cached”)。
grpc.xds.resource_typexDS 资源类型,例如 “envoy.config.listener.v3.Listener”。

常见问题

问:如何获取吞吐量或 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 来计算。

语言示例

语言示例
C++C++ 示例
GoGo 示例
JavaJava 示例
PythonPython 示例

附加资源

最后修改于 2025 年 1 月 24 日:OTel Metrics: Update youtube video link (#1406) (e4f45b9)