|
50 | 50 | #include "opentelemetry/trace/span_id.h" |
51 | 51 | #include "opentelemetry/trace/span_metadata.h" |
52 | 52 | #include "opentelemetry/trace/span_startoptions.h" |
| 53 | +#include "opentelemetry/trace/trace_flags.h" |
53 | 54 | #include "opentelemetry/trace/trace_id.h" |
54 | 55 | #include "opentelemetry/trace/trace_state.h" |
55 | 56 | #include "opentelemetry/trace/tracer.h" |
@@ -274,6 +275,50 @@ TEST(Tracer, StartSpanSampleOff) |
274 | 275 | ASSERT_EQ(0, span_data->GetSpans().size()); |
275 | 276 | } |
276 | 277 |
|
| 278 | +TEST(Tracer, StartSpanSetsRandomTraceFlagForRootSpan) |
| 279 | +{ |
| 280 | + InMemorySpanExporter *exporter = new InMemorySpanExporter(); |
| 281 | + // AlwaysOn keeps the sampled bit set while RandomIdGenerator marks the |
| 282 | + // locally generated trace-id as random. |
| 283 | + auto tracer = initTracer(std::unique_ptr<SpanExporter>{exporter}, new AlwaysOnSampler(), |
| 284 | + new RandomIdGenerator()); |
| 285 | + |
| 286 | + auto span = tracer->StartSpan("span 1"); |
| 287 | + auto context = span->GetContext(); |
| 288 | + |
| 289 | + EXPECT_TRUE(context.IsValid()); |
| 290 | + EXPECT_TRUE(context.IsSampled()); |
| 291 | + EXPECT_TRUE(context.trace_flags().IsRandom()); |
| 292 | + EXPECT_EQ(context.trace_flags().flags(), |
| 293 | + trace_api::TraceFlags::kIsSampled | trace_api::TraceFlags::kIsRandom); |
| 294 | +} |
| 295 | + |
| 296 | +TEST(Tracer, StartSpanPreservesRandomTraceFlagFromParent) |
| 297 | +{ |
| 298 | + InMemorySpanExporter *exporter = new InMemorySpanExporter(); |
| 299 | + constexpr uint8_t parent_span_id_buf[] = {1, 2, 3, 4, 5, 6, 7, 8}; |
| 300 | + constexpr uint8_t parent_trace_id_buf[] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1}; |
| 301 | + // Build a remote parent with only the random bit set so the child path can |
| 302 | + // prove it preserves the incoming signal even when sampling is turned off. |
| 303 | + trace_api::SpanContext parent_context{ |
| 304 | + trace_api::TraceId{parent_trace_id_buf}, trace_api::SpanId{parent_span_id_buf}, |
| 305 | + trace_api::TraceFlags{trace_api::TraceFlags::kIsRandom}, true}; |
| 306 | + |
| 307 | + auto tracer = initTracer(std::unique_ptr<SpanExporter>{exporter}, new AlwaysOffSampler()); |
| 308 | + |
| 309 | + trace_api::StartSpanOptions options; |
| 310 | + options.parent = parent_context; |
| 311 | + |
| 312 | + auto span = tracer->StartSpan("span 1", options); |
| 313 | + auto context = span->GetContext(); |
| 314 | + |
| 315 | + EXPECT_TRUE(context.IsValid()); |
| 316 | + EXPECT_FALSE(context.IsSampled()); |
| 317 | + EXPECT_TRUE(context.trace_flags().IsRandom()); |
| 318 | + EXPECT_EQ(context.trace_flags().flags(), static_cast<uint8_t>(trace_api::TraceFlags::kIsRandom)); |
| 319 | + EXPECT_EQ(context.trace_id(), parent_context.trace_id()); |
| 320 | +} |
| 321 | + |
277 | 322 | TEST(Tracer, StartSpanCustomIdGenerator) |
278 | 323 | { |
279 | 324 | IdGenerator *id_generator = new MockIdGenerator(); |
|
0 commit comments