微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用python cassandra驱动程序选择和解码Blob

如何解决使用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
  1. 我的第一个问题是,是否可以直接选择父轨迹而无需遍历结果?有没有办法我可以获取列表中的第一个元素,然后从选择陈述中获取元素?
  2. 从终端使用cqlsh,我得到以下结果:trace_id: 0x00000000000000003917678c73006f57。但是,从python cassandra客户端,我得到了这个trace_id=b'\x00\x00\x00\x00\x00\x00\x00\x009\x17g\x8cs\x00oW',知道发生了什么变化吗?由于我想再次使用该表进行查询,因此如何对其进行解码。

解决方法

  1. 据我所知,没有简单的方法,因为不能保证跨度按特定顺序存储。不过,值得注意的是,如果按parentTrace表示跟踪的根跨度(第一个跨度),则可以搜索refs为{{1 }},因为根范围没有父代。识别根范围的另一种方法是null == trace_id
  2. span_id存储为二进制Blob。您从cassandra客户端看到的是一个16个字节的数组,每个八位位组元素表示为两个十六进制值。要将其转换为在cqlsh中看到的十六进制字符串,您需要将整个数组转换为单个十六进制字符串。请参阅以下执行此操作的python示例:
trace_id

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。