Skip to content

Commit 1d4a168

Browse files
committed
untested: propagation style order matters
1 parent 67b2f96 commit 1d4a168

16 files changed

+169
-160
lines changed

BUILD.bazel

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ cc_library(
2626
"src/datadog/null_collector.cpp",
2727
"src/datadog/optional.cpp",
2828
"src/datadog/parse_util.cpp",
29-
"src/datadog/propagation_styles.cpp",
29+
"src/datadog/propagation_style.cpp",
3030
"src/datadog/rate.cpp",
3131
"src/datadog/sampling_decision.cpp",
3232
"src/datadog/sampling_mechanism.cpp",
@@ -77,7 +77,7 @@ cc_library(
7777
"src/datadog/null_collector.h",
7878
"src/datadog/optional.h",
7979
"src/datadog/parse_util.h",
80-
"src/datadog/propagation_styles.h",
80+
"src/datadog/propagation_style.h",
8181
"src/datadog/rate.h",
8282
"src/datadog/sampling_decision.h",
8383
"src/datadog/sampling_mechanism.h",

CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ project(dd-trace-cpp)
66

77
option(BUILD_COVERAGE "Build code with code coverage profiling instrumentation" OFF)
88
option(BUILD_EXAMPLE "Build the example program (example/)" OFF)
9+
option(BUILD_TESTING "Build the unit tests (test/)" OFF)
10+
option(SANITIZE "Build with address sanitizer and undefined behavior sanitizer" OFF)
911

1012
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
1113
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
@@ -78,7 +80,7 @@ target_sources(dd_trace_cpp PRIVATE
7880
src/datadog/null_collector.cpp
7981
src/datadog/optional.cpp
8082
src/datadog/parse_util.cpp
81-
src/datadog/propagation_styles.cpp
83+
src/datadog/propagation_style.cpp
8284
src/datadog/rate.cpp
8385
src/datadog/sampling_decision.cpp
8486
src/datadog/sampling_mechanism.cpp
@@ -135,7 +137,7 @@ target_sources(dd_trace_cpp PUBLIC
135137
src/datadog/null_collector.h
136138
src/datadog/optional.h
137139
src/datadog/parse_util.h
138-
src/datadog/propagation_styles.h
140+
src/datadog/propagation_style.h
139141
src/datadog/rate.h
140142
src/datadog/sampling_decision.h
141143
src/datadog/sampling_mechanism.h

doc/includes.dot

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ digraph G {
7575
node73 [label="version.cpp"];
7676
node74 [label="span_matcher.h"];
7777
node75 [label="span_sampler_config.h"];
78-
node76 [label="propagation_styles.cpp"];
78+
node76 [label="propagation_style.cpp"];
7979
node77 [label="dict_reader.h"];
8080
node78 [label="span_matcher.cpp"];
8181
node79 [label="default_http_client_curl.cpp"];
@@ -84,7 +84,7 @@ digraph G {
8484
node82 [label="clock.cpp"];
8585
node83 [label="collector_response.cpp"];
8686
node84 [label="sampling_priority.h"];
87-
node85 [label="propagation_styles.h"];
87+
node85 [label="propagation_style.h"];
8888
node86 [label="limiter.cpp"];
8989
node87 [label="net_util.h"];
9090
node88 [label="error.cpp"];

doc/includes.svg

Lines changed: 2 additions & 2 deletions
Loading

src/datadog/error.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ struct Error {
6868
MISSING_TRACE_ID = 43,
6969
ENVOY_HTTP_CLIENT_FAILURE = 44,
7070
MULTIPLE_PROPAGATION_STYLE_ENVIRONMENT_VARIABLES = 45,
71+
DUPLICATE_PROPAGATION_STYLE = 46,
7172
};
7273

7374
Code code;

src/datadog/propagation_style.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "propagation_style.h"
2+
3+
#include <cassert>
4+
5+
#include "json.hpp"
6+
7+
namespace datadog {
8+
namespace tracing {
9+
10+
nlohmann::json to_json(PropagationStyle style) {
11+
switch (style) {
12+
case PropagationStyle::DATADOG:
13+
return "datadog";
14+
case PropagationStyle::B3:
15+
return "B3";
16+
default:
17+
assert(style == PropagationStyle::NONE);
18+
return "none";
19+
}
20+
}
21+
22+
nlohmann::json to_json(const std::vector<PropagationStyle>& styles) {
23+
std::vector<nlohmann::json> styles_json;
24+
for (const auto style : styles) {
25+
styles_json.push_back(to_json(style));
26+
}
27+
return styles_json;
28+
}
29+
30+
} // namespace tracing
31+
} // namespace datadog

src/datadog/propagation_style.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#pragma once
2+
3+
// This component provides an `enum class`, `PropagationStyle`, that indicates a
4+
// trace context extraction or injection format to be used. `TracerConfig` has
5+
// one `std::vector<PropagationStyle>` for extraction and another for injection.
6+
// See `tracer_config.h`.
7+
8+
#include <vector>
9+
10+
#include "json_fwd.hpp"
11+
12+
namespace datadog {
13+
namespace tracing {
14+
15+
enum class PropagationStyle {
16+
// Datadog headers, e.g. X-Datadog-Trace-ID
17+
DATADOG,
18+
// B3 multi-header style, e.g. X-B3-TraceID
19+
B3,
20+
// The absence of propagation. If this is the only style set, then
21+
// propagation is disabled in the relevant direction (extraction or
22+
// injection).
23+
NONE,
24+
};
25+
26+
nlohmann::json to_json(PropagationStyle style);
27+
nlohmann::json to_json(const std::vector<PropagationStyle>& styles);
28+
29+
} // namespace tracing
30+
} // namespace datadog

src/datadog/propagation_styles.cpp

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/datadog/propagation_styles.h

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/datadog/trace_segment.cpp

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ TraceSegment::TraceSegment(
4545
const std::shared_ptr<TraceSampler>& trace_sampler,
4646
const std::shared_ptr<SpanSampler>& span_sampler,
4747
const std::shared_ptr<const SpanDefaults>& defaults,
48-
const PropagationStyles& injection_styles,
48+
const std::vector<PropagationStyle>& injection_styles,
4949
const Optional<std::string>& hostname, Optional<std::string> origin,
5050
std::size_t tags_header_max_size,
5151
std::unordered_map<std::string, std::string> trace_tags,
@@ -224,8 +224,8 @@ void TraceSegment::inject(DictWriter& writer, const SpanData& span) {
224224
// Origin and trace tag headers are always propagated, unless the only
225225
// injection style is "none".
226226
// Other headers depend on the injection styles.
227-
if (injection_styles_.none && !injection_styles_.datadog &&
228-
!injection_styles_.b3) {
227+
if (injection_styles_.size() == 1 &&
228+
injection_styles_[0] == PropagationStyle::NONE) {
229229
return;
230230
}
231231

@@ -248,17 +248,22 @@ void TraceSegment::inject(DictWriter& writer, const SpanData& span) {
248248
writer.set("x-datadog-tags", encoded_trace_tags);
249249
}
250250

251-
if (injection_styles_.datadog) {
252-
writer.set("x-datadog-trace-id", std::to_string(span.trace_id));
253-
writer.set("x-datadog-parent-id", std::to_string(span.span_id));
254-
writer.set("x-datadog-sampling-priority",
255-
std::to_string(sampling_priority));
256-
}
257-
258-
if (injection_styles_.b3) {
259-
writer.set("x-b3-traceid", hex(span.trace_id));
260-
writer.set("x-b3-spanid", hex(span.span_id));
261-
writer.set("x-b3-sampled", std::to_string(int(sampling_priority > 0)));
251+
for (const auto style : injection_styles_) {
252+
switch (style) {
253+
case PropagationStyle::DATADOG:
254+
writer.set("x-datadog-trace-id", std::to_string(span.trace_id));
255+
writer.set("x-datadog-parent-id", std::to_string(span.span_id));
256+
writer.set("x-datadog-sampling-priority",
257+
std::to_string(sampling_priority));
258+
break;
259+
case PropagationStyle::B3:
260+
writer.set("x-b3-traceid", hex(span.trace_id));
261+
writer.set("x-b3-spanid", hex(span.span_id));
262+
writer.set("x-b3-sampled", std::to_string(int(sampling_priority > 0)));
263+
break;
264+
case PropagationStyle::NONE:
265+
break;
266+
}
262267
}
263268
}
264269

0 commit comments

Comments
 (0)