From: Otto Moerbeek Date: Mon, 20 Oct 2025 13:49:03 +0000 (+0200) Subject: Housekeeping of global and thread-local data of OT conditions X-Git-Tag: rec-5.4.0-alpha1~103^2~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9508f08959ffbff44b483d1d4d0ab7e8e6fb5a1c;p=thirdparty%2Fpdns.git Housekeeping of global and thread-local data of OT conditions Signed-off-by: Otto Moerbeek --- diff --git a/pdns/recursordist/rec-lua-conf.hh b/pdns/recursordist/rec-lua-conf.hh index dd71674396..d80f446895 100644 --- a/pdns/recursordist/rec-lua-conf.hh +++ b/pdns/recursordist/rec-lua-conf.hh @@ -98,6 +98,17 @@ struct ProxyByTableValue using ProxyMapping = NetmaskTree; +struct OpenTelemetryTraceCondition +{ + SuffixMatchTree d_qnames; + std::unordered_set d_qtypes; + std::optional d_qid; + bool d_edns_option_required{false}; + bool d_traceid_only{false}; +}; + +using OpenTelemetryTraceConditions = NetmaskTree; + using rpzOptions_t = std::unordered_map>>>; class LuaConfigItems diff --git a/pdns/recursordist/rec-main.cc b/pdns/recursordist/rec-main.cc index 556967781d..75f9452c75 100644 --- a/pdns/recursordist/rec-main.cc +++ b/pdns/recursordist/rec-main.cc @@ -139,6 +139,9 @@ std::vector RecThreadInfo::s_threadInfos; std::unique_ptr g_proxyMapping; // new threads needs this to be setup thread_local std::unique_ptr t_proxyMapping; +std::unique_ptr g_OTConditions; // new threads needs this to be setup +thread_local std::unique_ptr t_OTConditions; + bool RecThreadInfo::s_weDistributeQueries; // if true, 1 or more threads listen on the incoming query sockets and distribute them to workers unsigned int RecThreadInfo::s_numDistributorThreads; unsigned int RecThreadInfo::s_numUDPWorkerThreads; @@ -2902,7 +2905,8 @@ static pair doYamlConfig(int argc, char* argv[], const pdns::rust::se ::arg().parse(argc, argv); ProxyMapping proxyMapping; LuaConfigItems lci; - pdns::settings::rec::fromBridgeStructToLuaConfig(settings, lci, proxyMapping); + OpenTelemetryTraceConditions conditions; + pdns::settings::rec::fromBridgeStructToLuaConfig(settings, lci, proxyMapping, conditions); auto yaml = settings.to_yaml_string(); cout << yaml << endl; } diff --git a/pdns/recursordist/rec-main.hh b/pdns/recursordist/rec-main.hh index d378e14a0f..77427cceb2 100644 --- a/pdns/recursordist/rec-main.hh +++ b/pdns/recursordist/rec-main.hh @@ -248,6 +248,7 @@ extern RecursorControlChannel g_rcc; // only active in the handler thread extern thread_local std::unique_ptr t_proxyMapping; using ProxyMappingStats_t = std::unordered_map; +extern thread_local std::unique_ptr t_OTConditions; extern pdns::RateLimitedLog g_rateLimitedLogger; #ifdef NOD_ENABLED diff --git a/pdns/recursordist/rec-rust-lib/cxxsettings.hh b/pdns/recursordist/rec-rust-lib/cxxsettings.hh index cf4fc318cb..b6253e89df 100644 --- a/pdns/recursordist/rec-rust-lib/cxxsettings.hh +++ b/pdns/recursordist/rec-rust-lib/cxxsettings.hh @@ -52,8 +52,8 @@ void readYamlAllowFromFile(const std::string& filename, ::rust::Vec<::rust::Stri void readYamlAllowNotifyForFile(const std::string& filename, ::rust::Vec<::rust::String>& vec, Logr::log_t log); void setArgsForZoneRelatedSettings(pdns::rust::settings::rec::Recursorsettings& settings); void setArgsForACLRelatedSettings(pdns::rust::settings::rec::Recursorsettings& settings); -void fromLuaConfigToBridgeStruct(LuaConfigItems& luaConfig, const ProxyMapping& proxyMapping, pdns::rust::settings::rec::Recursorsettings& settings); -void fromBridgeStructToLuaConfig(const pdns::rust::settings::rec::Recursorsettings& settings, LuaConfigItems& luaConfig, ProxyMapping& proxyMapping); + void fromLuaConfigToBridgeStruct(LuaConfigItems& luaConfig, const ProxyMapping& proxyMapping, pdns::rust::settings::rec::Recursorsettings& settings); + void fromBridgeStructToLuaConfig(const pdns::rust::settings::rec::Recursorsettings& settings, LuaConfigItems& luaConfig, ProxyMapping& proxyMapping, OpenTelemetryTraceConditions& conditions); bool luaItemSet(const pdns::rust::settings::rec::Recursorsettings& settings); YamlSettingsStatus tryReadYAML(const string& yamlconfigname, bool setGlobals, bool& yamlSettings, bool& luaSettingsInYAML, rust::settings::rec::Recursorsettings& settings, Logr::log_t startupLog, Logr::Priority level = Logr::Debug); } diff --git a/pdns/recursordist/rec-rust-lib/cxxsupport.cc b/pdns/recursordist/rec-rust-lib/cxxsupport.cc index cfe7a7dfaf..6be5d2432e 100644 --- a/pdns/recursordist/rec-rust-lib/cxxsupport.cc +++ b/pdns/recursordist/rec-rust-lib/cxxsupport.cc @@ -1332,9 +1332,31 @@ void fromRustToLuaConfig(const rust::Vec& settings, OpenTelemetryTraceConditions& conditions) +{ + for (const auto& setting : settings) { + OpenTelemetryTraceCondition condition; + for (const auto& qname : setting.qnames) { + condition.d_qnames.add(DNSName(std::string(qname)), true); + } + for (const auto& qtype : setting.qtypes) { + condition.d_qtypes.insert(QType::chartocode(std::string(qtype).data())); + } + if (setting.qid != std::numeric_limits::max()) { + condition.d_qid = setting.qid; + } + condition.d_edns_option_required = setting.edns_option_required; + condition.d_traceid_only = setting.traceid_only; + for (const auto& acl : setting.acls) { + conditions.insert(std::string(acl)).second = condition; + } + } +} } -void pdns::settings::rec::fromBridgeStructToLuaConfig(const pdns::rust::settings::rec::Recursorsettings& settings, LuaConfigItems& luaConfig, ProxyMapping& proxyMapping) +void pdns::settings::rec::fromBridgeStructToLuaConfig(const pdns::rust::settings::rec::Recursorsettings& settings, LuaConfigItems& luaConfig, ProxyMapping& proxyMapping, OpenTelemetryTraceConditions& conditions) { fromRustToLuaConfig(settings.dnssec, luaConfig); luaConfig.protobufMaskV4 = settings.logging.protobuf_mask_v4; @@ -1357,6 +1379,7 @@ void pdns::settings::rec::fromBridgeStructToLuaConfig(const pdns::rust::settings fromRustToLuaConfig(settings.recursor.allowed_additional_qtypes, luaConfig.allowAdditionalQTypes); fromRustToLuaConfig(settings.recursor.forwarding_catalog_zones, luaConfig.catalogzones); fromRustToLuaConfig(settings.incoming.proxymappings, proxyMapping); + fromRustToOTTraceConditions(settings.logging.opentelemetry_trace_conditions, conditions); } // Return true if an item that's (also) a Lua config item is set diff --git a/pdns/recursordist/rec_channel_rec.cc b/pdns/recursordist/rec_channel_rec.cc index c9dcc86836..b6ec2c6214 100644 --- a/pdns/recursordist/rec_channel_rec.cc +++ b/pdns/recursordist/rec_channel_rec.cc @@ -1881,6 +1881,17 @@ static void* pleaseSupplantProxyMapping(const ProxyMapping& proxyMapping) return nullptr; } +static void* pleaseSupplantOTConditions(const OpenTelemetryTraceConditions& conditions) +{ + if (conditions.empty()) { + t_OTConditions = nullptr; + } + else { + t_OTConditions = std::make_unique(conditions); + } + return nullptr; +} + static RecursorControlChannel::Answer help(ArgIterator /* begin */, ArgIterator /* end */) { static const std::map commands = { @@ -1964,9 +1975,11 @@ static RecursorControlChannel::Answer help(ArgIterator /* begin */, ArgIterator RecursorControlChannel::Answer luaconfig(bool broadcast) { ProxyMapping proxyMapping; + OpenTelemetryTraceConditions conditions; LuaConfigItems lci; lci.d_slog = g_slog; extern std::unique_ptr g_proxyMapping; + extern std::unique_ptr g_OTConditions; if (!g_luaSettingsInYAML) { try { if (::arg()["lua-config-file"].empty()) { @@ -2009,16 +2022,18 @@ RecursorControlChannel::Answer luaconfig(bool broadcast) } auto generation = g_luaconfs.getLocal()->generation; lci.generation = generation + 1; - pdns::settings::rec::fromBridgeStructToLuaConfig(settings, lci, proxyMapping); + pdns::settings::rec::fromBridgeStructToLuaConfig(settings, lci, proxyMapping, conditions); activateLuaConfig(lci); lci = g_luaconfs.getCopy(); if (broadcast) { startLuaConfigDelayedThreads(lci, lci.generation); broadcastFunction([pmap = std::move(proxyMapping)] { return pleaseSupplantProxyMapping(pmap); }); + broadcastFunction([conds = std::move(conditions)] { return pleaseSupplantOTConditions(conds); }); } else { // Initial proxy mapping g_proxyMapping = proxyMapping.empty() ? nullptr : std::make_unique(proxyMapping); + g_OTConditions = conditions.empty() ? nullptr : std::make_unique(conditions); } TCPOutConnectionManager::setupOutgoingTLSConfigTables(settings); diff --git a/pdns/recursordist/test-settings.cc b/pdns/recursordist/test-settings.cc index 4cf42254b7..2bde91451e 100644 --- a/pdns/recursordist/test-settings.cc +++ b/pdns/recursordist/test-settings.cc @@ -466,7 +466,8 @@ BOOST_AUTO_TEST_CASE(test_yaml_ta_merge) settings.validate(); LuaConfigItems lua1; ProxyMapping proxyMapping; - pdns::settings::rec::fromBridgeStructToLuaConfig(settings, lua1, proxyMapping); + OpenTelemetryTraceConditions conditions; + pdns::settings::rec::fromBridgeStructToLuaConfig(settings, lua1, proxyMapping, conditions); BOOST_CHECK_EQUAL(lua1.dsAnchors.size(), 2U); BOOST_CHECK_EQUAL(lua1.dsAnchors[DNSName(".")].size(), 1U); BOOST_CHECK_EQUAL(lua1.dsAnchors[DNSName(".")].begin()->getZoneRepresentation(), "19718 13 2 8acbb0cd28f41250a80a491389424d341522d946b0da0c0291f2d3d771d7805a"); @@ -484,7 +485,7 @@ BOOST_AUTO_TEST_CASE(test_yaml_ta_merge) settings = pdns::rust::settings::rec::parse_yaml_string(yaml2); settings.validate(); LuaConfigItems lua2; - pdns::settings::rec::fromBridgeStructToLuaConfig(settings, lua2, proxyMapping); + pdns::settings::rec::fromBridgeStructToLuaConfig(settings, lua2, proxyMapping, conditions); BOOST_CHECK_EQUAL(lua2.dsAnchors.size(), 2U); BOOST_CHECK_EQUAL(lua2.dsAnchors[DNSName(".")].size(), 2U); BOOST_CHECK_EQUAL(lua2.dsAnchors[DNSName("a")].size(), 2U); @@ -1054,7 +1055,8 @@ recordcache: // create a Lua config based on YAML LuaConfigItems luaConfig; ProxyMapping proxyMapping; - pdns::settings::rec::fromBridgeStructToLuaConfig(settings, luaConfig, proxyMapping); + OpenTelemetryTraceConditions conditions; + pdns::settings::rec::fromBridgeStructToLuaConfig(settings, luaConfig, proxyMapping, conditions); // Create YAML, given a Lua config auto newsettings = pdns::rust::settings::rec::parse_yaml_string("");