Skip to content

Commit 86b86e1

Browse files
authored
Only display Baggage enduser.id when identity is present (#2197)
1 parent 2a2ca64 commit 86b86e1

File tree

5 files changed

+94
-9
lines changed

5 files changed

+94
-9
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nativelink-util/BUILD.bazel

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ rust_test_suite(
108108
"tests/proto_stream_utils_test.rs",
109109
"tests/resource_info_test.rs",
110110
"tests/retry_test.rs",
111+
"tests/telemetry_test.rs",
111112
"tests/tls_utils_test.rs",
112113
],
113114
compile_data = [
@@ -124,6 +125,7 @@ rust_test_suite(
124125
"//nativelink-config",
125126
"//nativelink-error",
126127
"//nativelink-proto",
128+
"@crates//:axum",
127129
"@crates//:bytes",
128130
"@crates//:futures",
129131
"@crates//:hex",
@@ -141,6 +143,7 @@ rust_test_suite(
141143
"@crates//:tokio-stream",
142144
"@crates//:tokio-util",
143145
"@crates//:tonic",
146+
"@crates//:tower",
144147
"@crates//:tracing",
145148
"@crates//:tracing-test",
146149
"@crates//:uuid",

nativelink-util/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ tokio-stream = { version = "0.1.17", features = [
7070
], default-features = false }
7171
tokio-util = { version = "0.7.14", default-features = false }
7272
tonic = { version = "0.13.0", features = [
73+
"router",
7374
"tls-native-roots",
7475
"tls-ring",
7576
"transport",
@@ -96,6 +97,7 @@ walkdir = { version = "2.5.0", default-features = false }
9697
[dev-dependencies]
9798
nativelink-macro = { path = "../nativelink-macro" }
9899

100+
axum = { version = "0.8.3", default-features = false }
99101
http-body-util = { version = "0.1.3", default-features = false }
100102
pretty_assertions = { version = "1.4.1", features = [
101103
"std",

nativelink-util/src/telemetry.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -254,23 +254,25 @@ where
254254
.map(|value| value.as_str().to_string())
255255
.unwrap_or_default();
256256

257-
if identity.is_empty() && self.identity_required {
258-
return Box::pin(async move {
259-
Ok(tonic::Status::failed_precondition(
260-
r"
257+
if identity.is_empty() {
258+
if self.identity_required {
259+
return Box::pin(async move {
260+
Ok(tonic::Status::failed_precondition(
261+
r"
261262
262263
NativeLink instance configured to require this OpenTelemetry Baggage header:
263264
264265
`Baggage: enduser.id=YOUR_IDENTITY`
265266
266267
",
267-
)
268-
.into_http())
269-
});
268+
)
269+
.into_http())
270+
});
271+
}
272+
} else {
273+
debug!("Baggage enduser.id: {identity}");
270274
}
271275

272-
debug!("Baggage enduser.id: {identity}");
273-
274276
let tracer = global::tracer("origin_middleware");
275277
let span = tracer
276278
.span_builder("origin_request")
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
use axum::Router;
2+
use hyper::{Request, StatusCode, Uri};
3+
use nativelink_macro::nativelink_test;
4+
use opentelemetry::baggage::BaggageExt;
5+
use opentelemetry::{Context, KeyValue};
6+
use tonic::body::Body;
7+
use tonic::service::Routes;
8+
use tower::{Service, ServiceExt};
9+
use tracing::warn;
10+
11+
fn demo_service() -> Router {
12+
let tonic_services = Routes::builder().routes();
13+
tonic_services
14+
.into_axum_router()
15+
.fallback(|uri: Uri| async move {
16+
warn!("No route for {uri}");
17+
(StatusCode::NOT_FOUND, format!("No route for {uri}"))
18+
})
19+
.layer(nativelink_util::telemetry::OtlpLayer::new(false))
20+
}
21+
22+
async fn run_request(
23+
svc: &mut Router,
24+
request: Request<Body>,
25+
) -> Result<(), Box<dyn core::error::Error>> {
26+
let response: hyper::Response<axum::body::Body> =
27+
svc.as_service().ready().await?.call(request).await?;
28+
assert_eq!(response.status(), 404);
29+
30+
let response = String::from_utf8(
31+
axum::body::to_bytes(response.into_body(), usize::MAX)
32+
.await?
33+
.to_vec(),
34+
)?;
35+
assert_eq!(response, String::from("No route for /demo"));
36+
Ok(())
37+
}
38+
39+
#[nativelink_test]
40+
async fn oltp_logs_no_baggage() -> Result<(), Box<dyn core::error::Error>> {
41+
let mut svc = demo_service();
42+
43+
let request: Request<Body> = Request::builder()
44+
.method("GET")
45+
.uri("/demo")
46+
.body(Body::empty())?;
47+
run_request(&mut svc, request).await?;
48+
49+
assert!(!logs_contain("Baggage enduser.id:"));
50+
51+
Ok(())
52+
}
53+
54+
#[nativelink_test]
55+
async fn oltp_logs_with_baggage() -> Result<(), Box<dyn core::error::Error>> {
56+
let mut svc = demo_service();
57+
58+
let mut request: Request<Body> = Request::builder()
59+
.method("GET")
60+
.uri("/demo")
61+
.body(Body::empty())?;
62+
63+
let cx_guard =
64+
Context::map_current(|cx| cx.with_baggage([KeyValue::new("enduser.id", "foobar")]))
65+
.attach();
66+
67+
request
68+
.headers_mut()
69+
.insert("baggage", "enduser.id=foobar".parse().unwrap());
70+
71+
run_request(&mut svc, request).await?;
72+
73+
assert!(logs_contain("Baggage enduser.id: foobar"));
74+
drop(cx_guard);
75+
76+
Ok(())
77+
}

0 commit comments

Comments
 (0)