Skip to content

Commit d609e61

Browse files
authored
Merge pull request PowerDNS#17462 from rgacogne/ddist-make-ot-cheaper
dnsdist: Reduce the cost of disabled OpenTelemetry tracing
2 parents 36f6762 + 236df81 commit d609e61

9 files changed

Lines changed: 37 additions & 30 deletions

pdns/dnsdistdist/dnsdist-actions-factory.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1747,7 +1747,7 @@ class SetTraceAction : public DNSAction
17471747

17481748
DNSAction::Action operator()([[maybe_unused]] DNSQuestion* dnsquestion, [[maybe_unused]] std::string* ruleresult) const override
17491749
{
1750-
auto tracer = dnsquestion->ids.getTracer();
1750+
auto& tracer = dnsquestion->ids.getTracer();
17511751
if (tracer == nullptr) {
17521752
VERBOSESLOG(infolog("SetTraceAction called, but OpenTelemetry tracing is globally disabled. Did you forget to call setOpenTelemetryTracing?"),
17531753
dnsquestion->getLogger()->info(Logr::Info, "SetTraceAction called, but OpenTelemetry tracing is globally disabled. Did you forget to call setOpenTelemetryTracing?"));

pdns/dnsdistdist/dnsdist-idstate.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ std::optional<pdns::trace::dnsdist::Tracer::Closer> InternalQueryState::getClose
117117
// getTracer returns a Tracer when tracing is globally enabled
118118
// tracingEnabled tells us whether or not tracing is enabled for this query
119119
// Should tracing be disabled, *but* we have not processed query rules, we will still return a closer if tracing is globally enabled
120-
if (auto tracer = getTracer(); tracer != nullptr && (tracingEnabled || !rulesAppliedToQuery)) {
120+
if (auto& tracer = getTracer(); tracer != nullptr && (tracingEnabled || !rulesAppliedToQuery)) {
121121
ret = d_OTTracer->openSpan(std::string(name), parentSpanID);
122122
}
123123
#endif
@@ -128,7 +128,7 @@ std::optional<pdns::trace::dnsdist::Tracer::Closer> InternalQueryState::getClose
128128
{
129129
std::optional<pdns::trace::dnsdist::Tracer::Closer> ret{std::nullopt};
130130
#ifndef DISABLE_PROTOBUF
131-
if (auto tracer = getTracer(); tracer != nullptr) {
131+
if (auto& tracer = getTracer(); tracer != nullptr) {
132132
auto parentSpanID = d_OTTracer->getLastSpanIDForName(std::string(parentSpanName));
133133
ret = getCloser(name, parentSpanID);
134134
}
@@ -140,7 +140,7 @@ std::optional<pdns::trace::dnsdist::Tracer::Closer> InternalQueryState::getClose
140140
{
141141
std::optional<pdns::trace::dnsdist::Tracer::Closer> ret{std::nullopt};
142142
#ifndef DISABLE_PROTOBUF
143-
if (auto tracer = getTracer(); tracer != nullptr) {
143+
if (auto& tracer = getTracer(); tracer != nullptr) {
144144
ret = getCloser(std::string(name), tracer->getLastSpanID());
145145
}
146146
#endif
@@ -155,7 +155,7 @@ std::optional<pdns::trace::dnsdist::Tracer::Closer> InternalQueryState::getRules
155155
// getTracer returns a Tracer when tracing is globally enabled
156156
// tracingEnabled tells us whether or not tracing is enabled for this query
157157
// Should tracing be disabled, *but* we have not processed query rules, we will still return a closer if tracing is globally enabled
158-
if (auto tracer = getTracer(); tracer != nullptr && (tracingEnabled || !rulesAppliedToQuery)) {
158+
if (auto& tracer = getTracer(); tracer != nullptr && (tracingEnabled || !rulesAppliedToQuery)) {
159159
auto parentSpanID = tracer->getLastSpanID();
160160
auto name = ruleType + prefix + std::string(ruleName);
161161
ret = tracer->openSpan(name, parentSpanID);

pdns/dnsdistdist/dnsdist-idstate.hh

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -128,20 +128,23 @@ struct InternalQueryState
128128
*
129129
* @return
130130
*/
131-
std::shared_ptr<pdns::trace::dnsdist::Tracer> getTracer()
131+
std::shared_ptr<pdns::trace::dnsdist::Tracer>& getTracer()
132132
{
133133
#ifdef DISABLE_PROTOBUF
134-
return nullptr;
134+
return d_OTTracer;
135135
#else
136+
if ((d_OTTracingEnabledInConfiguration && !*d_OTTracingEnabledInConfiguration) || d_OTTracer != nullptr) {
137+
return d_OTTracer;
138+
}
136139
if (dnsdist::configuration::getCurrentRuntimeConfiguration().d_openTelemetryTracing) {
137-
if (d_OTTracer != nullptr) {
138-
return d_OTTracer;
139-
}
140140
// OpenTelemetry tracing is enabled, but we don't have a tracer yet
141+
d_OTTracingEnabledInConfiguration = true;
141142
d_OTTracer = pdns::trace::dnsdist::Tracer::getTracer();
142-
return d_OTTracer;
143143
}
144-
return nullptr;
144+
else {
145+
d_OTTracingEnabledInConfiguration = false;
146+
}
147+
return d_OTTracer;
145148
#endif
146149
}
147150

@@ -231,6 +234,9 @@ public:
231234
uint16_t udpPayloadSize{0}; // Max UDP payload size from the query // 2
232235
uint16_t sendTraceParentToDownstreamID{0}; // Whether or not to add a TRACEPARENT EDNS option to downstreams, set to non-0 for the EDNS Option ID
233236
std::optional<bool> dnssecOK;
237+
#ifndef DISABLE_PROTOBUF
238+
std::optional<bool> d_OTTracingEnabledInConfiguration; // Whether OpenTelemetry tracing is enabled in the configuration. This prevents having to check the configuration several times for the same query
239+
#endif /* DISABLE_PROTOBUF */
234240
dnsdist::Protocol protocol; // 1
235241
uint8_t restartCount{0}; // 1
236242
bool ednsAdded{false};

pdns/dnsdistdist/dnsdist-lua-bindings-dnsquestion.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ void setupLuaBindingsDNSQuestion([[maybe_unused]] LuaContext& luaCtx)
374374
#ifdef DISABLE_PROTOBUF
375375
return std::nullopt;
376376
#else
377-
if (auto tracer = dnsQuestion.ids.getTracer(); tracer != nullptr && dnsQuestion.ids.tracingEnabled) {
377+
if (auto& tracer = dnsQuestion.ids.getTracer(); tracer != nullptr && dnsQuestion.ids.tracingEnabled) {
378378
auto traceID = tracer->getTraceID();
379379
return std::string(traceID.begin(), traceID.end());
380380
}
@@ -388,7 +388,7 @@ void setupLuaBindingsDNSQuestion([[maybe_unused]] LuaContext& luaCtx)
388388
#ifdef DISABLE_PROTOBUF
389389
return std::nullopt;
390390
#else
391-
if (auto tracer = dnsQuestion.ids.getTracer(); tracer != nullptr && dnsQuestion.ids.tracingEnabled) {
391+
if (auto& tracer = dnsQuestion.ids.getTracer(); tracer != nullptr && dnsQuestion.ids.tracingEnabled) {
392392
auto spanID = tracer->getLastSpanID();
393393
return std::string(spanID.begin(), spanID.end());
394394
}

pdns/dnsdistdist/dnsdist-opentelemetry.cc

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ SpanID Tracer::getRootSpanID()
219219
return data->d_oldAndNewRootSpanID.newID;
220220
}
221221

222-
if (auto& spans = data->d_spans; !spans.empty()) {
222+
if (const auto& spans = data->d_spans; !spans.empty()) {
223223
auto iter = std::find_if(spans.cbegin(), spans.cend(), [](const auto& span) { return span.parent_span_id == pdns::trace::s_emptySpanID; });
224224
if (iter != spans.cend()) {
225225
return iter->span_id;
@@ -251,7 +251,7 @@ SpanID Tracer::getLastSpanIDForName([[maybe_unused]] const std::string& name)
251251
return 0;
252252
#else
253253
auto data = d_data.read_only_lock();
254-
if (auto& spans = data->d_spans; !spans.empty()) {
254+
if (const auto& spans = data->d_spans; !spans.empty()) {
255255
if (auto iter = std::find_if(spans.rbegin(),
256256
spans.rend(),
257257
[name](const miniSpan& span) { return span.name == name; });
@@ -320,11 +320,11 @@ void Tracer::Closer::setAttribute([[maybe_unused]] const std::string& key, [[may
320320
#ifdef DISABLE_PROTOBUF
321321
return;
322322
#else
323-
return d_tracer->setSpanAttribute(d_spanID, key, value);
323+
d_tracer->setSpanAttribute(d_spanID, key, value);
324324
#endif
325325
}
326326

327-
std::vector<uint8_t> makeEDNSTraceParentOption(std::shared_ptr<Tracer> tracer)
327+
std::vector<uint8_t> makeEDNSTraceParentOption([[maybe_unused]] const std::shared_ptr<Tracer>& tracer)
328328
{
329329
std::vector<uint8_t> ret;
330330
#ifndef DISABLE_PROTOBUF
@@ -343,7 +343,7 @@ std::vector<uint8_t> makeEDNSTraceParentOption(std::shared_ptr<Tracer> tracer)
343343
return ret;
344344
}
345345

346-
bool addTraceparentEdnsOptionToPacketBuffer(PacketBuffer& origBuf, const std::shared_ptr<Tracer>& tracer, const size_t qnameWireLength, const size_t proxyProtocolPayloadSize, const uint16_t traceparentOptionCode, const bool isTCP)
346+
bool addTraceparentEdnsOptionToPacketBuffer([[maybe_unused]] PacketBuffer& origBuf, [[maybe_unused]] const std::shared_ptr<Tracer>& tracer, [[maybe_unused]] const size_t qnameWireLength, [[maybe_unused]] const size_t proxyProtocolPayloadSize, [[maybe_unused]] const uint16_t traceparentOptionCode, [[maybe_unused]] const bool isTCP)
347347
{
348348
#ifndef DISABLE_PROTOBUF
349349
if (tracer == nullptr) {
@@ -352,19 +352,20 @@ bool addTraceparentEdnsOptionToPacketBuffer(PacketBuffer& origBuf, const std::sh
352352
// buf contains the whole DNS query without PROXY protocol and TCP length header
353353
PacketBuffer buf{origBuf.begin() + proxyProtocolPayloadSize + (isTCP ? 2 : 0), origBuf.end()};
354354

355-
uint16_t optRDPosition;
356-
size_t remaining;
355+
uint16_t optRDPosition{};
356+
size_t remaining{};
357357
bool queryHadEdns = ::dnsdist::getEDNSOptionsStart(buf, qnameWireLength, &optRDPosition, &remaining) == 0;
358358
if (queryHadEdns) {
359359
size_t optLen = buf.size() - optRDPosition - remaining;
360+
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
360361
removeEDNSOptionFromOPT(reinterpret_cast<char*>(buf.data() + optRDPosition), &optLen, traceparentOptionCode);
361362
}
362363

363364
auto opt = pdns::trace::dnsdist::makeEDNSTraceParentOption(tracer);
364365
bool ednsAdded{false};
365366
bool optionAdded{false};
366-
uint16_t maxEdnsSize = queryHadEdns ? (uint16_t)(buf.at(optRDPosition - 6) << 8) + buf.at(optRDPosition - 5) : 512;
367-
setEDNSOption(buf, traceparentOptionCode, std::string(opt.begin(), opt.end()), isTCP ? std::numeric_limits<uint16_t>().max() : maxEdnsSize, ednsAdded, optionAdded);
367+
uint16_t maxEdnsSize = queryHadEdns ? static_cast<uint16_t>(buf.at(optRDPosition - 6) << 8) + buf.at(optRDPosition - 5) : 512;
368+
setEDNSOption(buf, traceparentOptionCode, std::string(opt.begin(), opt.end()), isTCP ? std::numeric_limits<uint16_t>::max() : maxEdnsSize, ednsAdded, optionAdded);
368369

369370
if (isTCP) {
370371
const std::array<uint8_t, 2> sizeBytes{static_cast<uint8_t>(buf.size() / 256), static_cast<uint8_t>(buf.size() % 256)};

pdns/dnsdistdist/dnsdist-opentelemetry.hh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ public:
217217
}
218218
Closer(const Closer&) = delete;
219219
Closer& operator=(const Closer&) = delete;
220-
Closer& operator=(Closer&& rhs) noexcept
220+
Closer& operator=([[maybe_unused]] Closer&& rhs) noexcept
221221
{
222222
#ifndef DISABLE_PROTOBUF
223223
this->d_tracer = std::move(rhs.d_tracer);
@@ -228,7 +228,7 @@ public:
228228
#endif
229229
return *this;
230230
}
231-
Closer(Closer&& rhs)
231+
Closer([[maybe_unused]] Closer&& rhs) noexcept
232232
{
233233
#ifndef DISABLE_PROTOBUF
234234
this->d_tracer = std::move(rhs.d_tracer);
@@ -362,6 +362,6 @@ private:
362362
#endif
363363
};
364364

365-
std::vector<uint8_t> makeEDNSTraceParentOption(std::shared_ptr<Tracer> tracer);
366-
bool addTraceparentEdnsOptionToPacketBuffer(PacketBuffer& origBuf, const std::shared_ptr<Tracer>& tracer, const size_t qnameWireLength, const size_t proxyProtocolPayloadSize, const uint16_t traceparentOptionCode = EDNSOptionCode::TRACEPARENT, const bool isTCP = false);
365+
std::vector<uint8_t> makeEDNSTraceParentOption(const std::shared_ptr<Tracer>& tracer);
366+
bool addTraceparentEdnsOptionToPacketBuffer(PacketBuffer& origBuf, const std::shared_ptr<Tracer>& tracer, size_t qnameWireLength, size_t proxyProtocolPayloadSize, uint16_t traceparentOptionCode = EDNSOptionCode::TRACEPARENT, bool isTCP = false);
367367
} // namespace pdns::trace::dnsdist

pdns/dnsdistdist/dnsdist-protobuf.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ void DNSDistProtoBufMessage::serialize(std::string& data, bool withOpenTelemetry
254254
}
255255
}
256256

257-
if (auto tracer = d_dq.ids.getTracer(); tracer != nullptr && d_dq.ids.tracingEnabled) {
257+
if (auto& tracer = d_dq.ids.getTracer(); tracer != nullptr && d_dq.ids.tracingEnabled) {
258258
msg.setOpenTelemetryTraceID(tracer->getTraceID());
259259
if (withOpenTelemetryTraceData) {
260260
msg.setOpenTelemetryData(tracer->getOTProtobuf());

pdns/dnsdistdist/dnsdist-tcp-downstream.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ IOState TCPConnectionToBackend::sendQuery(std::shared_ptr<TCPConnectionToBackend
289289
DEBUGLOG("sending query to backend " << conn->getDS()->getNameWithAddr() << " over FD " << conn->d_handler->getDescriptor());
290290

291291
#ifndef DISABLE_PROTOBUF
292-
if (auto tracer = conn->d_currentQuery.d_query.d_idstate.getTracer(); conn->d_currentQuery.d_query.d_idstate.sendTraceParentToDownstreamID != 0 && tracer != nullptr) {
292+
if (auto& tracer = conn->d_currentQuery.d_query.d_idstate.getTracer(); conn->d_currentQuery.d_query.d_idstate.sendTraceParentToDownstreamID != 0 && tracer != nullptr) {
293293
auto ednsAdded = pdns::trace::dnsdist::addTraceparentEdnsOptionToPacketBuffer(
294294
conn->d_currentQuery.d_query.d_buffer,
295295
tracer,

pdns/dnsdistdist/dnsdist.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1899,7 +1899,7 @@ bool assignOutgoingUDPQueryToBackend(std::shared_ptr<DownstreamState>& downstrea
18991899
dnsQuestion.getLogger()->info(Logr::Info, "Relayed query to backend", "backend.name", Logging::Loggable(downstream->getName()), "backend.address", Logging::Loggable(downstream->d_config.remote), "dnsdist.xsk", Logging::Loggable(!actuallySend)));
19001900

19011901
#ifndef DISABLE_PROTOBUF
1902-
if (auto tracer = dnsQuestion.ids.getTracer(); dnsQuestion.ids.sendTraceParentToDownstreamID != 0 && tracer != nullptr) {
1902+
if (auto& tracer = dnsQuestion.ids.getTracer(); dnsQuestion.ids.sendTraceParentToDownstreamID != 0 && tracer != nullptr) {
19031903
auto ednsAdded = pdns::trace::dnsdist::addTraceparentEdnsOptionToPacketBuffer(
19041904
dnsQuestion.getMutableData(),
19051905
tracer,

0 commit comments

Comments
 (0)