Skip to content

Commit d994950

Browse files
committed
Standardize trace headers
Brings it in line with the naming of other headers we have; sets us up to remove the unstable feature gate.
1 parent 963aa81 commit d994950

File tree

2 files changed

+65
-51
lines changed

2 files changed

+65
-51
lines changed

src/headers/constants.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ pub const SERVER_TIMING: HeaderName = HeaderName::from_lowercase_str("server-tim
143143
/// The `Te` Header
144144
pub const TE: HeaderName = HeaderName::from_lowercase_str("te");
145145

146+
/// The `Traceparent` Header
147+
pub const TRACEPARENT: HeaderName = HeaderName::from_lowercase_str("traceparent");
148+
146149
/// The `Trailer` Header
147150
pub const TRAILER: HeaderName = HeaderName::from_lowercase_str("trailer");
148151

src/trace/trace_context.rs

Lines changed: 62 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use rand::Rng;
22
use std::fmt;
33

4-
use crate::Headers;
4+
use crate::headers::{HeaderName, HeaderValue, Headers, TRACEPARENT};
55

6-
/// Extract and inject [Trace-Context](https://w3c.github.io/trace-context/) headers.
6+
/// Extract and apply [Trace-Context](https://w3c.github.io/trace-context/) headers.
77
///
88
/// ## Examples
99
///
@@ -13,11 +13,11 @@ use crate::Headers;
1313
/// let mut res = http_types::Response::new(200);
1414
///
1515
/// res.insert_header(
16-
/// "traceparent",
16+
/// TRACEPARENT,
1717
/// "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01"
1818
/// );
1919
///
20-
/// let context = TraceContext::extract(&res).unwrap();
20+
/// let context = TraceContext::from_headers(&res).unwrap();
2121
///
2222
/// let trace_id = u128::from_str_radix("0af7651916cd43dd8448eb211c80319c", 16);
2323
/// let parent_id = u64::from_str_radix("00f067aa0ba902b7", 16);
@@ -36,6 +36,32 @@ pub struct TraceContext {
3636
}
3737

3838
impl TraceContext {
39+
/// Generate a new TraceContect object without a parent.
40+
///
41+
/// By default root TraceContext objects are sampled.
42+
/// To mark it unsampled, call `context.set_sampled(false)`.
43+
///
44+
/// ## Examples
45+
/// ```
46+
/// use http_types::trace::TraceContext;
47+
///
48+
/// let context = TraceContext::new();
49+
///
50+
/// assert_eq!(context.parent_id(), None);
51+
/// assert_eq!(context.sampled(), true);
52+
/// ```
53+
pub fn new() -> Self {
54+
let mut rng = rand::thread_rng();
55+
56+
Self {
57+
id: rng.gen(),
58+
version: 0,
59+
trace_id: rng.gen(),
60+
parent_id: None,
61+
flags: 1,
62+
}
63+
}
64+
3965
/// Create and return TraceContext object based on `traceparent` HTTP header.
4066
///
4167
/// ## Examples
@@ -44,11 +70,11 @@ impl TraceContext {
4470
///
4571
/// let mut res = http_types::Response::new(200);
4672
/// res.insert_header(
47-
/// "traceparent",
73+
/// TRACEPARENT,
4874
/// "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01"
4975
/// );
5076
///
51-
/// let context = TraceContext::extract(&res).unwrap();
77+
/// let context = TraceContext::from_headers(&res).unwrap();
5278
///
5379
/// let trace_id = u128::from_str_radix("0af7651916cd43dd8448eb211c80319c", 16);
5480
/// let parent_id = u64::from_str_radix("00f067aa0ba902b7", 16);
@@ -57,13 +83,13 @@ impl TraceContext {
5783
/// assert_eq!(context.parent_id(), parent_id.ok());
5884
/// assert_eq!(context.sampled(), true);
5985
/// ```
60-
pub fn extract(headers: impl AsRef<Headers>) -> crate::Result<Self> {
86+
pub fn from_headers(headers: impl AsRef<Headers>) -> crate::Result<Self> {
6187
let headers = headers.as_ref();
6288
let mut rng = rand::thread_rng();
6389

64-
let traceparent = match headers.get("traceparent") {
90+
let traceparent = match headers.get(TRACEPARENT) {
6591
Some(header) => header.as_str(),
66-
None => return Ok(Self::new_root()),
92+
None => return Ok(Self::new()),
6793
};
6894

6995
let parts: Vec<&str> = traceparent.split('-').collect();
@@ -77,32 +103,6 @@ impl TraceContext {
77103
})
78104
}
79105

80-
/// Generate a new TraceContect object without a parent.
81-
///
82-
/// By default root TraceContext objects are sampled.
83-
/// To mark it unsampled, call `context.set_sampled(false)`.
84-
///
85-
/// ## Examples
86-
/// ```
87-
/// use http_types::trace::TraceContext;
88-
///
89-
/// let context = TraceContext::new_root();
90-
///
91-
/// assert_eq!(context.parent_id(), None);
92-
/// assert_eq!(context.sampled(), true);
93-
/// ```
94-
pub fn new_root() -> Self {
95-
let mut rng = rand::thread_rng();
96-
97-
Self {
98-
id: rng.gen(),
99-
version: 0,
100-
trace_id: rng.gen(),
101-
parent_id: None,
102-
flags: 1,
103-
}
104-
}
105-
106106
/// Add the traceparent header to the http headers
107107
///
108108
/// ## Examples
@@ -112,24 +112,35 @@ impl TraceContext {
112112
///
113113
/// let mut req = Request::new(Method::Get, Url::parse("https://example.com").unwrap());
114114
/// req.insert_header(
115-
/// "traceparent",
115+
/// TRACEPARENT,
116116
/// "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01"
117117
/// );
118118
///
119-
/// let parent = TraceContext::extract(&req).unwrap();
119+
/// let parent = TraceContext::from_headers(&req).unwrap();
120120
///
121121
/// let mut res = Response::new(200);
122-
/// parent.inject(&mut res);
122+
/// parent.apply(&mut res);
123123
///
124-
/// let child = TraceContext::extract(&res).unwrap();
124+
/// let child = TraceContext::from_headers(&res).unwrap();
125125
///
126126
/// assert_eq!(child.version(), parent.version());
127127
/// assert_eq!(child.trace_id(), parent.trace_id());
128128
/// assert_eq!(child.parent_id(), Some(parent.id()));
129129
/// ```
130-
pub fn inject(&self, mut headers: impl AsMut<Headers>) {
130+
pub fn apply(&self, mut headers: impl AsMut<Headers>) {
131131
let headers = headers.as_mut();
132-
headers.insert("traceparent", format!("{}", self));
132+
headers.insert(TRACEPARENT, self.value());
133+
}
134+
135+
/// Get the `HeaderName`.
136+
pub fn name(&self) -> HeaderName {
137+
TRACEPARENT
138+
}
139+
140+
/// Get the `HeaderValue`.
141+
pub fn value(&self) -> HeaderValue {
142+
let output = format!("{}", self);
143+
unsafe { HeaderValue::from_bytes_unchecked(output.into()) }
133144
}
134145

135146
/// Generate a child of the current TraceContext and return it.
@@ -182,8 +193,8 @@ impl TraceContext {
182193
/// use http_types::Response;
183194
///
184195
/// let mut res = Response::new(200);
185-
/// res.insert_header("traceparent", "00-00000000000000000000000000000001-0000000000000002-01");
186-
/// let context = TraceContext::extract(&res).unwrap();
196+
/// res.insert_header(TRACEPARENT, "00-00000000000000000000000000000001-0000000000000002-01");
197+
/// let context = TraceContext::from_headers(&res).unwrap();
187198
/// assert_eq!(context.sampled(), true);
188199
/// ```
189200
pub fn sampled(&self) -> bool {
@@ -197,7 +208,7 @@ impl TraceContext {
197208
/// ```
198209
/// use http_types::trace::TraceContext;
199210
///
200-
/// let mut context = TraceContext::new_root();
211+
/// let mut context = TraceContext::new();
201212
/// assert_eq!(context.sampled(), true);
202213
/// context.set_sampled(false);
203214
/// assert_eq!(context.sampled(), false);
@@ -225,8 +236,8 @@ mod test {
225236
#[test]
226237
fn default() -> crate::Result<()> {
227238
let mut headers = crate::Headers::new();
228-
headers.insert("traceparent", "00-01-deadbeef-00");
229-
let context = TraceContext::extract(&mut headers)?;
239+
headers.insert(TRACEPARENT, "00-01-deadbeef-00");
240+
let context = TraceContext::from_headers(&mut headers)?;
230241
assert_eq!(context.version(), 0);
231242
assert_eq!(context.trace_id(), 1);
232243
assert_eq!(context.parent_id().unwrap(), 3735928559);
@@ -238,7 +249,7 @@ mod test {
238249
#[test]
239250
fn no_header() -> crate::Result<()> {
240251
let mut headers = crate::Headers::new();
241-
let context = TraceContext::extract(&mut headers)?;
252+
let context = TraceContext::from_headers(&mut headers)?;
242253
assert_eq!(context.version(), 0);
243254
assert_eq!(context.parent_id(), None);
244255
assert_eq!(context.flags, 1);
@@ -249,17 +260,17 @@ mod test {
249260
#[test]
250261
fn not_sampled() -> crate::Result<()> {
251262
let mut headers = crate::Headers::new();
252-
headers.insert("traceparent", "00-01-02-00");
253-
let context = TraceContext::extract(&mut headers)?;
263+
headers.insert(TRACEPARENT, "00-01-02-00");
264+
let context = TraceContext::from_headers(&mut headers)?;
254265
assert_eq!(context.sampled(), false);
255266
Ok(())
256267
}
257268

258269
#[test]
259270
fn sampled() -> crate::Result<()> {
260271
let mut headers = crate::Headers::new();
261-
headers.insert("traceparent", "00-01-02-01");
262-
let context = TraceContext::extract(&mut headers)?;
272+
headers.insert(TRACEPARENT, "00-01-02-01");
273+
let context = TraceContext::from_headers(&mut headers)?;
263274
assert_eq!(context.sampled(), true);
264275
Ok(())
265276
}

0 commit comments

Comments
 (0)