OpenTelemetry 指标(Metrics)
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) |
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.method
和 grpc.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
来计算错误计数。