// Copyright 2023 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include #include #include #include #include #include #include namespace DB { Block QueryLogElement::createBlock() { return { {ColumnUInt8::create(), std::make_shared(), "type"}, {ColumnUInt16::create(), std::make_shared(), "event_date"}, {ColumnUInt32::create(), std::make_shared(), "event_time"}, {ColumnUInt32::create(), std::make_shared(), "query_start_time"}, {ColumnUInt64::create(), std::make_shared(), "query_duration_ms"}, {ColumnUInt64::create(), std::make_shared(), "read_rows"}, {ColumnUInt64::create(), std::make_shared(), "read_bytes"}, {ColumnUInt64::create(), std::make_shared(), "written_rows"}, {ColumnUInt64::create(), std::make_shared(), "written_bytes"}, {ColumnUInt64::create(), std::make_shared(), "result_rows"}, {ColumnUInt64::create(), std::make_shared(), "result_bytes"}, {ColumnUInt64::create(), std::make_shared(), "memory_usage"}, {ColumnString::create(), std::make_shared(), "query"}, {ColumnString::create(), std::make_shared(), "exception"}, {ColumnString::create(), std::make_shared(), "stack_trace"}, {ColumnUInt8::create(), std::make_shared(), "is_initial_query"}, {ColumnString::create(), std::make_shared(), "user"}, {ColumnString::create(), std::make_shared(), "query_id"}, {ColumnFixedString::create(16), std::make_shared(16), "address"}, {ColumnUInt16::create(), std::make_shared(), "port"}, {ColumnString::create(), std::make_shared(), "initial_user"}, {ColumnString::create(), std::make_shared(), "initial_query_id"}, {ColumnFixedString::create(16), std::make_shared(16), "initial_address"}, {ColumnUInt16::create(), std::make_shared(), "initial_port"}, {ColumnUInt8::create(), std::make_shared(), "interface"}, {ColumnString::create(), std::make_shared(), "os_user"}, {ColumnString::create(), std::make_shared(), "client_hostname"}, {ColumnString::create(), std::make_shared(), "client_name"}, {ColumnUInt8::create(), std::make_shared(), "http_method"}, {ColumnString::create(), std::make_shared(), "http_user_agent"}, {ColumnString::create(), std::make_shared(), "quota_key"}, }; } static std::array IPv6ToBinary(const Poco::Net::IPAddress & address) { std::array res{}; if (Poco::Net::IPAddress::IPv6 == address.family()) { memcpy(res.data(), address.addr(), 16); } else if (Poco::Net::IPAddress::IPv4 == address.family()) { /// Convert to IPv6-mapped address. memset(res.data(), 0, 10); res[10] = '\xFF'; res[11] = '\xFF'; memcpy(&res[12], address.addr(), 4); } else memset(res.data(), 0, 16); return res; } void QueryLogElement::appendToBlock(Block & block) const { MutableColumns columns = block.mutateColumns(); size_t i = 0; columns[i++]->insert(static_cast(type)); columns[i++]->insert(static_cast(DateLUT::instance().toDayNum(event_time))); columns[i++]->insert(static_cast(event_time)); columns[i++]->insert(static_cast(query_start_time)); columns[i++]->insert((query_duration_ms)); columns[i++]->insert((read_rows)); columns[i++]->insert((read_bytes)); columns[i++]->insert((written_rows)); columns[i++]->insert((written_bytes)); columns[i++]->insert((result_rows)); columns[i++]->insert((result_bytes)); columns[i++]->insert((memory_usage)); columns[i++]->insertData(query.data(), query.size()); columns[i++]->insertData(exception.data(), exception.size()); columns[i++]->insertData(stack_trace.data(), stack_trace.size()); columns[i++]->insert(static_cast(client_info.query_kind == ClientInfo::QueryKind::INITIAL_QUERY)); columns[i++]->insert(client_info.current_user); columns[i++]->insert(client_info.current_query_id); columns[i++]->insertData(IPv6ToBinary(client_info.current_address.host()).data(), 16); columns[i++]->insert(static_cast(client_info.current_address.port())); columns[i++]->insert(client_info.initial_user); columns[i++]->insert(client_info.initial_query_id); columns[i++]->insertData(IPv6ToBinary(client_info.initial_address.host()).data(), 16); columns[i++]->insert(static_cast(client_info.initial_address.port())); columns[i++]->insert(static_cast(client_info.interface)); columns[i++]->insert(client_info.os_user); columns[i++]->insert(client_info.client_hostname); columns[i++]->insert(client_info.client_name); columns[i++]->insert(client_info.quota_key); block.setColumns(std::move(columns)); } } // namespace DB