Select 并使用 python cassandra 驱动解码 blob
Select and decode blob using python cassandra driver
我正在尝试查询 Cassandra table 的踪迹,它是 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
- 我的第一个问题是否可以直接 select 父跟踪而不遍历结果?有没有一种方法可以获取列表中的第一个元素,然后从 select 语句中获取其中的元素?
- 从使用 cqlsh 的终端,我得到了这个结果:
trace_id: 0x00000000000000003917678c73006f57
。然而,我从一个 python cassandra 客户端得到了这个 trace_id=b'\x00\x00\x00\x00\x00\x00\x00\x009\x17g\x8cs\x00oW'
知道它发生了什么转变吗?如何解码它,因为我想再次使用它来查询 table。
- 据我所知,没有简单的方法,因为不能保证跨度按特定顺序存储。但值得注意的是,如果
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()
我正在尝试查询 Cassandra table 的踪迹,它是 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
- 我的第一个问题是否可以直接 select 父跟踪而不遍历结果?有没有一种方法可以获取列表中的第一个元素,然后从 select 语句中获取其中的元素?
- 从使用 cqlsh 的终端,我得到了这个结果:
trace_id: 0x00000000000000003917678c73006f57
。然而,我从一个 python cassandra 客户端得到了这个trace_id=b'\x00\x00\x00\x00\x00\x00\x00\x009\x17g\x8cs\x00oW'
知道它发生了什么转变吗?如何解码它,因为我想再次使用它来查询 table。
- 据我所知,没有简单的方法,因为不能保证跨度按特定顺序存储。但值得注意的是,如果
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()