(*d_alterFunc)(response, &message);
}
+ static thread_local std::string data;
+ data.clear();
+ message.serialize(data, !d_delay);
+
+ if (!response->ids.d_rawProtobufContent.empty()) {
+ data.insert(data.end(), response->ids.d_rawProtobufContent.begin(), response->ids.d_rawProtobufContent.end());
+ }
+
if (d_delay) {
- response->ids.delayedResponseMsgs.emplace_back(std::unique_ptr<DNSDistProtoBufMessage>(std::make_unique<DNSDistProtoBufMessage>(message)), std::shared_ptr<RemoteLoggerInterface>(d_logger));
+ response->ids.delayedResponseMsgs.emplace_back(data, std::shared_ptr<RemoteLoggerInterface>(d_logger));
}
else {
- static thread_local std::string data;
- data.clear();
- message.serialize(data);
- if (!response->ids.d_rawProtobufContent.empty()) {
- data.insert(data.end(), response->ids.d_rawProtobufContent.begin(), response->ids.d_rawProtobufContent.end());
- }
d_logger->queueData(data);
}
#endif
return ids;
}
+
+void InternalQueryState::sendDelayedProtobufMessages() const
+{
+#ifndef DISABLE_PROTOBUF
+ static thread_local string otPBBuf;
+ otPBBuf.clear();
+ if (tracingEnabled) {
+ pdns::ProtoZero::Message msg{otPBBuf};
+ msg.setOpenTelemetryData(d_OTTracer->getOTProtobuf());
+ }
+
+ for (auto const& msg_logger : delayedResponseMsgs) {
+ // TODO: we should probably do something with the return value of queueData
+ if (!tracingEnabled) {
+ msg_logger.second->queueData(msg_logger.first);
+ continue;
+ }
+ // Protobuf wireformat allows us to simply append the second "message"
+ // that only contains the OTTrace data as a single bytes field
+ msg_logger.second->queueData(msg_logger.first + otPBBuf);
+ }
+#endif
+}
#endif /* HAVE_XSK */
}
+ void sendDelayedProtobufMessages() const;
+
InternalQueryState partialCloneForXFR() const;
boost::optional<Netmask> subnet{boost::none}; // 40
std::unique_ptr<PacketBuffer> d_packet{nullptr}; // Initial packet, so we can restart the query from the response path if needed // 8
std::unique_ptr<ProtoBufData> d_protoBufData{nullptr};
#ifndef DISABLE_PROTOBUF
- std::vector<std::pair<std::unique_ptr<DNSDistProtoBufMessage>, std::shared_ptr<RemoteLoggerInterface>>> delayedResponseMsgs;
+ std::vector<std::pair<std::string, std::shared_ptr<RemoteLoggerInterface>>> delayedResponseMsgs;
#endif
std::unique_ptr<EDNSExtendedError> d_extendedError{nullptr};
boost::optional<uint32_t> tempFailureTTL{boost::none}; // 8
d_additionalRRs.push_back({std::move(qname), strBlob, uTTL, uType, uClass});
}
-void DNSDistProtoBufMessage::serialize(std::string& data) const
+void DNSDistProtoBufMessage::serialize(std::string& data, bool withOpenTelemetryTraceData) const
{
if ((data.capacity() - data.size()) < 128) {
data.reserve(data.size() + 128);
if (auto tracer = d_dq.ids.getTracer(); tracer != nullptr && d_dq.ids.tracingEnabled) {
msg.setOpenTelemetryTraceID(tracer->getTraceID());
- msg.setOpenTelemetryData(tracer->getOTProtobuf());
+ if (withOpenTelemetryTraceData) {
+ msg.setOpenTelemetryData(tracer->getOTProtobuf());
+ }
}
}
void addMeta(const std::string& key, std::vector<std::string>&& strValues, const std::vector<int64_t>& intValues);
void addRR(DNSName&& qname, uint16_t uType, uint16_t uClass, uint32_t uTTL, const std::string& data);
- void serialize(std::string& data) const;
+ void serialize(std::string& data, bool withOpenTelemetryTraceData = true) const;
[[nodiscard]] std::string toDebugString() const;
void handleResponseSent(const InternalQueryState& ids, double udiff, const ComboAddress& client, const ComboAddress& backend, unsigned int size, const dnsheader& cleartextDH, dnsdist::Protocol outgoingProtocol, bool fromBackend)
{
handleResponseSent(ids.qname, ids.qtype, udiff, client, backend, size, cleartextDH, outgoingProtocol, ids.protocol, fromBackend);
-
-#ifndef DISABLE_PROTOBUF
- if (ids.tracingEnabled && !ids.delayedResponseMsgs.empty()) {
- static thread_local std::string data;
- for (auto const& msg_logger : ids.delayedResponseMsgs) {
- data.clear();
- msg_logger.first->serialize(data);
- if (!ids.d_rawProtobufContent.empty()) {
- data.insert(data.end(), ids.d_rawProtobufContent.begin(), ids.d_rawProtobufContent.end());
- }
- msg_logger.second->queueData(data);
- }
- }
-#endif
+ ids.sendDelayedProtobufMessages();
}
void handleResponseSent(const DNSName& qname, const QType& qtype, double udiff, const ComboAddress& client, const ComboAddress& backend, unsigned int size, const dnsheader& cleartextDH, dnsdist::Protocol outgoingProtocol, dnsdist::Protocol incomingProtocol, bool fromBackend)