Skip to content

Commit 9afd9b6

Browse files
committed
fix(ingress-nginx): filter out healthcheck traces
1 parent 70273f4 commit 9afd9b6

File tree

4 files changed

+63
-16
lines changed

4 files changed

+63
-16
lines changed

src/tracing_library.cpp

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,24 @@ extern "C" {
3131
namespace datadog {
3232
namespace nginx {
3333

34-
inline constexpr std::string_view integration_name_from_flavor(
35-
flavor nginx_flavor) {
34+
inline constexpr std::string_view
35+
integration_name_from_flavor(flavor nginx_flavor) {
3636
switch (nginx_flavor) {
37-
case flavor::vanilla:
38-
return "nginx";
39-
case flavor::openresty:
40-
return "nginx:openresty";
41-
case flavor::ingress_nginx:
42-
return "nginx:ingress-nginx";
37+
case flavor::vanilla:
38+
return "nginx";
39+
case flavor::openresty:
40+
return "nginx:openresty";
41+
case flavor::ingress_nginx:
42+
return "nginx:ingress-nginx";
4343
}
4444

4545
static_assert(true, "unknown NGINX flavor");
4646
std::abort();
4747
}
4848

49-
dd::Expected<dd::Tracer> TracingLibrary::make_tracer(
50-
const datadog_main_conf_t &nginx_conf, std::shared_ptr<dd::Logger> logger) {
49+
dd::Expected<dd::Tracer>
50+
TracingLibrary::make_tracer(const datadog_main_conf_t &nginx_conf,
51+
std::shared_ptr<dd::Logger> logger) {
5152
dd::TracerConfig config;
5253
config.logger = std::move(logger);
5354
config.agent.event_scheduler = std::make_shared<NgxEventScheduler>();
@@ -97,8 +98,8 @@ dd::Expected<dd::Tracer> TracingLibrary::make_tracer(
9798
(nginx_conf.appsec_enabled != NGX_CONF_UNSET);
9899
security::register_with_remote_cfg(
99100
config.agent,
100-
!has_custom_ruleset, // no custom ruleset => ruleset via rem cfg
101-
!appsec_enabling_explicit); // no explicit => control via rem cfg
101+
!has_custom_ruleset, // no custom ruleset => ruleset via rem cfg
102+
!appsec_enabling_explicit); // no explicit => control via rem cfg
102103
}
103104
#endif
104105

@@ -119,6 +120,17 @@ dd::Expected<dd::Tracer> TracingLibrary::make_tracer(
119120
.resource = "GET /is-dynamic-lb-initialized",
120121
.tags = {}},
121122
.mechanism = datadog::tracing::SamplingMechanism::RULE});
123+
124+
// TODO(@dmehala): Disable tracing if `stub_status on;`.
125+
final_config->trace_sampler.rules.emplace_back(
126+
datadog::tracing::TraceSamplerRule{
127+
.rate = datadog::tracing::Rate::zero(),
128+
.matcher =
129+
datadog::tracing::SpanMatcher{.service = "*",
130+
.name = "*",
131+
.resource = "GET /nginx_status",
132+
.tags = {}},
133+
.mechanism = datadog::tracing::SamplingMechanism::RULE});
122134
}
123135

124136
if (!final_config) {
@@ -145,7 +157,7 @@ namespace {
145157
class SpanContextJSONWriter : public dd::DictWriter {
146158
rapidjson::Document output_object_;
147159

148-
public:
160+
public:
149161
SpanContextJSONWriter() : output_object_() { output_object_.SetObject(); }
150162

151163
void set(std::string_view key, std::string_view value) override {
@@ -193,7 +205,7 @@ std::string span_property(std::string_view key, const dd::Span &span) {
193205
return not_found;
194206
}
195207

196-
} // namespace
208+
} // namespace
197209

198210
NginxVariableFamily TracingLibrary::span_variables() {
199211
return {.prefix = "datadog_", .resolve = span_property};
@@ -246,5 +258,5 @@ bool TracingLibrary::trace_locations_by_default() { return false; }
246258

247259
bool TracingLibrary::bagage_span_tags_by_default() { return true; }
248260

249-
} // namespace nginx
250-
} // namespace datadog
261+
} // namespace nginx
262+
} // namespace datadog

test/cases/ingress-nginx/conf/main.conf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,9 @@ http {
2121
location /is-dynamic-lb-initialized {
2222
proxy_pass http://http:8080;
2323
}
24+
25+
location /nginx_status {
26+
proxy_pass http://http:8080;
27+
}
2428
}
2529
}

test/cases/ingress-nginx/test_rules.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,27 @@ def test_healthcheck(self):
3535
response = json.loads(body)
3636
self.assertEqual(response["headers"]["x-datadog-sampling-priority"],
3737
"1")
38+
39+
def test_healthcheck_stubstatus(self):
40+
# Healthcheck request MUST not be generated traces.
41+
conf_path = Path(__file__).parent / "conf" / "main.conf"
42+
conf_text = conf_path.read_text()
43+
44+
status, log_lines = self.orch.nginx_replace_config(
45+
conf_text, conf_path.name)
46+
self.assertEqual(status, 0, log_lines)
47+
48+
status, _, body = self.orch.send_nginx_http_request(
49+
"/nginx_status")
50+
self.assertEqual(status, 200)
51+
52+
response = json.loads(body)
53+
self.assertEqual(response["headers"]["x-datadog-sampling-priority"],
54+
"-1")
55+
56+
status, _, body = self.orch.send_nginx_http_request("/")
57+
self.assertEqual(status, 200)
58+
59+
response = json.loads(body)
60+
self.assertEqual(response["headers"]["x-datadog-sampling-priority"],
61+
"1")

test/cases/opentelemetry/test_otel_drop_in_support.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ def test_directives(self):
137137
"service": "*",
138138
"tags": {},
139139
})
140+
rules.append({
141+
"name": "*",
142+
"resource": "GET /nginx_status",
143+
"sample_rate": 0.0,
144+
"service": "*",
145+
"tags": {},
146+
})
140147

141148
pattern = {
142149
"service": "foo",

0 commit comments

Comments
 (0)