#ifdef DISABLE_PROTOBUF
return 0;
#else
- auto otTrace = pdns::trace::TracesData{
- .resource_spans = {
- {.resource = {
- .attributes = {
- {"service.name", {"dnsdist"}},
- }},
- .scope_spans = {{.scope = {
- .name = "dnsdist/queryFromFrontend",
- .version = PACKAGE_VERSION,
- .attributes = {d_attributes.begin(), d_attributes.end()},
- },
- .spans = {}}}}}};
+ auto traceid = getTraceID();
+ {
+ auto data = d_data.read_only_lock();
+ auto otTrace = pdns::trace::TracesData{
+ .resource_spans = {
+ {.resource = {
+ .attributes = {
+ {"service.name", {"dnsdist"}},
+ }},
+ .scope_spans = {{.scope = {
+ .name = "dnsdist/queryFromFrontend",
+ .version = PACKAGE_VERSION,
+ .attributes = {data->d_attributes.cbegin(), data->d_attributes.cend()},
+ },
+ .spans = {}}}}}};
otTrace.resource_spans.at(0).scope_spans.at(0).scope.attributes.push_back(hostnameAttr);
- auto traceid = getTraceID();
-
- for (auto const& lockedSpan : *d_spans.read_only_lock()) {
- otTrace.resource_spans.at(0).scope_spans.at(0).spans.push_back(
- {
- .trace_id = traceid,
- .span_id = lockedSpan.span_id == d_oldAndNewRootSpanID.oldID ? d_oldAndNewRootSpanID.newID : lockedSpan.span_id,
- .parent_span_id = lockedSpan.parent_span_id == d_oldAndNewRootSpanID.oldID ? d_oldAndNewRootSpanID.newID : lockedSpan.parent_span_id,
- .name = lockedSpan.name,
- .kind = pdns::trace::Span::SpanKind::SPAN_KIND_SERVER,
- .start_time_unix_nano = lockedSpan.start_time_unix_nano,
- .end_time_unix_nano = lockedSpan.end_time_unix_nano,
- .attributes = lockedSpan.attributes,
- });
+ for (auto const& span : data->d_spans) {
+ otTrace.resource_spans.at(0).scope_spans.at(0).spans.push_back(
+ {
+ .trace_id = traceid,
+ .span_id = span.span_id == data->d_oldAndNewRootSpanID.oldID ? data->d_oldAndNewRootSpanID.newID : span.span_id,
+ .parent_span_id = span.parent_span_id == data->d_oldAndNewRootSpanID.oldID ? data->d_oldAndNewRootSpanID.newID : span.parent_span_id,
+ .name = span.name,
+ .kind = pdns::trace::Span::SpanKind::SPAN_KIND_SERVER,
+ .start_time_unix_nano = span.start_time_unix_nano,
+ .end_time_unix_nano = span.end_time_unix_nano,
+ .attributes = span.attributes,
+ });
+ }
+ return otTrace;
}
-
- return otTrace;
#endif
}
return 0;
#else
auto spanID = pdns::trace::SpanID::getRandomSpanID();
- d_spans.lock()->push_back({
- .name = name,
- .span_id = spanID,
- .parent_span_id = parentSpanID,
- .start_time_unix_nano = pdns::trace::timestamp(),
- .end_time_unix_nano = 0,
- .attributes = {},
- });
-
- d_spanIDStack.push_back(spanID);
+ {
+ auto data = d_data.lock();
+ data->d_spans.push_back({
+ .name = name,
+ .span_id = spanID,
+ .parent_span_id = parentSpanID,
+ .start_time_unix_nano = pdns::trace::timestamp(),
+ .end_time_unix_nano = 0,
+ .attributes = {},
+ });
+
+ data->d_spanIDStack.emplace_back(spanID);
+ }
return spanID;
#endif
}
void Tracer::setTraceID([[maybe_unused]] const TraceID& traceID)
{
#ifndef DISABLE_PROTOBUF
- *d_traceid.lock() = traceID;
+ d_data.lock()->d_traceid = traceID;
#endif
}
void Tracer::setRootSpanID([[maybe_unused]] const SpanID& spanID)
{
#ifndef DISABLE_PROTOBUF
- SpanID oldRootSpanID;
- if (auto spans = d_spans.read_only_lock(); !spans->empty()) {
- auto iter = std::find_if(spans->cbegin(), spans->cend(), [](const auto& span) { return span.parent_span_id == pdns::trace::s_emptySpanID; });
- if (iter != spans->cend()) {
- oldRootSpanID = iter->span_id;
+ SpanID oldRootSpanID{pdns::trace::s_emptySpanID};
+ {
+ auto data = d_data.read_only_lock();
+ if (const auto& spans = data->d_spans; !spans.empty()) {
+ auto iter = std::find_if(spans.cbegin(), spans.cend(), [](const auto& span) { return span.parent_span_id == pdns::trace::s_emptySpanID; });
+ if (iter != spans.cend()) {
+ oldRootSpanID = iter->span_id;
+ }
}
}
+
if (oldRootSpanID == pdns::trace::s_emptySpanID) {
return;
}
- d_oldAndNewRootSpanID.oldID = oldRootSpanID;
- d_oldAndNewRootSpanID.newID = spanID;
+
+ {
+ auto data = d_data.lock();
+ data->d_oldAndNewRootSpanID.oldID = oldRootSpanID;
+ data->d_oldAndNewRootSpanID.newID = spanID;
+ }
#endif
}
// always successful
return true;
#else
- d_attributes.push_back({key, value});
+ d_data.lock()->d_attributes.push_back({key, value});
return true;
#endif
}
void Tracer::closeSpan([[maybe_unused]] const SpanID& spanID)
{
#ifndef DISABLE_PROTOBUF
- auto lockedSpans = d_spans.lock();
+ auto data = d_data.lock();
+ auto& spans = data->d_spans;
auto spanIt = std::find_if(
- lockedSpans->rbegin(),
- lockedSpans->rend(),
- [spanID](const miniSpan& span) { return span.span_id == spanID; });
- if (spanIt != lockedSpans->rend() && spanIt->end_time_unix_nano == 0) {
+ spans.rbegin(),
+ spans.rend(),
+ [&spanID](const miniSpan& span) { return span.span_id == spanID; });
+ if (spanIt != spans.rend() && spanIt->end_time_unix_nano == 0) {
spanIt->end_time_unix_nano = pdns::trace::timestamp();
// Only closers are allowed, so this can never happen
- assert(!d_spanIDStack.empty());
- assert(d_spanIDStack.back() == spanID);
- d_spanIDStack.pop_back();
+ assert(!data->d_spanIDStack.empty());
+ assert(data->d_spanIDStack.back() == spanID);
+ data->d_spanIDStack.pop_back();
}
#endif
}
void Tracer::setSpanAttribute([[maybe_unused]] const SpanID& spanid, [[maybe_unused]] const std::string& key, [[maybe_unused]] const AnyValue& value)
{
#ifndef DISABLE_PROTOBUF
- auto lockedSpans = d_spans.lock();
- if (auto iter = std::find_if(lockedSpans->rbegin(),
- lockedSpans->rend(),
- [spanid](const auto& span) { return span.span_id == spanid; });
- iter != lockedSpans->rend()) {
+ auto data = d_data.lock();
+ auto& spans = data->d_spans;
+ if (auto iter = std::find_if(spans.rbegin(),
+ spans.rend(),
+ [&spanid](const auto& span) { return span.span_id == spanid; });
+ iter != spans.rend()) {
iter->attributes.push_back({key, value});
}
#endif
#ifdef DISABLE_PROTOBUF
return 0;
#else
- if (d_oldAndNewRootSpanID.newID != pdns::trace::s_emptySpanID) {
- return d_oldAndNewRootSpanID.newID;
+ auto data = d_data.read_only_lock();
+ if (data->d_oldAndNewRootSpanID.newID != pdns::trace::s_emptySpanID) {
+ return data->d_oldAndNewRootSpanID.newID;
}
- if (auto spans = d_spans.read_only_lock(); !spans->empty()) {
- auto iter = std::find_if(spans->cbegin(), spans->cend(), [](const auto& span) { return span.parent_span_id == pdns::trace::s_emptySpanID; });
- if (iter != spans->cend()) {
+ if (auto& spans = data->d_spans; !spans.empty()) {
+ auto iter = std::find_if(spans.cbegin(), spans.cend(), [](const auto& span) { return span.parent_span_id == pdns::trace::s_emptySpanID; });
+ if (iter != spans.cend()) {
return iter->span_id;
}
}
#ifdef DISABLE_PROTOBUF
return 0;
#else
- if (d_spanIDStack.empty()) {
+ auto data = d_data.read_only_lock();
+ if (data->d_spanIDStack.empty()) {
return pdns::trace::s_emptySpanID;
}
- if (d_spanIDStack.size() == 1 && d_spanIDStack.front() == d_oldAndNewRootSpanID.oldID) {
- return d_oldAndNewRootSpanID.newID;
+ if (data->d_spanIDStack.size() == 1 && data->d_spanIDStack.front() == data->d_oldAndNewRootSpanID.oldID) {
+ return data->d_oldAndNewRootSpanID.newID;
}
- return d_spanIDStack.back();
+ return data->d_spanIDStack.back();
#endif
}
#ifdef DISABLE_PROTOBUF
return 0;
#else
- if (auto lockedSpans = d_spans.read_only_lock(); !lockedSpans->empty()) {
- if (auto iter = std::find_if(lockedSpans->rbegin(),
- lockedSpans->rend(),
+ auto data = d_data.read_only_lock();
+ if (auto& spans = data->d_spans; !spans.empty()) {
+ if (auto iter = std::find_if(spans.rbegin(),
+ spans.rend(),
[name](const miniSpan& span) { return span.name == name; });
- iter != lockedSpans->rend()) {
+ iter != spans.rend()) {
return iter->span_id;
}
}
#endif
}
-TraceID Tracer::getTraceID() const
+TraceID Tracer::getTraceID()
{
#ifdef DISABLE_PROTOBUF
return 0;
#else
- auto lockedTraceID = d_traceid.lock();
- if (*lockedTraceID == pdns::trace::s_emptyTraceID) {
- lockedTraceID->makeRandom();
+ auto data = d_data.lock();
+ auto& traceID = data->d_traceid;
+ if (traceID == pdns::trace::s_emptyTraceID) {
+ traceID.makeRandom();
}
- return *lockedTraceID;
+ return traceID;
#endif
}