t_Counters.updateSnap(g_regressionTestMode);
}
+ auto match = resolver.d_eventTrace.add(RecEventTrace::AnswerSent);
if (!comboWriter->d_tcp) {
struct msghdr msgh{};
struct iovec iov{};
tcpGuard.setHandled();
}
- resolver.d_eventTrace.add(RecEventTrace::AnswerSent);
+ resolver.d_eventTrace.add(RecEventTrace::AnswerSent, 0, false, match);
// Now do the per query changing part of the protobuf message
if (t_protobufServers.servers && !(luaconfsLocal->protobufExportConfig.taggedOnly && appliedPolicy.getName().empty() && comboWriter->d_policyTags.empty())) {
// mappedSource: the address we assume the query is coming from. Differs from source if table based mapping has been applied
static string* doProcessUDPQuestion(const std::string& question, const ComboAddress& fromaddr, const ComboAddress& destaddr, ComboAddress source, ComboAddress destination, const ComboAddress& mappedSource, struct timeval tval, int fileDesc, std::vector<ProxyProtocolValue>& proxyProtocolValues, RecEventTrace& eventTrace, pdns::trace::InitialSpanInfo& otTrace) // NOLINT(readability-function-cognitive-complexity): https://github.com/PowerDNS/pdns/issues/12791
{
+ auto newParent = eventTrace.add(RecEventTrace::ProcessUDP);
+ auto oldParent = eventTrace.setParent(newParent);
+ RecEventTrace::EventScope traceScope(oldParent, eventTrace);
RecThreadInfo::self().incNumberOfDistributedQueries();
gettimeofday(&g_now, nullptr);
if (tval.tv_sec != 0) {
// We do not have a SyncRes specific Lua context at this point yet, so ok to use t_pdl
if (needEDNSParse || (t_pdl && (t_pdl->hasGettagFunc() || t_pdl->hasGettagFFIFunc())) || dnsheader->opcode == static_cast<unsigned>(Opcode::Notify)) {
try {
+ auto parseMatch = eventTrace.add(RecEventTrace::PacketParse);
EDNSOptionViewMap ednsOptions;
ecsFound = false;
(g_gettagNeedsEDNSOptions || SyncRes::eventTraceEnabled(SyncRes::event_trace_to_ot)) ? &ednsOptions : nullptr,
ednsVersion);
+ eventTrace.add(RecEventTrace::PacketParse, 0, false, parseMatch);
qnameParsed = true;
ecsParsed = true;
if (SyncRes::eventTraceEnabled(SyncRes::event_trace_to_ot)) {
pdns::trace::extractOTraceIDs(ednsOptions, otTrace);
}
+
if (t_pdl) {
try {
if (t_pdl->hasGettagFFIFunc()) {
"qname", Logging::Loggable(qname), "qtype", Logging::Loggable(QType(qtype)),
"source", Logging::Loggable(source), "remote", Logging::Loggable(fromaddr));
}
+ match = eventTrace.add(RecEventTrace::AnswerSent);
struct msghdr msgh{};
struct iovec iov{};
cmsgbuf_aligned cbuf{};
addCMsgSrcAddr(&msgh, &cbuf, &destaddr, 0);
}
int sendErr = sendOnNBSocket(fileDesc, &msgh);
- eventTrace.add(RecEventTrace::AnswerSent);
-
+ eventTrace.add(RecEventTrace::AnswerSent, sendErr, false, match);
+ traceScope.close(0);
if (t_protobufServers.servers && logResponse && (!luaconfsLocal->protobufExportConfig.taggedOnly || (pbData && pbData->d_tagged))) {
protobufLogResponse(qname, qtype, dnsheader, luaconfsLocal, pbData, tval, false, source, destination, mappedSource, ednssubnet, uniqueId, requestorId, deviceId, deviceName, meta, eventTrace, otTrace, policyTags);
}
comboWriter->d_responsePaddingDisabled = responsePaddingDisabled;
comboWriter->d_meta = std::move(meta);
+ traceScope.close(0);
comboWriter->d_eventTrace = std::move(eventTrace);
comboWriter->d_otTrace = std::move(otTrace);
// established the reference point, get an absolute TS as close as possible to the
// eventTrace start of trace time.
auto traceTS = pdns::trace::timestamp();
- eventTrace.add(RecEventTrace::ReqRecv);
+ auto match = eventTrace.add(RecEventTrace::ReqRecv);
if (SyncRes::eventTraceEnabled(SyncRes::event_trace_to_ot)) {
otTrace.clear();
otTrace.start_time_unix_nano = traceTS;
destination = destaddr;
}
+ eventTrace.add(RecEventTrace::ReqRecv, 0, false, match);
if (RecThreadInfo::weDistributeQueries()) {
std::string localdata = data;
distributeAsyncFunction(data, [localdata = std::move(localdata), fromaddr, destaddr, source, destination, mappedSource, tval, fileDesc, proxyProtocolValues, eventTrace, otTrace]() mutable {
comboWriter->d_otTrace.clear();
comboWriter->d_otTrace.start_time_unix_nano = traceTS;
}
+ auto newParent = comboWriter->d_eventTrace.add(RecEventTrace::ProcessTCP);
+ auto oldParent = comboWriter->d_eventTrace.setParent(newParent);
+ RecEventTrace::EventScope traceScope(oldParent, comboWriter->d_eventTrace);
+
auto luaconfsLocal = g_luaconfs.getLocal();
if (checkProtobufExport(luaconfsLocal)) {
needEDNSParse = true;
if (needEDNSParse || (t_pdl && (t_pdl->hasGettagFFIFunc() || t_pdl->hasGettagFunc())) || comboWriter->d_mdp.d_header.opcode == static_cast<unsigned>(Opcode::Notify)) {
try {
+ auto parseMatch = comboWriter->d_eventTrace.add(RecEventTrace::PacketParse);
EDNSOptionViewMap ednsOptions;
comboWriter->d_ecsParsed = true;
comboWriter->d_ecsFound = false;
getQNameAndSubnet(conn->data, &qname, &qtype, &qclass,
comboWriter->d_ecsFound, &comboWriter->d_ednssubnet,
(g_gettagNeedsEDNSOptions || SyncRes::eventTraceEnabled(SyncRes::event_trace_to_ot)) ? &ednsOptions : nullptr, ednsVersion);
+ comboWriter->d_eventTrace.add(RecEventTrace::PacketParse, 0, false, parseMatch);
qnameParsed = true;
if (SyncRes::eventTraceEnabled(SyncRes::event_trace_to_ot)) {
"source", Logging::Loggable(comboWriter->d_source), "remote", Logging::Loggable(comboWriter->d_remote));
}
+ auto answerMatch = comboWriter->d_eventTrace.add(RecEventTrace::AnswerSent);
bool hadError = sendResponseOverTCP(comboWriter, response);
finishTCPReply(comboWriter, hadError, false);
struct timeval now{};
Utility::gettimeofday(&now, nullptr);
uint64_t spentUsec = uSec(now - start);
t_Counters.at(rec::Histogram::cumulativeAnswers)(spentUsec);
- comboWriter->d_eventTrace.add(RecEventTrace::AnswerSent);
+ comboWriter->d_eventTrace.add(RecEventTrace::AnswerSent, 0, false, answerMatch);
+ traceScope.close(0);
if (t_protobufServers.servers && comboWriter->d_logResponse && (!luaconfsLocal->protobufExportConfig.taggedOnly || (pbData && pbData->d_tagged))) {
struct timeval tval{
t_fdm->setReadTTD(fileDesc, ttd, g_tcpTimeout);
}
tcpGuard.keep();
+ traceScope.close(0);
g_multiTasker->makeThread(startDoResolve, comboWriter.release()); // deletes dc
} // good query
}
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(), true, 0);
+ auto match = d_eventTrace.add(RecEventTrace::AuthRequest, qname.toLogString() + '/' + qtype.toString() + '/' + remoteIP.toString(), true, 0);
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!