使用python cassandra驱动程序选择并解码blob



我正在尝试查询跟踪Cassandra表,它是Jaeger体系结构的一部分。正如你所看到的,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
  1. 我的第一个问题是,是否可以在不迭代结果的情况下直接选择父跟踪?有没有办法我可以得到列表中的第一个元素,然后从select语句中得到里面的元素
  2. 从使用cqlsh的终端,我得到了这样的结果:trace_id: 0x00000000000000003917678c73006f57。然而,从一个python cassandra客户端我得到了这个trace_id=b'x00x00x00x00x00x00x00x009x17gx8csx00oW',你知道它发生了什么变化吗?既然我想再次使用它来查询表,怎么能解码呢
  1. 据我所知,没有简单的方法,因为无法保证跨度按特定顺序存储。不过,值得注意的是,如果parentTrace是指跟踪(第一个跨度(的根跨度,那么您可以搜索refsnull的跨度,因为根跨度没有父跨度。识别根跨度的另一种方法是如果trace_id==span_id
  2. CCD_ 8被存储为二进制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()

最新更新