]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Allow multiple attributes for spans
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 24 Sep 2025 11:53:39 +0000 (13:53 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 24 Sep 2025 11:53:39 +0000 (13:53 +0200)
Signed-off-by: Otto Moerbeek <otto.moerbeek@open-xchange.com>
pdns/protozero-trace.hh
pdns/recursordist/pdns_recursor.cc
pdns/recursordist/rec-eventtrace.cc
pdns/recursordist/rec-eventtrace.hh
pdns/recursordist/rec-main.cc
pdns/recursordist/syncres.cc

index a915dc331aa0357e1a2d52a6de9da03a887c4cbc..6abe38bab0d9c24e40aeb676f1432b4532f6896f 100644 (file)
@@ -694,9 +694,11 @@ struct TracesData
     return data;
   }
 
-  static TracesData boilerPlate(std::string&& service, std::string&& req, std::vector<Span>&& spans)
+  static TracesData boilerPlate(std::string&& service, std::string&& req, std::vector<Span>&& spans, const std::vector<KeyValue>& attributes)
   {
-    spans.at(0).attributes.push_back({"arg", {std::move(req)}});
+    auto& spanAttrs =  spans.at(0).attributes;
+    spanAttrs.push_back({"arg", {std::move(req)}});
+    spanAttrs.insert(spanAttrs.end(), attributes.begin(), attributes.end());
     return TracesData{
       .resource_spans = {pdns::trace::ResourceSpans{.resource = {.attributes = {{"service.name", {{std::move(service)}}}}}, .scope_spans = {{.spans = std::move(spans)}}}}};
   }
index 62788544a52596cbe4e82cd8558dc228123db77c..7994067f4698b025fa88b2276f170033b7d92d75 100644 (file)
@@ -1860,7 +1860,7 @@ void startDoResolve(void* arg) // NOLINT(readability-function-cognitive-complexi
         pbMessage.addEvents(resolver.d_eventTrace);
       }
       if (resolver.d_eventTrace.enabled() && SyncRes::eventTraceEnabled(SyncRes::event_trace_to_ot)) {
-        auto otTrace = pdns::trace::TracesData::boilerPlate("rec", comboWriter->d_mdp.d_qname.toLogString() + '/' + QType(comboWriter->d_mdp.d_qtype).toString(), resolver.d_eventTrace.convertToOT(resolver.d_otTrace));
+        auto otTrace = pdns::trace::TracesData::boilerPlate("rec", comboWriter->d_mdp.d_qname.toLogString(), resolver.d_eventTrace.convertToOT(resolver.d_otTrace), {{"qtype", {QType(comboWriter->d_mdp.d_qtype).toString()}}});
         string otData = otTrace.encode();
         pbMessage.setOpenTelemetryData(otData);
       }
index 33cde98d62363c2d1209f263871de787d55061a0..8ec7fbbbb7c704e76d1ae4874eeb772488d393a5 100644 (file)
@@ -65,6 +65,20 @@ static void addValue(const RecEventTrace::Entry& event, Span& work, bool start)
   else {
     work.attributes.emplace_back(KeyValue{std::move(key), {RecEventTrace::toString(event.d_value)}});
   }
+  for (const auto& [ekey, value] : event.d_extraValues) {
+    if (std::holds_alternative<bool>(value)) {
+      work.attributes.emplace_back(KeyValue{ekey, {std::get<bool>(value)}});
+    }
+    else if (std::holds_alternative<int64_t>(value)) {
+      work.attributes.emplace_back(KeyValue{ekey, {std::get<int64_t>(value)}});
+    }
+    else if (std::holds_alternative<std::string>(value)) {
+      work.attributes.emplace_back(KeyValue{ekey, {std::get<std::string>(value)}});
+    }
+    else {
+      work.attributes.emplace_back(KeyValue{ekey, {RecEventTrace::toString(value)}});
+    }
+  }
 }
 
 // The event trace uses start-stop records which need to be mapped to OpenTelemetry Spans, which is a
index 74117f0e6eefbadaff52c5337e91e55265beb4a4..d9ccfee153029b917d41ae29eeb741c3476e6107 100644 (file)
@@ -142,6 +142,7 @@ public:
     {
     }
     Value_t d_value;
+    std::vector<std::pair<string,Value_t>> d_extraValues;
     std::string d_custom;
     int64_t d_ts;
     size_t d_parent;
@@ -229,6 +230,15 @@ public:
     return add(eventType, Value_t(value), start, match, 0);
   }
 
+  void addExtraValues(size_t index, std::vector<std::pair<std::string, Value_t>>&& values)
+  {
+    assert(d_status != Invalid);
+    if (d_status == Disabled) {
+      return;
+    }
+    d_events.at(index).d_extraValues = std::move(values);
+  }
+
   void clear()
   {
     d_events.clear();
index 11773172c72fb0af5bebb1d48a5760b89bca6fd7..a2e902a3f8b296372809fcd041aabf5364f26e0d 100644 (file)
@@ -633,7 +633,7 @@ void protobufLogResponse(const DNSName& qname, QType qtype,
     pbMessage.addEvents(eventTrace);
   }
   if (eventTrace.enabled() && (SyncRes::s_event_trace_enabled & SyncRes::event_trace_to_ot) != 0) {
-    auto trace = pdns::trace::TracesData::boilerPlate("rec", qname.toLogString() + '/' + qtype.toString(), eventTrace.convertToOT(otTrace));
+    auto trace = pdns::trace::TracesData::boilerPlate("rec", qname.toLogString(), eventTrace.convertToOT(otTrace), {{"qtype", {qtype.toString()}}});
     pbMessage.setOpenTelemetryData(trace.encode());
   }
   pbMessage.addPolicyTags(policyTags);
index 27ce77b7d62cd8ba22e344de8c85c6615477778c..79ed23ef6cdc4167374efdb3aaf6ac1aef9f3333 100644 (file)
@@ -5453,7 +5453,8 @@ bool SyncRes::doResolveAtThisIP(const std::string& prefix, const DNSName& qname,
       LOG(prefix << qname << ": Adding EDNS Client Subnet Mask " << ednsmask->toString() << " to query" << endl);
       s_ecsqueries++;
     }
-    auto match = d_eventTrace.add(RecEventTrace::AuthRequest, qname.toLogString() + '/' + qtype.toString() + '/' + remoteIP.toString(), true, 0);
+    auto match = d_eventTrace.add(RecEventTrace::AuthRequest, qname.toLogString(), true, 0);
+    d_eventTrace.addExtraValues(match, {{ "qtype", qtype.toString()}, {"ip", remoteIP.toStringWithPortExcept(53)}});
     updateQueryCounts(prefix, qname, remoteIP, doTCP, doDoT);
     resolveret = asyncresolveWrapper(LogObject(prefix), remoteIP, d_doDNSSEC, qname, auth, qtype.getCode(),
                                      doTCP, sendRDQuery, &d_now, ednsmask, &lwr, &chained, nsName); // <- we go out on the wire!