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
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;
::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;
}
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
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);
}
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;
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
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 = {
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()) {
}
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);
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");
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);
// 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("");