#include #include #include namespace DB { NamesAndTypesList StorageSystemGraphite::getNamesAndTypes() { return { {"config_name", std::make_shared()}, {"regexp", std::make_shared()}, {"function", std::make_shared()}, {"age", std::make_shared()}, {"precision", std::make_shared()}, {"priority", std::make_shared()}, {"is_default", std::make_shared()}, {"Tables.database", std::make_shared(std::make_shared())}, {"Tables.table", std::make_shared(std::make_shared())}, }; } /* * Looking for (Replicated)*GraphiteMergeTree and get all configuration parameters for them */ static StorageSystemGraphite::Configs getConfigs() { const Databases databases = DatabaseCatalog::instance().getDatabases(); StorageSystemGraphite::Configs graphite_configs; for (const auto & db : databases) { /// Lazy database can not contain MergeTree tables if (db.second->getEngineName() == "Lazy") continue; for (auto iterator = db.second->getTablesIterator(); iterator->isValid(); iterator->next()) { const auto & table = iterator->table(); const MergeTreeData * table_data = dynamic_cast(table.get()); if (!table_data) continue; if (table_data->merging_params.mode == MergeTreeData::MergingParams::Graphite) { const String & config_name = table_data->merging_params.graphite_params.config_name; auto table_id = table_data->getStorageID(); if (!graphite_configs.count(config_name)) { StorageSystemGraphite::Config new_config = { table_data->merging_params.graphite_params, { table_id.database_name }, { table_id.table_name }, }; graphite_configs.emplace(config_name, new_config); } else { graphite_configs[config_name].databases.emplace_back(table_id.database_name); graphite_configs[config_name].tables.emplace_back(table_id.table_name); } } } } return graphite_configs; } void StorageSystemGraphite::fillData(MutableColumns & res_columns, const Context &, const SelectQueryInfo &) const { Configs graphite_configs = getConfigs(); for (const auto & config : graphite_configs) { UInt16 priority = 0; for (const auto & pattern : config.second.graphite_params.patterns) { bool is_default = pattern.regexp == nullptr; String regexp; String function; if (is_default) { priority = std::numeric_limits::max(); } else { priority++; regexp = pattern.regexp_str; } if (pattern.function) { function = pattern.function->getName(); } if (!pattern.retentions.empty()) { for (const auto & retention : pattern.retentions) { size_t i = 0; res_columns[i++]->insert(config.first); res_columns[i++]->insert(regexp); res_columns[i++]->insert(function); res_columns[i++]->insert(retention.age); res_columns[i++]->insert(retention.precision); res_columns[i++]->insert(priority); res_columns[i++]->insert(is_default); res_columns[i++]->insert(config.second.databases); res_columns[i++]->insert(config.second.tables); } } else { size_t i = 0; res_columns[i++]->insert(config.first); res_columns[i++]->insert(regexp); res_columns[i++]->insert(function); res_columns[i++]->insertDefault(); res_columns[i++]->insertDefault(); res_columns[i++]->insert(priority); res_columns[i++]->insert(is_default); res_columns[i++]->insert(config.second.databases); res_columns[i++]->insert(config.second.tables); } } } } }