#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
- Мой первый вопрос: возможно ли напрямую выбрать родительскую трассировку без повторения результата? Есть ли способ, которым я могу получить первый элемент в списке, а затем получить элементы внутри из состояния выбора?
- Из терминала, использующего cqlsh, я получаю такой результат:
trace_id: 0x00000000000000003917678c73006f57
. Однако из клиента python cassandra я понялtrace_id=b'x00x00x00x00x00x00x00x009x17gx8csx00oW'
, какое преобразование с ним произошло? Как можно его декодировать, поскольку я хочу использовать для повторного запроса таблицы.
Ответ №1:
- Насколько мне известно, простого способа не существует, поскольку нет гарантии, что интервалы хранятся в определенном порядке. Однако стоит отметить, что если под
parentTrace
, вы имеете в виду корневой диапазон трассировки (первый диапазон), то вы можете искать промежутки, гдеrefs
null
, потому что корневой диапазон не имеет родительского элемента. Другой способ определить корневой диапазон — еслиtrace_id
==span_id
. 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, чтобы это работало