【问题标题】:Select and decode blob using python cassandra driver使用 python cassandra 驱动程序选择和解码 blob
【发布时间】:2021-02-20 21:02:42
【问题描述】:

我正在尝试查询属于 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. 我的第一个问题是可以直接选择父跟踪而不遍历结果吗?有没有办法我可以获取列表中的第一个元素,然后从 select 语句中获取元素?
  2. 从使用 cqlsh 的终端,我得到这个结果:trace_id: 0x00000000000000003917678c73006f57。但是,从 python cassandra 客户端我得到了这个trace_id=b'\x00\x00\x00\x00\x00\x00\x00\x009\x17g\x8cs\x00oW' 知道它发生了什么转变吗?我想用它再次查询表,如何解码它。

【问题讨论】:

    标签: python-3.x cassandra jaeger cassandra-driver


    【解决方案1】:
    1. 据我所知,没有简单的方法,因为无法保证跨度按特定顺序存储。不过值得注意的是,如果parentTrace 表示跟踪的根跨度(第一个跨度),那么您可以搜索refsnull 的跨度,因为根跨度没有父母。另一种识别根跨度的方法是trace_id == span_id
    2. 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()
    

    【讨论】:

    • query="SELECT * FROM traces where trace_id=0x"+hexstr 我需要添加一个前导 0x 才能工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2015-04-12
    • 2017-11-26
    • 2018-06-15
    • 2018-11-10
    相关资源
    最近更新 更多