#include #include #include #include #include #include #include #include namespace DB { NamesAndTypesList AsynchronousMetricLogElement::getNamesAndTypes() { return { {"event_date", std::make_shared()}, {"event_time", std::make_shared()}, {"event_time_microseconds", std::make_shared(6)}, {"metric", std::make_shared(std::make_shared())}, {"value", std::make_shared(),} }; } void AsynchronousMetricLogElement::appendToBlock(MutableColumns & columns) const { size_t column_idx = 0; columns[column_idx++]->insert(event_date); columns[column_idx++]->insert(event_time); columns[column_idx++]->insert(event_time_microseconds); columns[column_idx++]->insert(metric_name); columns[column_idx++]->insert(value); } inline UInt64 time_in_milliseconds(std::chrono::time_point timepoint) { return std::chrono::duration_cast(timepoint.time_since_epoch()).count(); } inline UInt64 time_in_microseconds(std::chrono::time_point timepoint) { return std::chrono::duration_cast(timepoint.time_since_epoch()).count(); } inline UInt64 time_in_seconds(std::chrono::time_point timepoint) { return std::chrono::duration_cast(timepoint.time_since_epoch()).count(); } void AsynchronousMetricLog::addValues(const AsynchronousMetricValues & values) { AsynchronousMetricLogElement element; const auto now = std::chrono::system_clock::now(); element.event_time = time_in_seconds(now); element.event_time_microseconds = time_in_microseconds(now); element.event_date = DateLUT::instance().toDayNum(element.event_time); for (const auto & [key, value] : values) { element.metric_name = key; element.value = value; add(element); } } }