From: Otto Moerbeek Date: Wed, 24 Sep 2025 11:53:39 +0000 (+0200) Subject: Allow multiple attributes for spans X-Git-Tag: rec-5.4.0-alpha1~178^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8674286858c4a988a51981d53f3e91d760d0f680;p=thirdparty%2Fpdns.git Allow multiple attributes for spans Signed-off-by: Otto Moerbeek --- diff --git a/pdns/protozero-trace.hh b/pdns/protozero-trace.hh index a915dc331a..6abe38bab0 100644 --- a/pdns/protozero-trace.hh +++ b/pdns/protozero-trace.hh @@ -694,9 +694,11 @@ struct TracesData return data; } - static TracesData boilerPlate(std::string&& service, std::string&& req, std::vector&& spans) + static TracesData boilerPlate(std::string&& service, std::string&& req, std::vector&& spans, const std::vector& 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)}}}}}; } diff --git a/pdns/recursordist/pdns_recursor.cc b/pdns/recursordist/pdns_recursor.cc index 62788544a5..7994067f46 100644 --- a/pdns/recursordist/pdns_recursor.cc +++ b/pdns/recursordist/pdns_recursor.cc @@ -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); } diff --git a/pdns/recursordist/rec-eventtrace.cc b/pdns/recursordist/rec-eventtrace.cc index 33cde98d62..8ec7fbbbb7 100644 --- a/pdns/recursordist/rec-eventtrace.cc +++ b/pdns/recursordist/rec-eventtrace.cc @@ -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(value)) { + work.attributes.emplace_back(KeyValue{ekey, {std::get(value)}}); + } + else if (std::holds_alternative(value)) { + work.attributes.emplace_back(KeyValue{ekey, {std::get(value)}}); + } + else if (std::holds_alternative(value)) { + work.attributes.emplace_back(KeyValue{ekey, {std::get(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 diff --git a/pdns/recursordist/rec-eventtrace.hh b/pdns/recursordist/rec-eventtrace.hh index 74117f0e6e..d9ccfee153 100644 --- a/pdns/recursordist/rec-eventtrace.hh +++ b/pdns/recursordist/rec-eventtrace.hh @@ -142,6 +142,7 @@ public: { } Value_t d_value; + std::vector> 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>&& values) + { + assert(d_status != Invalid); + if (d_status == Disabled) { + return; + } + d_events.at(index).d_extraValues = std::move(values); + } + void clear() { d_events.clear(); diff --git a/pdns/recursordist/rec-main.cc b/pdns/recursordist/rec-main.cc index 11773172c7..a2e902a3f8 100644 --- a/pdns/recursordist/rec-main.cc +++ b/pdns/recursordist/rec-main.cc @@ -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); diff --git a/pdns/recursordist/syncres.cc b/pdns/recursordist/syncres.cc index 27ce77b7d6..79ed23ef6c 100644 --- a/pdns/recursordist/syncres.cc +++ b/pdns/recursordist/syncres.cc @@ -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!