RabbitMQ 语义约定
状态: 开发中
RabbitMQ 的语义约定扩展并覆盖了消息队列语义约定。
正在使用 此文档 v1.24.0(或之前版本) 的现有消息传递仪器
- 在消息传递语义约定被标记为稳定之前,不应更改它们默认发出的消息传递约定版本。约定包括但不限于属性、指标和跨度名称、跨度种类和度量单位。
- 在现有主版本中,应引入一个名为
OTEL_SEMCONV_STABILITY_OPT_IN的环境变量,该变量是一个逗号分隔的类别特定值列表(例如,http、databases、messaging)。值列表包括:messaging- 发出新的、稳定的消息传递约定,并停止发出仪器先前发出的旧实验性消息传递约定。messaging/dup- 同时发出旧的稳定消息传递约定和新的稳定消息传递约定,实现无缝过渡。- 默认行为(在没有这些值的情况下)是继续发出仪器先前发出的旧实验性消息传递约定的任何版本。
- 注意:如果同时存在
messaging和messaging/dup,则messaging/dup的优先级高于messaging。
- 在开始发出两组约定后,应至少维护现有主版本(至少进行安全修补)六个月。
- 应在下一个主版本中删除该环境变量。
- 当
messaging/dup出现在列表中时,应为跨度名称、跨度种类和类似的“单一”值概念发出新的、稳定的值。
messaging.system 必须设置为 "rabbitmq",并且应该在创建 span 时提供。
RabbitMQ 属性
Attributes
| 键 | Stability | 需求级别 | Value Type | 描述 | Example Values |
|---|---|---|---|---|---|
messaging.destination.name | 必需 | 字符串 | 消息目标名称 [1] | direct_logs:warning; logs | |
messaging.operation.name | 必需 | 字符串 | 消息操作的系统特定名称。 | ack; nack; send | |
error.type | 条件必需 仅当消息操作失败时。 | 字符串 | 描述操作结束时发生的错误类型。[2] | amqp:decode-error; KAFKA_STORAGE_ERROR; channel-error | |
messaging.operation.type | 条件必需 如果适用。 | 字符串 | 一个标识消息队列操作类型的字符串。[3] | create; send; receive | |
messaging.rabbitmq.destination.routing_key | 有条件必填 如果不为空。 | 字符串 | RabbitMQ 消息路由键。 | myKey | |
messaging.rabbitmq.message.delivery_tag | 有条件必填 当可用时。 | int | RabbitMQ 消息投递标签 | 123 | |
server.address | 有条件必需 如果可用。 | 字符串 | 服务器域名(如果可用且无需反向 DNS 查询);否则,为 IP 地址或 Unix 套接字名称。[4] | example.com;10.1.2.80;/tmp/my.sock | |
messaging.message.conversation_id | 推荐 | 字符串 | 消息关联 ID 属性。 | MyConversationId | |
messaging.message.id | 推荐 如果 span 描述的是单条消息的操作。 | 字符串 | 消息传递系统用作消息标识符的值,表示为字符串。 | 452a7c7c7c7048c2f887f61572b18fc2 | |
network.peer.address | 推荐 | 字符串 | 网络连接的对端地址 - IP 地址或 Unix 域套接字名称。[5] | 10.1.2.80;/tmp/my.sock | |
network.peer.port | 推荐 | int | 网络连接的对等端口号。 | 65123 | |
server.port | 推荐 | int | 服务器端口号。[6] | 80; 8080; 443 | |
messaging.message.body.size | 选择加入 | int | 消息体大小(字节)。[7] | 1439 |
[1] messaging.destination.name: 在 RabbitMQ 中,目标由一个交换器、一个路由键以及(对于消费者)一个队列定义。
messaging.destination.name 应设置为
在生产者端:当交换器和路由键都存在且非空时,为
{exchange}:{routing key}。仅当其中一个值可用时,只使用该值。例如,{exchange}或{routing key}。否则:当使用默认交换器且未提供路由键时,为amq.default。在消费者端:当所有值(交换器、路由键、队列)都存在且非空时,为
{exchange}:{routing key}:{queue}。如果任何值为空(例如,使用了默认交换器),则应省略。对于{routing key}和{queue}相等的情况,只应使用其中一个,例如{exchange}:{routing key}。
[2] error.type: error.type 应可预测且具有低基数。
当 error.type 设置为某个类型(例如,异常类型)时,应该使用该工件内识别类型的规范类名。
Instrumentations 应该记录它们报告的错误列表。
一个仪器库内的 error.type 基数性应该低。从多个仪器库和应用程序聚合数据的遥测消费者,在没有额外过滤时,应准备好 error.type 在查询时具有高基数性。
如果操作已成功完成,Instrumentations 不应设置 error.type。
如果特定域定义了自己的一组错误标识符(例如 HTTP 或 gRPC 状态码),则建议
- 使用特定于域的属性
- 设置
error.type以捕获所有错误,无论它们是否包含在特定于域的集合中。
[3] messaging.operation.type: 如果使用自定义值,它必须是低基数(low cardinality)的。
[4] server.address: 如果在没有反向 DNS 查找的情况下可用,则为 Broker 的服务器域名;否则,为 IP 地址或 Unix 域套接字名称。
[5] network.peer.address: 如果一个操作涉及多个网络调用(例如重试),则应使用最后一个联系的节点的地址。
[6] server.port: 从客户端观察时,并且在通过中介进行通信时,server.port 应表示任何中介(例如代理)后面的服务器端口,如果可用。
[7] messaging.message.body.size: 这可以指压缩或未压缩的消息体大小。如果已知两种大小,则应使用未压缩的消息体大小。
以下属性对于做出采样决策可能很重要,并且应在跨度创建时提供(如果提供的话)
error.type 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以使用自定义值。
| 值 | 描述 | Stability |
|---|---|---|
_OTHER | 当检测不到自定义值时使用的回退错误值。 |
messaging.operation.type 具有以下一系列已知值。如果适用其中一个,则必须使用相应的值;否则,可以使用自定义值。
| 值 | 描述 | Stability |
|---|---|---|
create | 创建消息。“Create”跨度始终指单条消息,用于为批量发送场景中的消息提供唯一的创建上下文。 | |
process | 一个或多个消息由消费者处理。 | |
receive | 一个或多个消息由消费者请求。此操作指拉取式场景,其中消费者显式调用消息 SDK 的方法来接收消息。 | |
send | 提供一个或多个消息以发送到中介。如果发送了单条消息,“Send”跨度的上下文可用作创建上下文,无需创建“Create”跨度。 | |
settle | 一个或多个消息已结算。 |