RPC 指标的语义约定

状态: 开发中

本节描述的约定是 RPC 特定的。当发生 RPC 操作时,关于这些操作的测量值会被记录到仪器中。测量值会被聚合并导出为指标,从而提供对这些操作的洞察。通过将 RPC 属性作为测量值的属性,可以过滤指标以进行更精细粒度的分析。

警告 现有使用 v1.37.0 本文档(或之前版本)的 RPC 仪器化

  • 不应在现有主版本中更改其默认发出的 RPC 约定版本。约定包括(但不限于)属性、指标和 Span 名称以及度量单位。
  • 应在其现有主版本中引入一个环境变量 OTEL_SEMCONV_STABILITY_OPT_IN,该变量是以逗号分隔的类别特定值列表(例如,http、databases、rpc)。值列表包括
    • rpc - 发出稳定的 RPC 约定,并停止发出仪器化先前发出的实验性 RPC 约定。
    • rpc/dup - 同时发出实验性和稳定的 RPC 约定,从而允许对稳定语义约定进行分阶段推出。
    • 默认行为(在没有这些值的情况下)是继续发出仪器化先前发出的旧实验性 RPC 约定的任何版本。
    • 注意:如果同时存在 rpcrpc/dup 这两个值,rpc/dup 的优先级高于 rpc
  • SHOULD 在开始发出这两套约定后,至少维护其现有主版本(至少包括安全补丁)六个月。
  • 可以在其下一个主版本中删除环境变量,并且仅发出稳定的 RPC 约定。

指标仪器

以下指标仪器必须用于描述 RPC 操作。它们必须是指定的类型和单位。

注意:RPC 服务器和客户端指标被分开,以便在客户端/服务器边界之间进行关联,例如,通过调整 RPC 方法的延迟来确定客户端看到的延迟是否由服务器引起。

RPC 服务器

以下是 RPC 服务器指标仪器列表。

指标: rpc.server.duration

此指标是推荐的。

名称Instrument TypeUnit (UCUM)描述Stability实体关联
rpc.server.durationHistogram毫秒测量传入 RPC 的持续时间。[1]Development

[1]: 流式 RPC 可能将此指标记录为从批次开始到批次结束,但这在实践中很难解释。

流式传输:不适用。

Attributes

Stability需求级别Value Type描述Example Values
rpc.systemDevelopment必需字符串标识远程系统的字符串。有关知名标识符列表,请参阅下文。grpc; java_rmi; dotnet_wcf
error.typeStable有条件必需 仅在操作失败时。字符串描述操作最终结束的一类错误。[1]timeoutjava.net.UnknownHostExceptionserver_certificate_invalid500
network.protocol.nameStable推荐字符串OSI 应用层或非 OSI 等效层。[2]http
network.protocol.versionStable推荐字符串用于网络通信的协议的实际版本。[3]1.1; 2
network.transportStable推荐字符串OSI 传输层进程间通信方法。[4]tcpudp
rpc.methodDevelopment推荐字符串这是从 RPC 接口角度来看的逻辑方法名称。exampleMethod
rpc.serviceDevelopment推荐字符串被调用的服务的完整(逻辑)名称,包括其包名称(如果适用)。myservice.EchoService
server.addressStable选择加入字符串服务器域名(如果无需反向 DNS 查找即可获得);否则,是 IP 地址或 Unix 域套接字名称。example.com10.1.2.80/tmp/my.sock
server.portStable选择加入int服务器端口号。80; 8080; 443

[1] error.type error.type 应该可预测,并且应该具有低基数性。

error.type 设置为某个类型(例如,异常类型)时,应该使用该工件内识别类型的规范类名。

Instrumentations 应该记录它们报告的错误列表。

一个仪器库内的 error.type 基数性应该低。从多个仪器库和应用程序聚合数据的遥测消费者,在没有额外过滤时,应准备好 error.type 在查询时具有高基数性。

如果操作已成功完成,Instrumentations 不应设置 error.type

如果特定域定义了自己的一组错误标识符(例如 HTTP 或 gRPC 状态码),则建议

  • 使用特定于域的属性
  • 设置 error.type 以捕获所有错误,无论它们是否包含在特定于域的集合中。

[2] network.protocol.name 值应规范化为小写。

[3] network.protocol.version 如果协议版本受协商(例如,使用 ALPN),则此属性应设置为协商后的版本。如果实际协议版本未知,则此属性不应设置。

[4] network.transport 值应规范化为小写。

在设置端口号时,应始终考虑设置传输协议,因为没有传输协议的端口号是模糊的。例如,不同的进程可能正在监听 TCP 端口 12345 和 UDP 端口 12345。


error.type 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以使用自定义值。

描述Stability
_OTHER当检测不到自定义值时使用的回退错误值。Stable

network.transport 具有以下已知值列表。如果其中一个适用,则必须使用相应的_值_;否则,可以_使用_自定义值。

描述Stability
pipe命名或匿名管道。Stable
quicQUICStable
tcpTCPStable
udpUDPStable
unixUnix 域套接字Stable

rpc.system 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以改用自定义值。

描述Stability
apache_dubboApache DubboDevelopment
connect_rpcConnect RPCDevelopment
dotnet_wcf.NET WCFDevelopment
grpcgRPCDevelopment
java_rmiJava RMIDevelopment
jsonrpcJSON-RPCDevelopment
onc_rpcONC RPC (Sun RPC)Development

指标: rpc.server.request.size

此指标是推荐的。

名称Instrument TypeUnit (UCUM)描述Stability实体关联
rpc.server.request.sizeHistogram每个调用的最大内存使用量的分布。测量 RPC 请求消息的大小(未压缩)。[1]Development

[1]: 流式传输:为流式批处理中的每条消息记录

Attributes

Stability需求级别Value Type描述Example Values
rpc.systemDevelopment必需字符串标识远程系统的字符串。有关知名标识符列表,请参阅下文。grpc; java_rmi; dotnet_wcf
error.typeStable有条件必需 仅在操作失败时。字符串描述操作最终结束的一类错误。[1]timeoutjava.net.UnknownHostExceptionserver_certificate_invalid500
network.protocol.nameStable推荐字符串OSI 应用层或非 OSI 等效层。[2]http
network.protocol.versionStable推荐字符串用于网络通信的协议的实际版本。[3]1.1; 2
network.transportStable推荐字符串OSI 传输层进程间通信方法。[4]tcpudp
rpc.methodDevelopment推荐字符串这是从 RPC 接口角度来看的逻辑方法名称。exampleMethod
rpc.serviceDevelopment推荐字符串被调用的服务的完整(逻辑)名称,包括其包名称(如果适用)。myservice.EchoService
server.addressStable选择加入字符串服务器域名(如果无需反向 DNS 查找即可获得);否则,是 IP 地址或 Unix 域套接字名称。example.com10.1.2.80/tmp/my.sock
server.portStable选择加入int服务器端口号。80; 8080; 443

[1] error.type error.type 应该可预测,并且应该具有低基数性。

error.type 设置为某个类型(例如,异常类型)时,应该使用该工件内识别类型的规范类名。

Instrumentations 应该记录它们报告的错误列表。

一个仪器库内的 error.type 基数性应该低。从多个仪器库和应用程序聚合数据的遥测消费者,在没有额外过滤时,应准备好 error.type 在查询时具有高基数性。

如果操作已成功完成,Instrumentations 不应设置 error.type

如果特定域定义了自己的一组错误标识符(例如 HTTP 或 gRPC 状态码),则建议

  • 使用特定于域的属性
  • 设置 error.type 以捕获所有错误,无论它们是否包含在特定于域的集合中。

[2] network.protocol.name 值应规范化为小写。

[3] network.protocol.version 如果协议版本受协商(例如,使用 ALPN),则此属性应设置为协商后的版本。如果实际协议版本未知,则此属性不应设置。

[4] network.transport 值应规范化为小写。

在设置端口号时,应始终考虑设置传输协议,因为没有传输协议的端口号是模糊的。例如,不同的进程可能正在监听 TCP 端口 12345 和 UDP 端口 12345。


error.type 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以使用自定义值。

描述Stability
_OTHER当检测不到自定义值时使用的回退错误值。Stable

network.transport 具有以下已知值列表。如果其中一个适用,则必须使用相应的_值_;否则,可以_使用_自定义值。

描述Stability
pipe命名或匿名管道。Stable
quicQUICStable
tcpTCPStable
udpUDPStable
unixUnix 域套接字Stable

rpc.system 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以改用自定义值。

描述Stability
apache_dubboApache DubboDevelopment
connect_rpcConnect RPCDevelopment
dotnet_wcf.NET WCFDevelopment
grpcgRPCDevelopment
java_rmiJava RMIDevelopment
jsonrpcJSON-RPCDevelopment
onc_rpcONC RPC (Sun RPC)Development

指标: rpc.server.response.size

此指标是推荐的。

名称Instrument TypeUnit (UCUM)描述Stability实体关联
rpc.server.response.sizeHistogram每个调用的最大内存使用量的分布。测量 RPC 响应消息的大小(未压缩)。[1]Development

[1]: 流式传输:为流式批处理中的每个响应记录

Attributes

Stability需求级别Value Type描述Example Values
rpc.systemDevelopment必需字符串标识远程系统的字符串。有关知名标识符列表,请参阅下文。grpc; java_rmi; dotnet_wcf
error.typeStable有条件必需 仅在操作失败时。字符串描述操作最终结束的一类错误。[1]timeoutjava.net.UnknownHostExceptionserver_certificate_invalid500
network.protocol.nameStable推荐字符串OSI 应用层或非 OSI 等效层。[2]http
network.protocol.versionStable推荐字符串用于网络通信的协议的实际版本。[3]1.1; 2
network.transportStable推荐字符串OSI 传输层进程间通信方法。[4]tcpudp
rpc.methodDevelopment推荐字符串这是从 RPC 接口角度来看的逻辑方法名称。exampleMethod
rpc.serviceDevelopment推荐字符串被调用的服务的完整(逻辑)名称,包括其包名称(如果适用)。myservice.EchoService
server.addressStable选择加入字符串服务器域名(如果无需反向 DNS 查找即可获得);否则,是 IP 地址或 Unix 域套接字名称。example.com10.1.2.80/tmp/my.sock
server.portStable选择加入int服务器端口号。80; 8080; 443

[1] error.type error.type 应该可预测,并且应该具有低基数性。

error.type 设置为某个类型(例如,异常类型)时,应该使用该工件内识别类型的规范类名。

Instrumentations 应该记录它们报告的错误列表。

一个仪器库内的 error.type 基数性应该低。从多个仪器库和应用程序聚合数据的遥测消费者,在没有额外过滤时,应准备好 error.type 在查询时具有高基数性。

如果操作已成功完成,Instrumentations 不应设置 error.type

如果特定域定义了自己的一组错误标识符(例如 HTTP 或 gRPC 状态码),则建议

  • 使用特定于域的属性
  • 设置 error.type 以捕获所有错误,无论它们是否包含在特定于域的集合中。

[2] network.protocol.name 值应规范化为小写。

[3] network.protocol.version 如果协议版本受协商(例如,使用 ALPN),则此属性应设置为协商后的版本。如果实际协议版本未知,则此属性不应设置。

[4] network.transport 值应规范化为小写。

在设置端口号时,应始终考虑设置传输协议,因为没有传输协议的端口号是模糊的。例如,不同的进程可能正在监听 TCP 端口 12345 和 UDP 端口 12345。


error.type 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以使用自定义值。

描述Stability
_OTHER当检测不到自定义值时使用的回退错误值。Stable

network.transport 具有以下已知值列表。如果其中一个适用,则必须使用相应的_值_;否则,可以_使用_自定义值。

描述Stability
pipe命名或匿名管道。Stable
quicQUICStable
tcpTCPStable
udpUDPStable
unixUnix 域套接字Stable

rpc.system 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以改用自定义值。

描述Stability
apache_dubboApache DubboDevelopment
connect_rpcConnect RPCDevelopment
dotnet_wcf.NET WCFDevelopment
grpcgRPCDevelopment
java_rmiJava RMIDevelopment
jsonrpcJSON-RPCDevelopment
onc_rpcONC RPC (Sun RPC)Development

RPC 客户端

以下是 RPC 客户端指标仪器列表。这些适用于传统的 RPC 用法,不适用于流式 RPC。

指标: rpc.client.duration

此指标是推荐的。

名称Instrument TypeUnit (UCUM)描述Stability实体关联
rpc.client.durationHistogram毫秒测量出站 RPC 的持续时间。[1]Development

[1]: 流式 RPC 可能将此指标记录为从批次开始到批次结束,但这在实践中很难解释。

流式传输:不适用。

Attributes

Stability需求级别Value Type描述Example Values
rpc.systemDevelopment必需字符串标识远程系统的字符串。有关知名标识符列表,请参阅下文。grpc; java_rmi; dotnet_wcf
server.addressStable必需字符串服务器域名(如果无需反向 DNS 查找即可获得);否则,是 IP 地址或 Unix 域套接字名称。[1]example.com10.1.2.80/tmp/my.sock
error.typeStable有条件必需 仅在操作失败时。字符串描述操作结束时发生的错误类型。[2]timeoutjava.net.UnknownHostExceptionserver_certificate_invalid500
server.portStable条件必需 如果适用。int服务器端口号。[3]80; 8080; 443
network.protocol.nameStable推荐字符串OSI 应用层或非 OSI 等效层。[4]http
network.protocol.versionStable推荐字符串用于网络通信的协议的实际版本。[5]1.1; 2
network.transportStable推荐字符串OSI 传输层进程间通信方法。[6]tcpudp
rpc.methodDevelopment推荐字符串这是从 RPC 接口角度来看的逻辑方法名称。exampleMethod
rpc.serviceDevelopment推荐字符串被调用的服务的完整(逻辑)名称,包括其包名称(如果适用)。myservice.EchoService

[1] server.address 从客户端观察时,并且当通过中间设备通信时,server.address 应代表任何中间设备(例如代理)后面的服务器地址,如果可用。

[2] error.type: error.type 应可预测且具有低基数。

error.type 设置为某个类型(例如,异常类型)时,应该使用该工件内识别类型的规范类名。

Instrumentations 应该记录它们报告的错误列表。

一个仪器库内的 error.type 基数性应该低。从多个仪器库和应用程序聚合数据的遥测消费者,在没有额外过滤时,应准备好 error.type 在查询时具有高基数性。

如果操作已成功完成,Instrumentations 不应设置 error.type

如果特定域定义了自己的一组错误标识符(例如 HTTP 或 gRPC 状态码),则建议

  • 使用特定于域的属性
  • 设置 error.type 以捕获所有错误,无论它们是否包含在特定于域的集合中。

[3] server.port: 从客户端观察时,并且在通过中介进行通信时,server.port 应代表任何中介(例如代理)之后的服务器端口,如果可用。

[4] network.protocol.name 值应规范化为小写。

[5] network.protocol.version 如果协议版本受协商(例如,使用 ALPN),则此属性应设置为协商后的版本。如果实际协议版本未知,则此属性不应设置。

[6] network.transport 值应规范化为小写。

在设置端口号时,应始终考虑设置传输协议,因为没有传输协议的端口号是模糊的。例如,不同的进程可能正在监听 TCP 端口 12345 和 UDP 端口 12345。


error.type 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以使用自定义值。

描述Stability
_OTHER当检测不到自定义值时使用的回退错误值。Stable

network.transport 具有以下已知值列表。如果其中一个适用,则必须使用相应的_值_;否则,可以_使用_自定义值。

描述Stability
pipe命名或匿名管道。Stable
quicQUICStable
tcpTCPStable
udpUDPStable
unixUnix 域套接字Stable

rpc.system 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以改用自定义值。

描述Stability
apache_dubboApache DubboDevelopment
connect_rpcConnect RPCDevelopment
dotnet_wcf.NET WCFDevelopment
grpcgRPCDevelopment
java_rmiJava RMIDevelopment
jsonrpcJSON-RPCDevelopment
onc_rpcONC RPC (Sun RPC)Development

指标: rpc.client.request.size

此指标是推荐的。

名称Instrument TypeUnit (UCUM)描述Stability实体关联
rpc.client.request.sizeHistogram每个调用的最大内存使用量的分布。测量 RPC 请求消息的大小(未压缩)。[1]Development

[1]: 流式传输:为流式批处理中的每条消息记录

Attributes

Stability需求级别Value Type描述Example Values
rpc.systemDevelopment必需字符串标识远程系统的字符串。有关知名标识符列表,请参阅下文。grpc; java_rmi; dotnet_wcf
server.addressStable必需字符串服务器域名(如果无需反向 DNS 查找即可获得);否则,是 IP 地址或 Unix 域套接字名称。[1]example.com10.1.2.80/tmp/my.sock
error.typeStable有条件必需 仅在操作失败时。字符串描述操作结束时发生的错误类型。[2]timeoutjava.net.UnknownHostExceptionserver_certificate_invalid500
server.portStable条件必需 如果适用。int服务器端口号。[3]80; 8080; 443
network.protocol.nameStable推荐字符串OSI 应用层或非 OSI 等效层。[4]http
network.protocol.versionStable推荐字符串用于网络通信的协议的实际版本。[5]1.1; 2
network.transportStable推荐字符串OSI 传输层进程间通信方法。[6]tcpudp
rpc.methodDevelopment推荐字符串这是从 RPC 接口角度来看的逻辑方法名称。exampleMethod
rpc.serviceDevelopment推荐字符串被调用的服务的完整(逻辑)名称,包括其包名称(如果适用)。myservice.EchoService

[1] server.address 从客户端观察时,并且当通过中间设备通信时,server.address 应代表任何中间设备(例如代理)后面的服务器地址,如果可用。

[2] error.type: error.type 应可预测且具有低基数。

error.type 设置为某个类型(例如,异常类型)时,应该使用该工件内识别类型的规范类名。

Instrumentations 应该记录它们报告的错误列表。

一个仪器库内的 error.type 基数性应该低。从多个仪器库和应用程序聚合数据的遥测消费者,在没有额外过滤时,应准备好 error.type 在查询时具有高基数性。

如果操作已成功完成,Instrumentations 不应设置 error.type

如果特定域定义了自己的一组错误标识符(例如 HTTP 或 gRPC 状态码),则建议

  • 使用特定于域的属性
  • 设置 error.type 以捕获所有错误,无论它们是否包含在特定于域的集合中。

[3] server.port: 从客户端观察时,并且在通过中介进行通信时,server.port 应代表任何中介(例如代理)之后的服务器端口,如果可用。

[4] network.protocol.name 值应规范化为小写。

[5] network.protocol.version 如果协议版本受协商(例如,使用 ALPN),则此属性应设置为协商后的版本。如果实际协议版本未知,则此属性不应设置。

[6] network.transport 值应规范化为小写。

在设置端口号时,应始终考虑设置传输协议,因为没有传输协议的端口号是模糊的。例如,不同的进程可能正在监听 TCP 端口 12345 和 UDP 端口 12345。


error.type 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以使用自定义值。

描述Stability
_OTHER当检测不到自定义值时使用的回退错误值。Stable

network.transport 具有以下已知值列表。如果其中一个适用,则必须使用相应的_值_;否则,可以_使用_自定义值。

描述Stability
pipe命名或匿名管道。Stable
quicQUICStable
tcpTCPStable
udpUDPStable
unixUnix 域套接字Stable

rpc.system 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以改用自定义值。

描述Stability
apache_dubboApache DubboDevelopment
connect_rpcConnect RPCDevelopment
dotnet_wcf.NET WCFDevelopment
grpcgRPCDevelopment
java_rmiJava RMIDevelopment
jsonrpcJSON-RPCDevelopment
onc_rpcONC RPC (Sun RPC)Development

指标: rpc.client.response.size

此指标是推荐的。

名称Instrument TypeUnit (UCUM)描述Stability实体关联
rpc.client.response.sizeHistogram每个调用的最大内存使用量的分布。测量 RPC 响应消息的大小(未压缩)。[1]Development

[1]: 流式传输:为流式批处理中的每个响应记录

Attributes

Stability需求级别Value Type描述Example Values
rpc.systemDevelopment必需字符串标识远程系统的字符串。有关知名标识符列表,请参阅下文。grpc; java_rmi; dotnet_wcf
server.addressStable必需字符串服务器域名(如果无需反向 DNS 查找即可获得);否则,是 IP 地址或 Unix 域套接字名称。[1]example.com10.1.2.80/tmp/my.sock
error.typeStable有条件必需 仅在操作失败时。字符串描述操作结束时发生的错误类型。[2]timeoutjava.net.UnknownHostExceptionserver_certificate_invalid500
server.portStable条件必需 如果适用。int服务器端口号。[3]80; 8080; 443
network.protocol.nameStable推荐字符串OSI 应用层或非 OSI 等效层。[4]http
network.protocol.versionStable推荐字符串用于网络通信的协议的实际版本。[5]1.1; 2
network.transportStable推荐字符串OSI 传输层进程间通信方法。[6]tcpudp
rpc.methodDevelopment推荐字符串这是从 RPC 接口角度来看的逻辑方法名称。exampleMethod
rpc.serviceDevelopment推荐字符串被调用的服务的完整(逻辑)名称,包括其包名称(如果适用)。myservice.EchoService

[1] server.address 从客户端观察时,并且当通过中间设备通信时,server.address 应代表任何中间设备(例如代理)后面的服务器地址,如果可用。

[2] error.type: error.type 应可预测且具有低基数。

error.type 设置为某个类型(例如,异常类型)时,应该使用该工件内识别类型的规范类名。

Instrumentations 应该记录它们报告的错误列表。

一个仪器库内的 error.type 基数性应该低。从多个仪器库和应用程序聚合数据的遥测消费者,在没有额外过滤时,应准备好 error.type 在查询时具有高基数性。

如果操作已成功完成,Instrumentations 不应设置 error.type

如果特定域定义了自己的一组错误标识符(例如 HTTP 或 gRPC 状态码),则建议

  • 使用特定于域的属性
  • 设置 error.type 以捕获所有错误,无论它们是否包含在特定于域的集合中。

[3] server.port: 从客户端观察时,并且在通过中介进行通信时,server.port 应代表任何中介(例如代理)之后的服务器端口,如果可用。

[4] network.protocol.name 值应规范化为小写。

[5] network.protocol.version 如果协议版本受协商(例如,使用 ALPN),则此属性应设置为协商后的版本。如果实际协议版本未知,则此属性不应设置。

[6] network.transport 值应规范化为小写。

在设置端口号时,应始终考虑设置传输协议,因为没有传输协议的端口号是模糊的。例如,不同的进程可能正在监听 TCP 端口 12345 和 UDP 端口 12345。


error.type 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以使用自定义值。

描述Stability
_OTHER当检测不到自定义值时使用的回退错误值。Stable

network.transport 具有以下已知值列表。如果其中一个适用,则必须使用相应的_值_;否则,可以_使用_自定义值。

描述Stability
pipe命名或匿名管道。Stable
quicQUICStable
tcpTCPStable
udpUDPStable
unixUnix 域套接字Stable

rpc.system 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以改用自定义值。

描述Stability
apache_dubboApache DubboDevelopment
connect_rpcConnect RPCDevelopment
dotnet_wcf.NET WCFDevelopment
grpcgRPCDevelopment
java_rmiJava RMIDevelopment
jsonrpcJSON-RPCDevelopment
onc_rpcONC RPC (Sun RPC)Development

特定 RPC 技术的语义约定

以下 RPC 技术定义了更具体的语义约定

  • ConnectConnect RPC 的语义约定。
  • gRPCgRPC 的语义约定。
  • JSON-RPCJSON-RPC 的语义约定。

RPC 系统维护者定义的规范

  • gRPCgRPC 的语义约定。