Skip to content

Commit e8c15c1

Browse files
committed
refactor tests
1 parent 2b376c8 commit e8c15c1

2 files changed

Lines changed: 126 additions & 105 deletions

File tree

libdd-data-pipeline/tests/test_trace_exporter.rs

Lines changed: 0 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -243,111 +243,6 @@ mod tracing_integration_tests {
243243
test_agent.assert_snapshot(snapshot_name).await;
244244
}
245245

246-
#[cfg_attr(miri, ignore)]
247-
#[tokio::test]
248-
async fn otlp_export_sends_correct_payload() {
249-
use httpmock::MockServer;
250-
251-
let server = MockServer::start_async().await;
252-
253-
// Assert the OTLP request structure using json_body_includes matchers.
254-
// resourceSpans must be present with the correct service.name and environment resource
255-
// attributes, and spans must contain the expected name prefix.
256-
let mut mock = server
257-
.mock_async(|when, then| {
258-
when.method("POST")
259-
.path("/v1/traces")
260-
.header("content-type", "application/json")
261-
.json_body_includes(
262-
serde_json::json!({
263-
"resourceSpans": [{
264-
"resource": {
265-
"attributes": [
266-
{"key": "service.name", "value": {"stringValue": "test"}},
267-
]
268-
}
269-
}]
270-
})
271-
.to_string(),
272-
);
273-
then.status(200).body("{}");
274-
})
275-
.await;
276-
277-
let otlp_endpoint = format!("http://localhost:{}/v1/traces", server.port());
278-
279-
let task_result = task::spawn_blocking(move || {
280-
let mut builder = TraceExporter::builder();
281-
builder
282-
.set_otlp_endpoint(&otlp_endpoint)
283-
.set_language("test-lang")
284-
.set_language_version("2.0")
285-
.set_language_interpreter_vendor("vendor")
286-
.set_language_interpreter("interpreter")
287-
.set_tracer_version("1.0")
288-
.set_env("test_env")
289-
.set_service("test");
290-
291-
let trace_exporter = builder.build().expect("Unable to build TraceExporter");
292-
let data = get_v04_trace_snapshot_test_payload("test_otlp_export");
293-
let response = trace_exporter.send(data.as_ref());
294-
assert!(response.is_ok(), "OTLP send failed: {:?}", response.err());
295-
})
296-
.await;
297-
298-
assert!(task_result.is_ok());
299-
assert_eq!(mock.calls_async().await, 1);
300-
mock.delete();
301-
}
302-
303-
#[cfg_attr(miri, ignore)]
304-
#[tokio::test]
305-
async fn otlp_export_unsampled_traces_not_exported() {
306-
use httpmock::MockServer;
307-
308-
let server = MockServer::start_async().await;
309-
let mut mock = server
310-
.mock_async(|when, then| {
311-
when.method("POST").path("/v1/traces");
312-
then.status(200).body("{}");
313-
})
314-
.await;
315-
316-
let otlp_endpoint = format!("http://localhost:{}/v1/traces", server.port());
317-
318-
// Build a v04 payload where all spans have sampling priority -1 (drop).
319-
let data = {
320-
let mut span = create_test_json_span(1234, 12341, 0, 1, true);
321-
span["metrics"]["_sampling_priority_v1"] = serde_json::json!(-1.0);
322-
rmp_serde::to_vec_named(&vec![vec![span]]).unwrap()
323-
};
324-
325-
let task_result = task::spawn_blocking(move || {
326-
let mut builder = TraceExporter::builder();
327-
builder
328-
.set_otlp_endpoint(&otlp_endpoint)
329-
.set_language("test-lang")
330-
.set_language_version("2.0")
331-
.set_tracer_version("1.0")
332-
.set_env("test_env")
333-
.set_service("test");
334-
335-
let trace_exporter = builder.build().expect("Unable to build TraceExporter");
336-
let response = trace_exporter.send(data.as_ref());
337-
assert!(response.is_ok(), "send failed: {:?}", response.err());
338-
})
339-
.await;
340-
341-
assert!(task_result.is_ok());
342-
// The mock must not have been called: unsampled traces should be dropped before export.
343-
assert_eq!(
344-
mock.calls_async().await,
345-
0,
346-
"Unsampled trace was exported — sampling is not being respected"
347-
);
348-
mock.delete();
349-
}
350-
351246
#[cfg_attr(miri, ignore)]
352247
#[cfg(target_os = "linux")]
353248
#[tokio::test]
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Copyright 2024-Present Datadog, Inc. https://www.datadoghq.com/
2+
// SPDX-License-Identifier: Apache-2.0
3+
#[cfg(test)]
4+
mod otlp_export_tests {
5+
use libdd_data_pipeline::trace_exporter::TraceExporter;
6+
use libdd_trace_utils::test_utils::create_test_json_span;
7+
use serde_json::json;
8+
use tokio::task;
9+
10+
fn get_v04_trace_snapshot_test_payload(name_prefix: &str) -> Vec<u8> {
11+
let mut span_1 = create_test_json_span(1234, 12342, 12341, 1, false);
12+
span_1["name"] = json!(format!("{name_prefix}_01"));
13+
span_1["metrics"] = json!({
14+
"_dd_metric1": 1.0,
15+
"_dd_metric2": 2.0
16+
});
17+
let mut span_2 = create_test_json_span(1234, 12343, 12341, 1, false);
18+
span_2["name"] = json!(format!("{name_prefix}_02"));
19+
rmp_serde::to_vec_named(&vec![vec![span_1, span_2]]).unwrap()
20+
}
21+
22+
#[cfg_attr(miri, ignore)]
23+
#[tokio::test]
24+
async fn otlp_export_sends_correct_payload() {
25+
use httpmock::MockServer;
26+
27+
let server = MockServer::start_async().await;
28+
29+
// Assert the OTLP request structure using json_body_includes matchers.
30+
// resourceSpans must be present with the correct service.name and environment resource
31+
// attributes, and spans must contain the expected name prefix.
32+
let mut mock = server
33+
.mock_async(|when, then| {
34+
when.method("POST")
35+
.path("/v1/traces")
36+
.header("content-type", "application/json")
37+
.json_body_includes(
38+
serde_json::json!({
39+
"resourceSpans": [{
40+
"resource": {
41+
"attributes": [
42+
{"key": "service.name", "value": {"stringValue": "test"}},
43+
]
44+
}
45+
}]
46+
})
47+
.to_string(),
48+
);
49+
then.status(200).body("{}");
50+
})
51+
.await;
52+
53+
let otlp_endpoint = format!("http://localhost:{}/v1/traces", server.port());
54+
55+
let task_result = task::spawn_blocking(move || {
56+
let mut builder = TraceExporter::builder();
57+
builder
58+
.set_otlp_endpoint(&otlp_endpoint)
59+
.set_language("test-lang")
60+
.set_language_version("2.0")
61+
.set_language_interpreter_vendor("vendor")
62+
.set_language_interpreter("interpreter")
63+
.set_tracer_version("1.0")
64+
.set_env("test_env")
65+
.set_service("test");
66+
67+
let trace_exporter = builder.build().expect("Unable to build TraceExporter");
68+
let data = get_v04_trace_snapshot_test_payload("test_otlp_export");
69+
let response = trace_exporter.send(data.as_ref());
70+
assert!(response.is_ok(), "OTLP send failed: {:?}", response.err());
71+
})
72+
.await;
73+
74+
assert!(task_result.is_ok());
75+
assert_eq!(mock.calls_async().await, 1);
76+
mock.delete();
77+
}
78+
79+
#[cfg_attr(miri, ignore)]
80+
#[tokio::test]
81+
async fn otlp_export_unsampled_traces_not_exported() {
82+
use httpmock::MockServer;
83+
84+
let server = MockServer::start_async().await;
85+
let mut mock = server
86+
.mock_async(|when, then| {
87+
when.method("POST").path("/v1/traces");
88+
then.status(200).body("{}");
89+
})
90+
.await;
91+
92+
let otlp_endpoint = format!("http://localhost:{}/v1/traces", server.port());
93+
94+
// Build a v04 payload where all spans have sampling priority -1 (drop).
95+
let data = {
96+
let mut span = create_test_json_span(1234, 12341, 0, 1, true);
97+
span["metrics"]["_sampling_priority_v1"] = serde_json::json!(-1.0);
98+
rmp_serde::to_vec_named(&vec![vec![span]]).unwrap()
99+
};
100+
101+
let task_result = task::spawn_blocking(move || {
102+
let mut builder = TraceExporter::builder();
103+
builder
104+
.set_otlp_endpoint(&otlp_endpoint)
105+
.set_language("test-lang")
106+
.set_language_version("2.0")
107+
.set_tracer_version("1.0")
108+
.set_env("test_env")
109+
.set_service("test");
110+
111+
let trace_exporter = builder.build().expect("Unable to build TraceExporter");
112+
let response = trace_exporter.send(data.as_ref());
113+
assert!(response.is_ok(), "send failed: {:?}", response.err());
114+
})
115+
.await;
116+
117+
assert!(task_result.is_ok());
118+
// The mock must not have been called: unsampled traces should be dropped before export.
119+
assert_eq!(
120+
mock.calls_async().await,
121+
0,
122+
"Unsampled trace was exported — sampling is not being respected"
123+
);
124+
mock.delete();
125+
}
126+
}

0 commit comments

Comments
 (0)