-
Notifications
You must be signed in to change notification settings - Fork 5.3k
tracing: Add B3 support in OpenCensus driver. #7800
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
9603803
c5c53fa
01ba657
59db416
bfa98d8
1d061d3
a5d2166
4e4f455
914a953
f6da9e0
16d1ddc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -19,6 +19,7 @@ | |
| #include "gtest/gtest.h" | ||
| #include "opencensus/trace/exporter/span_data.h" | ||
| #include "opencensus/trace/exporter/span_exporter.h" | ||
| #include "opencensus/trace/propagation/b3.h" | ||
| #include "opencensus/trace/propagation/cloud_trace_context.h" | ||
| #include "opencensus/trace/propagation/grpc_trace_bin.h" | ||
| #include "opencensus/trace/propagation/trace_context.h" | ||
|
|
@@ -161,78 +162,115 @@ TEST(OpenCensusTracerTest, Span) { | |
| } | ||
| } | ||
|
|
||
| // Test that trace context propagation works. | ||
| TEST(OpenCensusTracerTest, PropagateTraceContext) { | ||
| registerSpanCatcher(); | ||
| // The test calls the helper with each kind of incoming context in turn. | ||
| auto helper = [](const std::string& header, const std::string& value) { | ||
| OpenCensusConfig oc_config; | ||
| NiceMock<LocalInfo::MockLocalInfo> local_info; | ||
| oc_config.add_incoming_trace_context(OpenCensusConfig::NONE); | ||
| oc_config.add_incoming_trace_context(OpenCensusConfig::TRACE_CONTEXT); | ||
| oc_config.add_incoming_trace_context(OpenCensusConfig::GRPC_TRACE_BIN); | ||
| oc_config.add_incoming_trace_context(OpenCensusConfig::CLOUD_TRACE_CONTEXT); | ||
| oc_config.add_outgoing_trace_context(OpenCensusConfig::NONE); | ||
| oc_config.add_outgoing_trace_context(OpenCensusConfig::TRACE_CONTEXT); | ||
| oc_config.add_outgoing_trace_context(OpenCensusConfig::GRPC_TRACE_BIN); | ||
| oc_config.add_outgoing_trace_context(OpenCensusConfig::CLOUD_TRACE_CONTEXT); | ||
| std::unique_ptr<Tracing::Driver> driver(new OpenCensus::Driver(oc_config, local_info)); | ||
| NiceMock<Tracing::MockConfig> config; | ||
| Http::TestHeaderMapImpl request_headers{ | ||
| {":path", "/"}, | ||
| {":method", "GET"}, | ||
| {"x-request-id", "foo"}, | ||
| {header, value}, | ||
| }; | ||
| const std::string operation_name{"my_operation_2"}; | ||
| SystemTime start_time; | ||
| Http::TestHeaderMapImpl injected_headers; | ||
| { | ||
| Tracing::SpanPtr span = driver->startSpan(config, request_headers, operation_name, start_time, | ||
| {Tracing::Reason::Sampling, false}); | ||
| span->injectContext(injected_headers); | ||
| span->finishSpan(); | ||
| } | ||
| namespace { | ||
|
|
||
| // Retrieve SpanData from the OpenCensus trace exporter. | ||
| std::vector<SpanData> spans = getSpanCatcher()->catchSpans(); | ||
| ASSERT_EQ(1, spans.size()); | ||
| const auto& sd = spans[0]; | ||
| ENVOY_LOG_MISC(debug, "{}", sd.DebugString()); | ||
| using testing::PrintToString; | ||
|
|
||
| // Check contents. | ||
| EXPECT_TRUE(sd.has_remote_parent()); | ||
| EXPECT_EQ("6162636465666768", sd.parent_span_id().ToHex()); | ||
| EXPECT_EQ("404142434445464748494a4b4c4d4e4f", sd.context().trace_id().ToHex()); | ||
| EXPECT_TRUE(sd.context().trace_options().IsSampled()) | ||
| << "parent was sampled, child should be also"; | ||
|
|
||
| // Check injectContext. | ||
| using Envoy::Http::LowerCaseString; | ||
| { | ||
| auto val = injected_headers.get(LowerCaseString("traceparent")); | ||
| ASSERT_NE(nullptr, val); | ||
| EXPECT_EQ(::opencensus::trace::propagation::ToTraceParentHeader(sd.context()), | ||
| val->value().getStringView()); | ||
| } | ||
| { | ||
| auto val = injected_headers.get(LowerCaseString("grpc-trace-bin")); | ||
| ASSERT_NE(nullptr, val); | ||
| std::string expected = ::opencensus::trace::propagation::ToGrpcTraceBinHeader(sd.context()); | ||
| expected = Base64::encode(expected.data(), expected.size(), /*add_padding=*/false); | ||
| EXPECT_EQ(expected, val->value().getStringView()); | ||
| } | ||
| { | ||
| auto val = injected_headers.get(LowerCaseString("x-cloud-trace-context")); | ||
| ASSERT_NE(nullptr, val); | ||
| EXPECT_EQ(::opencensus::trace::propagation::ToCloudTraceContextHeader(sd.context()), | ||
| val->value().getStringView()); | ||
| } | ||
| MATCHER_P2(ContainHeader, header, expected_value, | ||
| "contains the header " + PrintToString(header) + " with value " + | ||
| PrintToString(expected_value)) { | ||
| const auto found_value = arg.get(Http::LowerCaseString(header)); | ||
| if (found_value == nullptr) { | ||
| return false; | ||
| } | ||
| return found_value->value().getStringView() == expected_value; | ||
| } | ||
|
|
||
| // Given incoming headers, test that trace context propagation works and generates all the expected | ||
| // outgoing headers. | ||
| void testIncomingHeaders( | ||
| const std::initializer_list<std::pair<const char*, const char*>>& headers) { | ||
| registerSpanCatcher(); | ||
| OpenCensusConfig oc_config; | ||
| NiceMock<LocalInfo::MockLocalInfo> local_info; | ||
| oc_config.add_incoming_trace_context(OpenCensusConfig::NONE); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Arguably this could be set in the
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would prefer to leave this as-is:
As an alternative: how about if I make |
||
| oc_config.add_incoming_trace_context(OpenCensusConfig::B3); | ||
| oc_config.add_incoming_trace_context(OpenCensusConfig::TRACE_CONTEXT); | ||
| oc_config.add_incoming_trace_context(OpenCensusConfig::GRPC_TRACE_BIN); | ||
| oc_config.add_incoming_trace_context(OpenCensusConfig::CLOUD_TRACE_CONTEXT); | ||
| oc_config.add_outgoing_trace_context(OpenCensusConfig::NONE); | ||
| oc_config.add_outgoing_trace_context(OpenCensusConfig::B3); | ||
| oc_config.add_outgoing_trace_context(OpenCensusConfig::TRACE_CONTEXT); | ||
| oc_config.add_outgoing_trace_context(OpenCensusConfig::GRPC_TRACE_BIN); | ||
| oc_config.add_outgoing_trace_context(OpenCensusConfig::CLOUD_TRACE_CONTEXT); | ||
| std::unique_ptr<Tracing::Driver> driver(new OpenCensus::Driver(oc_config, local_info)); | ||
| NiceMock<Tracing::MockConfig> config; | ||
| Http::TestHeaderMapImpl request_headers{ | ||
| {":path", "/"}, | ||
| {":method", "GET"}, | ||
| {"x-request-id", "foo"}, | ||
| }; | ||
| for (const auto& kv : headers) { | ||
| request_headers.addCopy(Http::LowerCaseString(kv.first), kv.second); | ||
| } | ||
|
|
||
| const std::string operation_name{"my_operation_2"}; | ||
| SystemTime start_time; | ||
| Http::TestHeaderMapImpl injected_headers; | ||
| { | ||
| Tracing::SpanPtr span = driver->startSpan(config, request_headers, operation_name, start_time, | ||
| {Tracing::Reason::Sampling, false}); | ||
| span->injectContext(injected_headers); | ||
| span->finishSpan(); | ||
| } | ||
|
|
||
| // Retrieve SpanData from the OpenCensus trace exporter. | ||
| std::vector<SpanData> spans = getSpanCatcher()->catchSpans(); | ||
| ASSERT_EQ(1, spans.size()); | ||
| const auto& sd = spans[0]; | ||
| ENVOY_LOG_MISC(debug, "{}", sd.DebugString()); | ||
|
|
||
| // Check contents. | ||
| EXPECT_TRUE(sd.has_remote_parent()); | ||
| EXPECT_EQ("6162636465666768", sd.parent_span_id().ToHex()); | ||
| EXPECT_EQ("404142434445464748494a4b4c4d4e4f", sd.context().trace_id().ToHex()); | ||
| EXPECT_TRUE(sd.context().trace_options().IsSampled()) | ||
| << "parent was sampled, child should be also"; | ||
|
|
||
| // Check injectContext. | ||
| // The SpanID is unpredictable so re-serialize context to check it. | ||
| const auto& ctx = sd.context(); | ||
| const auto& hdrs = injected_headers; | ||
| EXPECT_THAT(hdrs, ContainHeader("traceparent", | ||
| ::opencensus::trace::propagation::ToTraceParentHeader(ctx))); | ||
| { | ||
| std::string expected = ::opencensus::trace::propagation::ToGrpcTraceBinHeader(ctx); | ||
| expected = Base64::encode(expected.data(), expected.size(), /*add_padding=*/false); | ||
| EXPECT_THAT(hdrs, ContainHeader("grpc-trace-bin", expected)); | ||
| } | ||
| EXPECT_THAT(hdrs, | ||
| ContainHeader("x-cloud-trace-context", | ||
| ::opencensus::trace::propagation::ToCloudTraceContextHeader(ctx))); | ||
| EXPECT_THAT(hdrs, ContainHeader("x-b3-traceid", "404142434445464748494a4b4c4d4e4f")); | ||
| EXPECT_THAT( | ||
| hdrs, ContainHeader("x-b3-spanid", ::opencensus::trace::propagation::ToB3SpanIdHeader(ctx))); | ||
| EXPECT_THAT(hdrs, ContainHeader("x-b3-sampled", "1")); | ||
| } | ||
| } // namespace | ||
|
|
||
| TEST(OpenCensusTracerTest, PropagateTraceParentContext) { | ||
| testIncomingHeaders({{"traceparent", "00-404142434445464748494a4b4c4d4e4f-6162636465666768-01"}}); | ||
| } | ||
|
|
||
| TEST(OpenCensusTracerTest, PropagateGrpcTraceBinContext) { | ||
| testIncomingHeaders({{"grpc-trace-bin", "AABAQUJDREVGR0hJSktMTU5PAWFiY2RlZmdoAgE"}}); | ||
| } | ||
|
|
||
| TEST(OpenCensusTracerTest, PropagateCloudTraceContext) { | ||
| testIncomingHeaders( | ||
| {{"x-cloud-trace-context", "404142434445464748494a4b4c4d4e4f/7017280452245743464;o=1"}}); | ||
| } | ||
|
|
||
| TEST(OpenCensusTracerTest, PropagateB3Context) { | ||
| testIncomingHeaders({{"x-b3-traceid", "404142434445464748494a4b4c4d4e4f"}, | ||
| {"x-b3-spanid", "6162636465666768"}, | ||
| {"x-b3-sampled", "1"}}); | ||
| } | ||
|
|
||
| helper("traceparent", "00-404142434445464748494a4b4c4d4e4f-6162636465666768-01"); | ||
| helper("grpc-trace-bin", "AABAQUJDREVGR0hJSktMTU5PAWFiY2RlZmdoAgE"); | ||
| helper("x-cloud-trace-context", "404142434445464748494a4b4c4d4e4f/7017280452245743464;o=1"); | ||
| TEST(OpenCensusTracerTest, PropagateB3ContextWithDebugFlag) { | ||
| testIncomingHeaders({{"x-b3-traceid", "404142434445464748494a4b4c4d4e4f"}, | ||
| {"x-b3-spanid", "6162636465666768"}, | ||
| {"x-b3-flags", "1"}}); // Debug flag causes sampling. | ||
| } | ||
|
|
||
| namespace { | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.