Redis 客户端操作的语义约定
状态: 开发中
Redis 的语义约定扩展并覆盖了数据库语义约定。
Span
状态:
代表对 Redis 调用产生的 Span 应遵循通用的数据库客户端 Span 的语义约定。
db.system.name 必须设置为 "redis",并且应在创建 Span 时提供。
Span 名称应遵循通用的数据库 Span 名称约定,但 db.namespace 不应在 Span 名称中使用,因为它是一个数值,看起来会很混乱。
**Span 类型**应为 CLIENT。
**Span 状态**应遵循 记录错误文档。
Attributes
| 键 | Stability | 需求级别 | Value Type | 描述 | Example Values |
|---|---|---|---|---|---|
db.operation.name | 必需 | 字符串 | Redis 命令的名称。[1] | HMSET;GET;SET | |
db.namespace | 有条件必需 仅当可以可靠捕获时。 | 字符串 | 与连接关联的[数据库索引],表示为字符串。[2] | 0; 1; 15 | |
db.response.status_code | 有条件地必需 [3] | 字符串 | Redis[简单错误]前缀。[4] | ERR;WRONGTYPE;CLUSTERDOWN | |
error.type | 有条件必需 仅在操作失败时。 | 字符串 | 描述操作结束时的一类错误。[5] | timeout;java.net.UnknownHostException;server_certificate_invalid;500 | |
server.port | 有条件地必需 [6] | int | 服务器端口号。[7] | 80; 8080; 443 | |
db.operation.batch.size | 推荐 | int | 批量操作中包含的查询数量。 [8] | 2; 3; 4 | |
db.query.text | 推荐 | 字符串 | Redis CLI 命令的完整语法。[9] | HMSET myhash field1 ? field2 ? | |
db.stored_procedure.name | 推荐 如果操作适用于特定的 Lua 脚本。 | 字符串 | 数据库中 Lua 脚本的名称或 sha1 摘要。[10] | GetCustomer | |
network.peer.address | 推荐 | 字符串 | 执行操作的数据库节点对等地址。[11] | 10.1.2.80;/tmp/my.sock | |
network.peer.port | 推荐,当且仅当设置了 network.peer.address 时。 | int | 网络连接的对等端口号。 | 65123 | |
server.address | 推荐 | 字符串 | 数据库主机的名称。[12] | example.com;10.1.2.80;/tmp/my.sock |
[1] db.operation.name: 建议捕获应用程序提供的值,而不尝试进行任何大小写规范化。对于事务和管道调用,如果已知单个操作具有相同的命令,则应使用该命令,并在前面加上 MULTI 或 PIPELINE 。否则,db.operation.name 应为 MULTI 或 PIPELINE。
[2] db.namespace: 连接当前关联的数据库索引在其生命周期中可能会发生变化,例如通过执行 SELECT <index>。
如果仪器化无法在每次查询时捕获连接当前关联的数据库索引而不触发额外的查询,则建议回退并使用建立连接时提供的数据库索引。
仪器化应记录 db.namespace 是否反映了建立连接时提供的数据库索引。
[3] db.response.status_code: 如果操作失败并且状态码可用。
[4] db.response.status_code: 所有 Redis 错误前缀都应被视为错误。
[5] error.type: error.type 应与数据库或客户端库返回的 db.response.status_code 或发生的异常的标准名称匹配。使用标准异常类型名称时,仪器应尽最大努力报告最相关的类型。例如,如果原始异常被包装在通用异常中,则应优先选择原始异常。仪器应记录 error.type 的填充方式。
[6] server.port: 如果使用的端口不是此 DBMS 的默认端口,并且 server.address 已设置。
[7] server.port: 当从客户端观察到并且通过中间件通信时,server.port 应代表任何中间件(例如代理)之后的服务器端口,如果可用。
[8] db.operation.batch.size:只有当操作包含两个或更多操作时,才将其视为批量操作,因此 db.operation.batch.size 绝不应为 1。
[9] db.query.text: 默认情况下不应收集查询文本,除非有排除敏感数据的清理操作,例如通过编辑查询文本中的所有字面值。请参阅db.query.text 的清理。为 db.query.text 提供的值应对应于 Redis CLI 的语法。例如,如果调用了HMSET 命令,则 "HMSET myhash field1 ? field2 ?" 将是 db.query.text 的合适值。
[10] db.stored_procedure.name: 请参阅FCALL 和EVALSHA。
[11] network.peer.address: 如果数据库操作涉及多个网络调用(例如重试),则应使用最后一个联系节点的地址。
[12] server.address: 从客户端观察到,并且当通过中介通信时,server.address 应表示任何中介(例如代理)后面的服务器地址,如果可用。
以下属性对于做出采样决策可能很重要,并且应在跨度创建时提供(如果提供的话)
error.type 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以使用自定义值。
| 值 | 描述 | Stability |
|---|---|---|
_OTHER | 当检测不到自定义值时使用的回退错误值。 |
示例
在此示例中,Redis 使用 Unix 域套接字连接,因此省略了连接字符串。
| 键 | 值 |
|---|---|
| Span 名称 | "HMSET" |
db.system.name | "redis" |
network.peer.address | "/tmp/redis.sock" |
network.transport | "unix" |
db.namespace | "15" |
db.query.text | "HMSET myhash field1 'Hello' field2 'World" |
db.operation.name | "HMSET" |