python-3.x - 使用 python cassandra 驱动程序选择和解码 blob
问题描述
我正在尝试查询属于 Jaeger 架构的跟踪 Cassandra 表。如您所见, refs 字段是一个列表:
cqlsh:jaeger_v1_dc1> describe traces
CREATE TABLE jaeger_v1_dc1.traces (
trace_id blob,
span_id bigint,
span_hash bigint,
duration bigint,
flags int,
logs list<frozen<log>>,
operation_name text,
parent_id bigint,
process frozen<process>,
refs list<frozen<span_ref>>,
start_time bigint,
tags list<frozen<keyvalue>>,
PRIMARY KEY (trace_id, span_id, span_hash)
)
从python代码:
traces = session.execute('SELECT span_id,refs from traces')
for t in traces:
if t.refs is not None:
parentTrace=t['refs'][0].trace_id
- 我的第一个问题是可以直接选择父跟踪而不遍历结果吗?有没有办法我可以获取列表中的第一个元素,然后从 select 语句中获取元素?
- 从使用 cqlsh 的终端,我得到了这个结果:
trace_id: 0x00000000000000003917678c73006f57
。但是,从 python cassandra 客户端我trace_id=b'\x00\x00\x00\x00\x00\x00\x00\x009\x17g\x8cs\x00oW'
知道它发生了什么转变?既然我想用它来再次查询表,怎么能解码它。
解决方案
- 据我所知,没有简单的方法,因为无法保证跨度以特定顺序存储。值得注意的是,如果 by
parentTrace
,您的意思是跟踪的根跨度(第一个跨度),那么您可以搜索跨度,refs
因为null
根跨度没有父级。识别根跨度的另一种方法是如果trace_id
==span_id
。 trace_id
存储为二进制 blob。您从 cassandra 客户端看到的是一个 16 字节的数组,每个八位字节元素表示为两个十六进制值。要将其转换为您在 cqlsh 中看到的十六进制字符串,您需要将整个数组转换为单个十六进制字符串。请参阅以下执行此操作的 python 示例:
from cassandra.cluster import Cluster
cluster = Cluster(['127.0.0.1'])
session = cluster.connect()
rows = session.execute("select * from jaeger_v1_test.traces")
trace = rows[0]
hexstr = ''.join('{:02x}'.format(x) for x in trace.trace_id)
print("hex=%s, byte_arr=%s, len(byte_arr)=%d" % (hexstr, trace.trace_id, len(trace.trace_id)))
cluster.shutdown()
推荐阅读
- firebase - 当我登录时,我会得到前一个用户的用户名,直到我重新加载应用程序 Flutter
- pid - 如何获取 rundeck 作业 PID 并回显它
- laravel - 为 Laravel Blade 组件动态添加属性
- amazon-web-services - 连接到 AWS IoT 时出错:CFNetwork SSLHandshake failed (-9807) 和 TCP Conn 0x600003e30e40 SSLHandshake failed (-9807)
- javascript - 获取消息作者或提及用户的所有角色的问题 | 不和谐.js
- sql - 查询没有额外的记录
- python - 如何将其他 pip 包包含到 python 安装程序二进制文件中
- python - Pandas 数据到 pytorch 张量
- database - ACE 12.0 和 ACE 16.0 都存在,可执行文件标识为 ACE 16.0?
- javascript - ReactJS map() onMouseEnter 将css添加到特定索引