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)}}}}};
}
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);
}
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
{
}
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;
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();
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);
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!