mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
Merge pull request #5640 from yandex/use-ipv6-in-system-tables
Adopted IPv6 data type in system tables; unified client info columns in system.processes and system.query_log
This commit is contained in:
commit
a52e13b891
30
dbms/src/Common/IPv6ToBinary.cpp
Normal file
30
dbms/src/Common/IPv6ToBinary.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
#include "IPv6ToBinary.h"
|
||||
#include <Poco/Net/IPAddress.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
std::array<char, 16> IPv6ToBinary(const Poco::Net::IPAddress & address)
|
||||
{
|
||||
std::array<char, 16> 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;
|
||||
}
|
||||
|
||||
}
|
11
dbms/src/Common/IPv6ToBinary.h
Normal file
11
dbms/src/Common/IPv6ToBinary.h
Normal file
@ -0,0 +1,11 @@
|
||||
#include <array>
|
||||
|
||||
namespace Poco { namespace Net { class IPAddress; }}
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
/// Convert IP address to 16-byte array with IPv6 data (big endian). If it's an IPv4, map it to IPv6.
|
||||
std::array<char, 16> IPv6ToBinary(const Poco::Net::IPAddress & address);
|
||||
|
||||
}
|
@ -1,4 +1,6 @@
|
||||
#include <Common/ProfileEvents.h>
|
||||
#include <Common/IPv6ToBinary.h>
|
||||
#include <Common/ClickHouseRevision.h>
|
||||
#include <Columns/ColumnsNumber.h>
|
||||
#include <Columns/ColumnString.h>
|
||||
#include <Columns/ColumnFixedString.h>
|
||||
@ -7,11 +9,10 @@
|
||||
#include <DataTypes/DataTypeDateTime.h>
|
||||
#include <DataTypes/DataTypeDate.h>
|
||||
#include <DataTypes/DataTypeString.h>
|
||||
#include <DataTypes/DataTypeFixedString.h>
|
||||
#include <DataTypes/DataTypeArray.h>
|
||||
#include <DataTypes/DataTypeFactory.h>
|
||||
#include <Interpreters/QueryLog.h>
|
||||
#include <Interpreters/ProfileEventsExt.h>
|
||||
#include <Common/ClickHouseRevision.h>
|
||||
#include <Poco/Net/IPAddress.h>
|
||||
#include <array>
|
||||
|
||||
@ -44,11 +45,11 @@ Block QueryLogElement::createBlock()
|
||||
{std::make_shared<DataTypeUInt8>(), "is_initial_query"},
|
||||
{std::make_shared<DataTypeString>(), "user"},
|
||||
{std::make_shared<DataTypeString>(), "query_id"},
|
||||
{std::make_shared<DataTypeFixedString>(16), "address"},
|
||||
{DataTypeFactory::instance().get("IPv6"), "address"},
|
||||
{std::make_shared<DataTypeUInt16>(), "port"},
|
||||
{std::make_shared<DataTypeString>(), "initial_user"},
|
||||
{std::make_shared<DataTypeString>(), "initial_query_id"},
|
||||
{std::make_shared<DataTypeFixedString>(16), "initial_address"},
|
||||
{DataTypeFactory::instance().get("IPv6"), "initial_address"},
|
||||
{std::make_shared<DataTypeUInt16>(), "initial_port"},
|
||||
{std::make_shared<DataTypeUInt8>(), "interface"},
|
||||
{std::make_shared<DataTypeString>(), "os_user"},
|
||||
@ -73,29 +74,6 @@ Block QueryLogElement::createBlock()
|
||||
}
|
||||
|
||||
|
||||
static std::array<char, 16> IPv6ToBinary(const Poco::Net::IPAddress & address)
|
||||
{
|
||||
std::array<char, 16> 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();
|
||||
|
@ -6,8 +6,8 @@
|
||||
#include <DataTypes/DataTypeDateTime.h>
|
||||
#include <DataTypes/DataTypeDate.h>
|
||||
#include <DataTypes/DataTypeString.h>
|
||||
#include <DataTypes/DataTypeFixedString.h>
|
||||
#include <DataTypes/DataTypeArray.h>
|
||||
#include <DataTypes/DataTypeFactory.h>
|
||||
#include <Interpreters/QueryLog.h>
|
||||
#include <Interpreters/ProfileEventsExt.h>
|
||||
#include <Common/ClickHouseRevision.h>
|
||||
@ -44,11 +44,11 @@ Block QueryThreadLogElement::createBlock()
|
||||
{std::make_shared<DataTypeUInt8>(), "is_initial_query"},
|
||||
{std::make_shared<DataTypeString>(), "user"},
|
||||
{std::make_shared<DataTypeString>(), "query_id"},
|
||||
{std::make_shared<DataTypeFixedString>(16), "address"},
|
||||
{DataTypeFactory::instance().get("IPv6"), "address"},
|
||||
{std::make_shared<DataTypeUInt16>(), "port"},
|
||||
{std::make_shared<DataTypeString>(), "initial_user"},
|
||||
{std::make_shared<DataTypeString>(), "initial_query_id"},
|
||||
{std::make_shared<DataTypeFixedString>(16), "initial_address"},
|
||||
{DataTypeFactory::instance().get("IPv6"), "initial_address"},
|
||||
{std::make_shared<DataTypeUInt16>(), "initial_port"},
|
||||
{std::make_shared<DataTypeUInt8>(), "interface"},
|
||||
{std::make_shared<DataTypeString>(), "os_user"},
|
||||
|
@ -1,12 +1,14 @@
|
||||
#include <DataTypes/DataTypeString.h>
|
||||
#include <DataTypes/DataTypesNumber.h>
|
||||
#include <DataTypes/DataTypeArray.h>
|
||||
#include <DataTypes/DataTypeFactory.h>
|
||||
#include <Interpreters/ProcessList.h>
|
||||
#include <Storages/System/StorageSystemProcesses.h>
|
||||
#include <Interpreters/Context.h>
|
||||
#include <Core/Settings.h>
|
||||
#include <Interpreters/ProfileEventsExt.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <Common/IPv6ToBinary.h>
|
||||
#include <Columns/ColumnsNumber.h>
|
||||
#include <Columns/ColumnArray.h>
|
||||
|
||||
@ -21,12 +23,12 @@ NamesAndTypesList StorageSystemProcesses::getNamesAndTypes()
|
||||
|
||||
{"user", std::make_shared<DataTypeString>()},
|
||||
{"query_id", std::make_shared<DataTypeString>()},
|
||||
{"address", std::make_shared<DataTypeString>()},
|
||||
{"address", DataTypeFactory::instance().get("IPv6")},
|
||||
{"port", std::make_shared<DataTypeUInt16>()},
|
||||
|
||||
{"initial_user", std::make_shared<DataTypeString>()},
|
||||
{"initial_query_id", std::make_shared<DataTypeString>()},
|
||||
{"initial_address", std::make_shared<DataTypeString>()},
|
||||
{"initial_address", DataTypeFactory::instance().get("IPv6")},
|
||||
{"initial_port", std::make_shared<DataTypeUInt16>()},
|
||||
|
||||
{"interface", std::make_shared<DataTypeUInt8>()},
|
||||
@ -34,10 +36,10 @@ NamesAndTypesList StorageSystemProcesses::getNamesAndTypes()
|
||||
{"os_user", std::make_shared<DataTypeString>()},
|
||||
{"client_hostname", std::make_shared<DataTypeString>()},
|
||||
{"client_name", std::make_shared<DataTypeString>()},
|
||||
{"client_revision", std::make_shared<DataTypeUInt64>()},
|
||||
{"client_version_major", std::make_shared<DataTypeUInt64>()},
|
||||
{"client_version_minor", std::make_shared<DataTypeUInt64>()},
|
||||
{"client_version_patch", std::make_shared<DataTypeUInt64>()},
|
||||
{"client_revision", std::make_shared<DataTypeUInt64>()},
|
||||
|
||||
{"http_method", std::make_shared<DataTypeUInt8>()},
|
||||
{"http_user_agent", std::make_shared<DataTypeString>()},
|
||||
@ -71,26 +73,34 @@ void StorageSystemProcesses::fillData(MutableColumns & res_columns, const Contex
|
||||
for (const auto & process : info)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
res_columns[i++]->insert(process.client_info.query_kind == ClientInfo::QueryKind::INITIAL_QUERY);
|
||||
|
||||
res_columns[i++]->insert(process.client_info.current_user);
|
||||
res_columns[i++]->insert(process.client_info.current_query_id);
|
||||
res_columns[i++]->insert(process.client_info.current_address.host().toString());
|
||||
res_columns[i++]->insertData(IPv6ToBinary(process.client_info.current_address.host()).data(), 16);
|
||||
res_columns[i++]->insert(process.client_info.current_address.port());
|
||||
|
||||
res_columns[i++]->insert(process.client_info.initial_user);
|
||||
res_columns[i++]->insert(process.client_info.initial_query_id);
|
||||
res_columns[i++]->insert(process.client_info.initial_address.host().toString());
|
||||
res_columns[i++]->insertData(IPv6ToBinary(process.client_info.initial_address.host()).data(), 16);
|
||||
res_columns[i++]->insert(process.client_info.initial_address.port());
|
||||
|
||||
res_columns[i++]->insert(UInt64(process.client_info.interface));
|
||||
|
||||
res_columns[i++]->insert(process.client_info.os_user);
|
||||
res_columns[i++]->insert(process.client_info.client_hostname);
|
||||
res_columns[i++]->insert(process.client_info.client_name);
|
||||
res_columns[i++]->insert(process.client_info.client_revision);
|
||||
res_columns[i++]->insert(process.client_info.client_version_major);
|
||||
res_columns[i++]->insert(process.client_info.client_version_minor);
|
||||
res_columns[i++]->insert(process.client_info.client_version_patch);
|
||||
res_columns[i++]->insert(process.client_info.client_revision);
|
||||
|
||||
res_columns[i++]->insert(UInt64(process.client_info.http_method));
|
||||
res_columns[i++]->insert(process.client_info.http_user_agent);
|
||||
|
||||
res_columns[i++]->insert(process.client_info.quota_key);
|
||||
|
||||
res_columns[i++]->insert(process.elapsed_seconds);
|
||||
res_columns[i++]->insert(process.is_cancelled);
|
||||
res_columns[i++]->insert(process.read_rows);
|
||||
|
Loading…
Reference in New Issue
Block a user