#include #include #include #include #include #include #include #include #include #include namespace DB { NamesAndTypesList OpenTelemetrySpanLogElement::getNamesAndTypes() { auto span_kind_type = std::make_shared( DataTypeEnum8::Values { {"INTERNAL", static_cast(OpenTelemetry::INTERNAL)}, {"SERVER", static_cast(OpenTelemetry::SERVER)}, {"CLIENT", static_cast(OpenTelemetry::CLIENT)}, {"PRODUCER", static_cast(OpenTelemetry::PRODUCER)}, {"CONSUMER", static_cast(OpenTelemetry::CONSUMER)} } ); auto low_cardinality_string = std::make_shared(std::make_shared()); return { {"trace_id", std::make_shared()}, {"span_id", std::make_shared()}, {"parent_span_id", std::make_shared()}, {"operation_name", low_cardinality_string}, {"kind", std::move(span_kind_type)}, // DateTime64 is really unwieldy -- there is no "normal" way to convert // it to an UInt64 count of microseconds, except: // 1) reinterpretAsUInt64(reinterpretAsFixedString(date)), which just // doesn't look sane; // 2) things like toUInt64(toDecimal64(date, 6) * 1000000) that are also // excessively verbose -- why do I have to write scale '6' again, and // write out 6 zeros? -- and also don't work because of overflow. // Also subtraction of two DateTime64 points doesn't work, so you can't // get duration. // It is much less hassle to just use UInt64 of microseconds. {"start_time_us", std::make_shared()}, {"finish_time_us", std::make_shared()}, {"finish_date", std::make_shared()}, {"attribute", std::make_shared(low_cardinality_string, std::make_shared())}, }; } NamesAndAliases OpenTelemetrySpanLogElement::getNamesAndAliases() { auto low_cardinality_string = std::make_shared(std::make_shared()); return { {"attribute.names", std::make_shared(low_cardinality_string), "mapKeys(attribute)"}, {"attribute.values", std::make_shared(std::make_shared()), "mapValues(attribute)"} }; } void OpenTelemetrySpanLogElement::appendToBlock(MutableColumns & columns) const { size_t i = 0; columns[i++]->insert(trace_id); columns[i++]->insert(span_id); columns[i++]->insert(parent_span_id); columns[i++]->insert(operation_name); columns[i++]->insert(kind); columns[i++]->insert(start_time_us); columns[i++]->insert(finish_time_us); columns[i++]->insert(DateLUT::instance().toDayNum(finish_time_us / 1000000).toUnderType()); // The user might add some ints values, and we will have Int Field, and the // insert will fail because the column requires Strings. Convert the fields // here, because it's hard to remember to convert them in all other places. columns[i++]->insert(attributes); } }