]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Housekeeping of global and thread-local data of OT conditions
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Mon, 20 Oct 2025 13:49:03 +0000 (15:49 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Mon, 10 Nov 2025 14:14:35 +0000 (15:14 +0100)
Signed-off-by: Otto Moerbeek <otto.moerbeek@open-xchange.com>
pdns/recursordist/rec-lua-conf.hh
pdns/recursordist/rec-main.cc
pdns/recursordist/rec-main.hh
pdns/recursordist/rec-rust-lib/cxxsettings.hh
pdns/recursordist/rec-rust-lib/cxxsupport.cc
pdns/recursordist/rec_channel_rec.cc
pdns/recursordist/test-settings.cc

index dd7167439679afcb5d3c28106caf3fe5af2076b4..d80f4468954a9496344469279ce49dfffd15b40d 100644 (file)
@@ -98,6 +98,17 @@ struct ProxyByTableValue
 
 using ProxyMapping = NetmaskTree<ProxyByTableValue, Netmask>;
 
+struct OpenTelemetryTraceCondition
+{
+  SuffixMatchTree<bool> d_qnames;
+  std::unordered_set<QType> d_qtypes;
+  std::optional<uint16_t> d_qid;
+  bool d_edns_option_required{false};
+  bool d_traceid_only{false};
+};
+
+using OpenTelemetryTraceConditions = NetmaskTree<OpenTelemetryTraceCondition>;
+
 using rpzOptions_t = std::unordered_map<std::string, boost::variant<bool, uint32_t, std::string, std::vector<std::pair<int, std::string>>>>;
 
 class LuaConfigItems
index 556967781d384ab127ebf9752cb9ccdfd9e4f8dd..75f9452c7576058b91be26988b30def628cb4542 100644 (file)
@@ -139,6 +139,9 @@ std::vector<RecThreadInfo> RecThreadInfo::s_threadInfos;
 std::unique_ptr<ProxyMapping> g_proxyMapping; // new threads needs this to be setup
 thread_local std::unique_ptr<ProxyMapping> t_proxyMapping;
 
+std::unique_ptr<OpenTelemetryTraceConditions> g_OTConditions; // new threads needs this to be setup
+thread_local std::unique_ptr<OpenTelemetryTraceConditions> 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<int, bool> 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;
   }
index d378e14a0f1d567e3ef43d61d1264451cee5de95..77427cceb28731756f06375aeee707caa874a132 100644 (file)
@@ -248,6 +248,7 @@ extern RecursorControlChannel g_rcc; // only active in the handler thread
 
 extern thread_local std::unique_ptr<ProxyMapping> t_proxyMapping;
 using ProxyMappingStats_t = std::unordered_map<Netmask, ProxyMappingCounts>;
+extern thread_local std::unique_ptr<OpenTelemetryTraceConditions> t_OTConditions;
 extern pdns::RateLimitedLog g_rateLimitedLogger;
 
 #ifdef NOD_ENABLED
index cf4fc318cb6ac0721531dc1b7d899e1fd4ac1008..b6253e89df2ce99ec767fabd22c73147d27bbe3d 100644 (file)
@@ -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);
 }
index cfe7a7dfafc1d1c95454f7bd201020cda2789efb..6be5d2432e0887ec32755beff6aa9c3fa76b6897 100644 (file)
@@ -1332,9 +1332,31 @@ void fromRustToLuaConfig(const rust::Vec<pdns::rust::settings::rec::ForwardingCa
     lua.emplace_back(std::move(fwcatz));
   }
 }
+
+
+void fromRustToOTTraceConditions(const rust::Vec<pdns::rust::settings::rec::OpenTelemetryTraceCondition>& 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<uint32_t>::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
index c9dcc86836af1cf551f79b6e5253798a19385e25..b6ec2c6214761b94abd71e48989f5fb563538d20 100644 (file)
@@ -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<OpenTelemetryTraceConditions>(conditions);
+  }
+  return nullptr;
+}
+
 static RecursorControlChannel::Answer help(ArgIterator /* begin */, ArgIterator /* end */)
 {
   static const std::map<std::string, std::string> 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<ProxyMapping> g_proxyMapping;
+  extern std::unique_ptr<OpenTelemetryTraceConditions> 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>(proxyMapping);
+      g_OTConditions = conditions.empty() ? nullptr : std::make_unique<OpenTelemetryTraceConditions>(conditions);
     }
     TCPOutConnectionManager::setupOutgoingTLSConfigTables(settings);
 
index 4cf42254b70446c29f24ad932e10457d9a139bc4..2bde91451e79a40fdbb0bcbacc1eeee36ff5e5e8 100644 (file)
@@ -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("");