#include #include #include #include #include #include #include namespace DB { Block AsynchronousMetricLogElement::createBlock() { ColumnsWithTypeAndName columns; columns.emplace_back(std::make_shared(), "event_date"); columns.emplace_back(std::make_shared(), "event_time"); columns.emplace_back(std::make_shared(6), "event_time_microseconds"); columns.emplace_back(std::make_shared(), "name"); columns.emplace_back(std::make_shared(), "value"); return Block(columns); } 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); } } }