Skip to content

Commit a33bb55

Browse files
authored
Propagate trace_flags from parent span to child span (#603)
1 parent 3d71e5e commit a33bb55

4 files changed

Lines changed: 67 additions & 14 deletions

File tree

sdk/src/trace/span.cc

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ Span::Span(std::shared_ptr<Tracer> &&tracer,
6464
const trace_api::SpanContextKeyValueIterable &links,
6565
const trace_api::StartSpanOptions &options,
6666
const trace_api::SpanContext &parent_span_context,
67-
const opentelemetry::sdk::resource::Resource &resource) noexcept
67+
const opentelemetry::sdk::resource::Resource &resource,
68+
const bool sampled) noexcept
6869
: tracer_{std::move(tracer)},
6970
processor_{processor},
7071
recordable_{processor_->MakeRecordable()},
@@ -93,10 +94,12 @@ Span::Span(std::shared_ptr<Tracer> &&tracer,
9394
recordable_->SetIds(trace_id, span_id, trace_api::SpanId());
9495
}
9596

96-
span_context_ = std::unique_ptr<trace_api::SpanContext>(
97-
new trace_api::SpanContext(trace_id, span_id, trace_api::TraceFlags(), false,
98-
is_parent_span_valid ? parent_span_context.trace_state()
99-
: trace_api::TraceState::GetDefault()));
97+
span_context_ = std::unique_ptr<trace_api::SpanContext>(new trace_api::SpanContext(
98+
trace_id, span_id,
99+
sampled ? trace_api::TraceFlags{trace_api::TraceFlags::kIsSampled} : trace_api::TraceFlags{},
100+
false,
101+
is_parent_span_valid ? parent_span_context.trace_state()
102+
: trace_api::TraceState::GetDefault()));
100103

101104
attributes.ForEachKeyValue(
102105
[&](nostd::string_view key, opentelemetry::common::AttributeValue value) noexcept {

sdk/src/trace/span.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@ namespace trace_api = opentelemetry::trace;
1515
class Span final : public trace_api::Span
1616
{
1717
public:
18-
explicit Span(std::shared_ptr<Tracer> &&tracer,
19-
std::shared_ptr<SpanProcessor> processor,
20-
nostd::string_view name,
21-
const opentelemetry::common::KeyValueIterable &attributes,
22-
const trace_api::SpanContextKeyValueIterable &links,
23-
const trace_api::StartSpanOptions &options,
24-
const trace_api::SpanContext &parent_span_context,
25-
const opentelemetry::sdk::resource::Resource &resource) noexcept;
18+
Span(std::shared_ptr<Tracer> &&tracer,
19+
std::shared_ptr<SpanProcessor> processor,
20+
nostd::string_view name,
21+
const opentelemetry::common::KeyValueIterable &attributes,
22+
const trace_api::SpanContextKeyValueIterable &links,
23+
const trace_api::StartSpanOptions &options,
24+
const trace_api::SpanContext &parent_span_context,
25+
const opentelemetry::sdk::resource::Resource &resource,
26+
const bool sampled = false) noexcept;
2627

2728
~Span() override;
2829

sdk/src/trace/tracer.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ nostd::shared_ptr<trace_api::Span> Tracer::StartSpan(
7575
{
7676
auto span = nostd::shared_ptr<trace_api::Span>{
7777
new (std::nothrow) Span{this->shared_from_this(), processor_.load(), name, attributes,
78-
links, options, parent, resource_}};
78+
links, options, parent, resource_, true}};
7979

8080
// if the attributes is not nullptr, add attributes to the span.
8181
if (sampling_result.attributes)

sdk/test/trace/tracer_test.cc

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ using opentelemetry::common::KeyValueIterableView;
1919
using opentelemetry::exporter::memory::InMemorySpanData;
2020
using opentelemetry::exporter::memory::InMemorySpanExporter;
2121
using opentelemetry::trace::SpanContext;
22+
using opentelemetry::trace::TraceFlags;
2223

2324
/**
2425
* A mock sampler that returns non-empty sampling results attributes.
@@ -563,3 +564,51 @@ TEST(Tracer, ExpectParent)
563564
EXPECT_EQ(spandata_first->GetSpanId(), spandata_second->GetParentSpanId());
564565
EXPECT_EQ(spandata_second->GetSpanId(), spandata_third->GetParentSpanId());
565566
}
567+
568+
TEST(Tracer, ExpectParentWithValidSpanContext)
569+
{
570+
std::unique_ptr<InMemorySpanExporter> exporter(new InMemorySpanExporter());
571+
std::shared_ptr<InMemorySpanData> span_data = exporter->GetData();
572+
auto tracer = initTracer(std::move(exporter));
573+
auto spans = span_data.get()->GetSpans();
574+
575+
ASSERT_EQ(0, spans.size());
576+
577+
// produce valid SpanContext with pseudo span and trace Id.
578+
uint8_t span_id_buf[trace_api::SpanId::kSize] = {
579+
1,
580+
};
581+
trace_api::SpanId span_id{span_id_buf};
582+
uint8_t trace_id_buf[trace_api::TraceId::kSize] = {
583+
2,
584+
};
585+
trace_api::TraceId trace_id{trace_id_buf};
586+
587+
trace_api::StartSpanOptions options;
588+
options.parent = SpanContext(trace_id, span_id, TraceFlags{TraceFlags::kIsSampled}, true);
589+
590+
auto span_first = tracer->StartSpan("span 1", options);
591+
592+
EXPECT_EQ(span_first->GetContext().trace_flags().IsSampled(), true);
593+
594+
options.parent = span_first->GetContext();
595+
auto span_second = tracer->StartSpan("span 2", options);
596+
EXPECT_EQ(span_second->GetContext().trace_flags().IsSampled(), true);
597+
598+
options.parent = span_second->GetContext();
599+
auto span_third = tracer->StartSpan("span 3", options);
600+
EXPECT_EQ(span_third->GetContext().trace_flags().IsSampled(), true);
601+
602+
span_third->End();
603+
span_second->End();
604+
span_first->End();
605+
606+
spans = span_data->GetSpans();
607+
ASSERT_EQ(3, spans.size());
608+
auto spandata_first = std::move(spans.at(2));
609+
auto spandata_second = std::move(spans.at(1));
610+
auto spandata_third = std::move(spans.at(0));
611+
612+
EXPECT_EQ(spandata_first->GetSpanId(), spandata_second->GetParentSpanId());
613+
EXPECT_EQ(spandata_second->GetSpanId(), spandata_third->GetParentSpanId());
614+
}

0 commit comments

Comments
 (0)