Выбор и декодирование большого двоичного объекта с помощью драйвера python cassandra

#python-3.x #cassandra #jaeger #cassandra-driver

#python-3.x #cassandra #jaeger #cassandra-driver

Вопрос:

Я пытаюсь запросить таблицу traces 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. Мой первый вопрос: возможно ли напрямую выбрать родительскую трассировку без повторения результата? Есть ли способ, которым я могу получить первый элемент в списке, а затем получить элементы внутри из состояния выбора?
  2. Из терминала, использующего cqlsh, я получаю такой результат: trace_id: 0x00000000000000003917678c73006f57 . Однако из клиента python cassandra я понял trace_id=b'x00x00x00x00x00x00x00x009x17gx8csx00oW' , какое преобразование с ним произошло? Как можно его декодировать, поскольку я хочу использовать для повторного запроса таблицы.

Ответ №1:

  1. Насколько мне известно, простого способа не существует, поскольку нет гарантии, что интервалы хранятся в определенном порядке. Однако стоит отметить, что если под parentTrace , вы имеете в виду корневой диапазон трассировки (первый диапазон), то вы можете искать промежутки, где refs null , потому что корневой диапазон не имеет родительского элемента. Другой способ определить корневой диапазон — если trace_id == span_id .
  2. trace_id хранится как двоичный большой двоичный объект. То, что вы видите в клиенте 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()
  

Комментарии:

1. query="SELECT * FROM traces where trace_id=0x" hexstr Мне нужно было добавить начальный 0x, чтобы это работало