]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
feat(dnsdist): Add OT trace for each rule 16383/head
authorPieter Lexis <pieter.lexis@powerdns.com>
Mon, 27 Oct 2025 19:15:30 +0000 (20:15 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Tue, 28 Oct 2025 09:56:01 +0000 (10:56 +0100)
pdns/dnsdistdist/dnsdist.cc
regression-tests.dnsdist/test_OpenTelemetryTracing.py

index d64c5d6fe0d69fc887f456369001526fc5ca95dc..787bd72d9e0b57273b04560195c1f9017843f9df 100644 (file)
@@ -466,7 +466,16 @@ bool applyRulesToResponse(const std::vector<dnsdist::rules::ResponseRuleAction>&
 
   DNSResponseAction::Action action = DNSResponseAction::Action::None;
   std::string ruleresult;
+  SpanID parentSpanID;
+  if (auto tracer = dnsResponse.ids.getTracer(); tracer != nullptr && dnsResponse.ids.tracingEnabled) {
+    parentSpanID = tracer->getLastSpanID();
+  }
+
   for (const auto& rrule : respRuleActions) {
+    pdns::trace::dnsdist::Tracer::Closer ruleCloser;
+    if (auto tracer = dnsResponse.ids.getTracer(); tracer != nullptr && dnsResponse.ids.tracingEnabled) {
+      ruleCloser = tracer->openSpan("Rule: " + rrule.d_name, parentSpanID);
+    }
     if (rrule.d_rule->matches(&dnsResponse)) {
       ++rrule.d_rule->d_matches;
       action = (*rrule.d_action)(&dnsResponse, &ruleresult);
@@ -522,7 +531,7 @@ bool processResponseAfterRules(PacketBuffer& response, DNSResponse& dnsResponse,
 {
   pdns::trace::dnsdist::Tracer::Closer closer;
   if (auto tracer = dnsResponse.ids.getTracer(); tracer != nullptr && dnsResponse.ids.tracingEnabled) {
-    closer = tracer->openSpan("processResponseAfterRules", tracer->getLastSpanID());
+    closer = tracer->openSpan("processResponseAfterRules", tracer->getLastSpanIDForName("processResponse"));
   }
   bool zeroScope = false;
   if (!fixUpResponse(response, dnsResponse.ids.qname, dnsResponse.ids.origFlags, dnsResponse.ids.ednsAdded, dnsResponse.ids.ecsAdded, dnsResponse.ids.useZeroScope ? &zeroScope : nullptr)) {
@@ -1031,11 +1040,21 @@ static bool applyRulesChainToQuery(const std::vector<dnsdist::rules::RuleAction>
   string ruleresult;
   bool drop = false;
 
+  SpanID parentSpanID;
+  if (auto tracer = dnsQuestion.ids.getTracer(); tracer != nullptr) {
+    parentSpanID = tracer->getLastSpanID();
+  }
+
   for (const auto& rule : rules) {
     if (!rule.d_rule->matches(&dnsQuestion)) {
       continue;
     }
 
+    pdns::trace::dnsdist::Tracer::Closer ruleCloser;
+    if (auto tracer = dnsQuestion.ids.getTracer(); tracer != nullptr) {
+      ruleCloser = tracer->openSpan("Rule: " + rule.d_name, parentSpanID);
+    }
+
     rule.d_rule->d_matches++;
     action = (*rule.d_action)(&dnsQuestion, &ruleresult);
     if (processRulesResult(action, dnsQuestion, ruleresult, drop)) {
@@ -1461,7 +1480,8 @@ static ServerPolicy::SelectedBackend selectBackendForOutgoingQuery(DNSQuestion&
 {
   pdns::trace::dnsdist::Tracer::Closer closer;
   if (auto tracer = dnsQuestion.ids.getTracer(); tracer != nullptr && dnsQuestion.ids.tracingEnabled) {
-    closer = tracer->openSpan("selectBackendForOutgoingQuery", tracer->getLastSpanID());
+    // Not exactly processQuery, but it works for now
+    closer = tracer->openSpan("selectBackendForOutgoingQuery", tracer->getLastSpanIDForName("processQuery"));
   }
 
   const auto& policy = serverPool.policy != nullptr ? *serverPool.policy : *dnsdist::configuration::getCurrentRuntimeConfiguration().d_lbPolicy;
index a4176867f03fb0b39001b02cd4b2338827be4caa..fc7a34bfa2a0e5658e676dce92a08dc186b0c0a5 100644 (file)
@@ -117,9 +117,11 @@ class DNSDistOpenTelemetryProtobufBaseTest(DNSDistOpenTelemetryProtobufTest):
         funcs = {
             "processQuery",
             "applyRulesToQuery",
+            "Rule: Enable tracing",
             "selectBackendForOutgoingQuery",
             "processResponse",
             "applyRulesToResponse",
+            "Rule: Do PB logging",
         }
 
         if useTCP:
@@ -195,8 +197,8 @@ newServer{address="127.0.0.1:%d"}
 rl = newRemoteLogger('127.0.0.1:%d')
 setOpenTelemetryTracing(true)
 
-addAction(AllRule(), SetTraceAction(true))
-addResponseAction(AllRule(), RemoteLogResponseAction(rl))
+addAction(AllRule(), SetTraceAction(true), {name="Enable tracing"})
+addResponseAction(AllRule(), RemoteLogResponseAction(rl), {name="Do PB logging"})
 """
 
     def testBasic(self):
@@ -260,8 +262,8 @@ newServer{address="127.0.0.1:%d"}
 rl = newRemoteLogger('127.0.0.1:%d')
 setOpenTelemetryTracing(true)
 
-addAction(AllRule(), SetTraceAction(true))
-addResponseAction(AllRule(), RemoteLogResponseAction(rl, nil, false, {}, {}, true))
+addAction(AllRule(), SetTraceAction(true), {name="Enable tracing"})
+addResponseAction(AllRule(), RemoteLogResponseAction(rl, nil, false, {}, {}, true), {name="Do PB logging"})
 """
 
     def testBasic(self):