184 похожих чатов

Всем привет) Может знает кто, как с вложенными типами прото

файла работать в клике в кафка движке? Есть message, внутри которого определен еще message, а внутри еще один, то есть получается примерно такая структура:
message X{
message Y{
message Z{}
}
}

Для маппинга мне нужен тип Z, указываю следующим образом: kafka_schema = 'file.proto:X_Y_Z'
На что получаю, что нет такой модели в этом прото файле.

7 ответов

14 просмотров

In order to return response in Protobuf format, we first need to import proto files in ClickHouse. It can be done like that: cd /var/lib/clickhouse/format_schemas/ wget https://raw.githubusercontent.com/open-telemetry/opentelemetry-proto/main/opentelemetry/proto/trace/v1/trace.proto wget https://raw.githubusercontent.com/open-telemetry/opentelemetry-proto/main/opentelemetry/proto/common/v1/common.proto wget https://raw.githubusercontent.com/open-telemetry/opentelemetry-proto/main/opentelemetry/proto/resource/v1/resource.proto Lets connect to ClickHouse and try to use this proto file SELECT 1 FORMAT ProtobufSingle SETTINGS format_schema = '/var/lib/clickhouse/format_schemas/trace.proto:TracesData' Query id: 9755e685-5f3b-4b76-b794-e690b86a28c3 Ok. Error on processing query: Code: 434. DB::Exception: Code: 434. DB::Exception: Cannot parse 'trace.proto' file, found an error at line -1, column 0, File recursively imports itself: trace.proto -> trace.proto. (CANNOT_PARSE_PROTOBUF_SCHEMA) (version 22.12.1.1115 (official build)). (CANNOT_PARSE_PROTOBUF_SCHEMA) (version 22.12.1.1115 (official build)) And it gives us rather cryptic error messages about recursion. What it really does mean, that we need to fix our import paths in .proto files. (in traces.proto and resource.proto files) import "opentelemetry/proto/common/v1/common.proto"; -> import "common.proto"; import "opentelemetry/proto/resource/v1/resource.proto"; -> import "resource.proto"; Let's test our query again. SELECT 1 FORMAT ProtobufSingle SETTINGS format_schema = '/var/lib/clickhouse/format_schemas/trace.proto:TracesData' Query id: 0a920df8-8bbd-4525-95cc-f5906f52b678 Ok. Error on processing query: Code: 443. DB::Exception: Code: 443. DB::Exception: Not found matches between the names of the columns {1} and the fields {resource_spans} of the message 'opentelemetry.proto.trace.v1.TracesData' in the protobuf schema. (NO_COLUMNS_SERIALIZED_TO_PROTOBUF_FIELDS) (version 22.12.1.1115 (official build)). (NO_COLUMNS_SERIALIZED_TO_PROTOBUF_FIELDS) (version 22.12.1.1115 (official build)) We see different error, it does mean that ClickHouse successfully parsed our proto. Nested structures What we need to do next, is to make a similar nested structure using Tuples and Arrays. We will simplify our example quite a bit, but the idea will be the same even for more complex objects(or messages). Let's take a look on that proto definition: message KeyValue { string key = 1; AnyValue value = 2; } message Resource { repeated KeyValue attributes = 1; ... } message ResourceSpans { Resource resource = 1; ... } Or, if we make it into nested message: message ResourceSpans { message Resource resource = 1 { repeated message KeyValue attributes = 1 { string key = 1; message AnyValue value = 2 { oneof value { string string_value = 1; ... }; }; }; ... }; ... } Our task is to turn each message to Tuple and repeated to Array. For example repeated message will became Array(Tuple(..)) So proto example can be represented as Tuple( resource Tuple ( attributes Array ( Tuple ( key String, value Tuple ( string_value String ) ) ) ) ) Let's turn it into query: SELECT CAST(tuple(tuple([('key', tuple('value'))])), 'Tuple(resource Tuple (attributes Array (Tuple (key String, value Tuple (string_value String)))))') AS resource_spans FORMAT ProtobufSingle SETTINGS format_schema = '/var/lib/clickhouse/format_schemas/trace.proto:TracesData' key value 1 row in set. Elapsed: 0.001 sec. It's working, we only need to continue adding new fields in tuple to match proto specification.

WITH (reinterpretAsFixedString(toUUID(trace_id)) AS traceId, reinterpretAsFixedString(parent_span_id) AS parentSpanId, reinterpretAsFixedString(span_id) AS spanId, operation_name AS name, start_time_us * 1000 AS startTimeUnixNano, finish_time_us * 1000 AS endTimeUnixNano, CAST(mapApply((k, v) -> (k, tuple(v)), attribute), 'Array(Tuple(String, Tuple(String)))') AS attributes) AS span SELECT CAST([(tuple([('service.name', tuple('clickhouse')), ('hostname', tuple(hostName()))]), [tuple(groupArray(span))])], 'Array(Tuple(resource Tuple(attributes Array(Tuple(key String, value Tuple(string_value String)))), scope_spans Array(Tuple(spans Array(Tuple(trace_id FixedString(16), parent_span_id FixedString(8), span_id FixedString(8), name String, start_time_unix_nano UInt64, end_time_unix_nano UInt64, attributes Array(Tuple(key String, value Tuple(string_value String)))))))))') AS resource_spans FROM system.opentelemetry_span_log WHERE trace_id = reinterpretAsUUID(base64Decode({trace_id:String})) FORMAT ProtobufSingle SETTINGS format_schema = 'trace.proto:TracesData'

посмотри, на этот пример с Nested messages

Dmitry [Altinity] Titov
In order to return response in Protobuf format, we...

Решил повторить эту последовательность действий на 22.8.9.24 и не могу перескочить первую ошибку. Команду выполняю такую: SELECT 1 FORMAT ProtobufSingle SETTINGS format_schema = 'trace.proto:TracesData’; Мб есть что еще нужно сделать?

Clir
Решил повторить эту последовательность действий на...

Надо править proto файлы, что бы инклуды работали

Dmitry [Altinity] Titov
Надо править proto файлы, что бы инклуды работали

исправил, как и написано, или кроме import еще что-то нужно? Да и вообще делал свой proto файл, все равно такую ошибку получаю, даже на простой proto файл из одного поля

Похожие вопросы

Обсуждают сегодня

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта