]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
fix(dnsdist): make the rootspan the parent of processResponse
authorPieter Lexis <pieter.lexis@powerdns.com>
Tue, 14 Oct 2025 11:12:02 +0000 (13:12 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Tue, 14 Oct 2025 19:00:01 +0000 (21:00 +0200)
pdns/dnsdistdist/dnsdist-opentelemetry.cc
pdns/dnsdistdist/dnsdist-opentelemetry.hh
pdns/dnsdistdist/dnsdist.cc

index 60c64ac2d0ed72e32329a1c8cd999a6c7d292763..ab1185c9f290b27ce15527ae6d62b9ad373ac4da 100644 (file)
@@ -215,6 +215,21 @@ void Tracer::setSpanAttribute([[maybe_unused]] const SpanID& spanid, [[maybe_unu
 #endif
 }
 
+SpanID Tracer::getRootSpanID()
+{
+#ifdef DISABLE_PROTOBUF
+  return 0;
+#else
+  if (auto spans = d_preActivationSpans.read_only_lock(); spans->size() != 0) {
+    auto iter = std::find_if(spans->cbegin(), spans->cend(), [](const auto& span) { return span.parent_span_id == pdns::trace::s_emptySpanID; });
+    if (iter != spans->cend()) {
+      return iter->span_id;
+    }
+  }
+  return SpanID{};
+#endif
+}
+
 SpanID Tracer::getLastSpanID()
 {
 #ifdef DISABLE_PROTOBUF
index aa3de14ed8263551ecba9602dc30a43a5a1409a6..f3d5d27292a883292500f83f1865360b5d31c73e 100644 (file)
@@ -145,6 +145,13 @@ public:
    */
   void closeSpan(const SpanID& spanID);
 
+  /**
+   * @brief Get the top-most SpanID
+   *
+   * @return The SpanID of the root Span
+   */
+  [[nodiscard]] SpanID getRootSpanID();
+
   /**
    * @brief Get the last SpanID generated
    *
index c424d7e0a8f6071c5ad54cc1c675df4eebe6c0cd..4cfc5ebec35f010de45e107246d0c3c307797352 100644 (file)
@@ -591,7 +591,7 @@ bool processResponse(PacketBuffer& response, DNSResponse& dnsResponse, bool mute
 {
   pdns::trace::dnsdist::Tracer::Closer closer;
   if (auto tracer = dnsResponse.ids.getTracer(); tracer != nullptr && dnsResponse.ids.tracingEnabled) {
-    closer = tracer->openSpan("processResponse");
+    closer = tracer->openSpan("processResponse", tracer->getRootSpanID());
   }
 
   const auto& chains = dnsdist::configuration::getCurrentRuntimeConfiguration().d_ruleChains;