1
1
use rand:: Rng ;
2
2
use std:: fmt;
3
3
4
- use crate :: Headers ;
4
+ use crate :: headers :: { HeaderName , HeaderValue , Headers , TRACEPARENT } ;
5
5
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.
7
7
///
8
8
/// ## Examples
9
9
///
@@ -13,11 +13,11 @@ use crate::Headers;
13
13
/// let mut res = http_types::Response::new(200);
14
14
///
15
15
/// res.insert_header(
16
- /// "traceparent" ,
16
+ /// TRACEPARENT ,
17
17
/// "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01"
18
18
/// );
19
19
///
20
- /// let context = TraceContext::extract (&res).unwrap();
20
+ /// let context = TraceContext::from_headers (&res).unwrap();
21
21
///
22
22
/// let trace_id = u128::from_str_radix("0af7651916cd43dd8448eb211c80319c", 16);
23
23
/// let parent_id = u64::from_str_radix("00f067aa0ba902b7", 16);
@@ -36,6 +36,32 @@ pub struct TraceContext {
36
36
}
37
37
38
38
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
+
39
65
/// Create and return TraceContext object based on `traceparent` HTTP header.
40
66
///
41
67
/// ## Examples
@@ -44,11 +70,11 @@ impl TraceContext {
44
70
///
45
71
/// let mut res = http_types::Response::new(200);
46
72
/// res.insert_header(
47
- /// "traceparent" ,
73
+ /// TRACEPARENT ,
48
74
/// "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01"
49
75
/// );
50
76
///
51
- /// let context = TraceContext::extract (&res).unwrap();
77
+ /// let context = TraceContext::from_headers (&res).unwrap();
52
78
///
53
79
/// let trace_id = u128::from_str_radix("0af7651916cd43dd8448eb211c80319c", 16);
54
80
/// let parent_id = u64::from_str_radix("00f067aa0ba902b7", 16);
@@ -57,13 +83,13 @@ impl TraceContext {
57
83
/// assert_eq!(context.parent_id(), parent_id.ok());
58
84
/// assert_eq!(context.sampled(), true);
59
85
/// ```
60
- pub fn extract ( headers : impl AsRef < Headers > ) -> crate :: Result < Self > {
86
+ pub fn from_headers ( headers : impl AsRef < Headers > ) -> crate :: Result < Self > {
61
87
let headers = headers. as_ref ( ) ;
62
88
let mut rng = rand:: thread_rng ( ) ;
63
89
64
- let traceparent = match headers. get ( "traceparent" ) {
90
+ let traceparent = match headers. get ( TRACEPARENT ) {
65
91
Some ( header) => header. as_str ( ) ,
66
- None => return Ok ( Self :: new_root ( ) ) ,
92
+ None => return Ok ( Self :: new ( ) ) ,
67
93
} ;
68
94
69
95
let parts: Vec < & str > = traceparent. split ( '-' ) . collect ( ) ;
@@ -77,32 +103,6 @@ impl TraceContext {
77
103
} )
78
104
}
79
105
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
-
106
106
/// Add the traceparent header to the http headers
107
107
///
108
108
/// ## Examples
@@ -112,24 +112,35 @@ impl TraceContext {
112
112
///
113
113
/// let mut req = Request::new(Method::Get, Url::parse("https://example.com").unwrap());
114
114
/// req.insert_header(
115
- /// "traceparent" ,
115
+ /// TRACEPARENT ,
116
116
/// "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01"
117
117
/// );
118
118
///
119
- /// let parent = TraceContext::extract (&req).unwrap();
119
+ /// let parent = TraceContext::from_headers (&req).unwrap();
120
120
///
121
121
/// let mut res = Response::new(200);
122
- /// parent.inject (&mut res);
122
+ /// parent.apply (&mut res);
123
123
///
124
- /// let child = TraceContext::extract (&res).unwrap();
124
+ /// let child = TraceContext::from_headers (&res).unwrap();
125
125
///
126
126
/// assert_eq!(child.version(), parent.version());
127
127
/// assert_eq!(child.trace_id(), parent.trace_id());
128
128
/// assert_eq!(child.parent_id(), Some(parent.id()));
129
129
/// ```
130
- pub fn inject ( & self , mut headers : impl AsMut < Headers > ) {
130
+ pub fn apply ( & self , mut headers : impl AsMut < Headers > ) {
131
131
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 ( ) ) }
133
144
}
134
145
135
146
/// Generate a child of the current TraceContext and return it.
@@ -182,8 +193,8 @@ impl TraceContext {
182
193
/// use http_types::Response;
183
194
///
184
195
/// 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();
187
198
/// assert_eq!(context.sampled(), true);
188
199
/// ```
189
200
pub fn sampled ( & self ) -> bool {
@@ -197,7 +208,7 @@ impl TraceContext {
197
208
/// ```
198
209
/// use http_types::trace::TraceContext;
199
210
///
200
- /// let mut context = TraceContext::new_root ();
211
+ /// let mut context = TraceContext::new ();
201
212
/// assert_eq!(context.sampled(), true);
202
213
/// context.set_sampled(false);
203
214
/// assert_eq!(context.sampled(), false);
@@ -225,8 +236,8 @@ mod test {
225
236
#[ test]
226
237
fn default ( ) -> crate :: Result < ( ) > {
227
238
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) ?;
230
241
assert_eq ! ( context. version( ) , 0 ) ;
231
242
assert_eq ! ( context. trace_id( ) , 1 ) ;
232
243
assert_eq ! ( context. parent_id( ) . unwrap( ) , 3735928559 ) ;
@@ -238,7 +249,7 @@ mod test {
238
249
#[ test]
239
250
fn no_header ( ) -> crate :: Result < ( ) > {
240
251
let mut headers = crate :: Headers :: new ( ) ;
241
- let context = TraceContext :: extract ( & mut headers) ?;
252
+ let context = TraceContext :: from_headers ( & mut headers) ?;
242
253
assert_eq ! ( context. version( ) , 0 ) ;
243
254
assert_eq ! ( context. parent_id( ) , None ) ;
244
255
assert_eq ! ( context. flags, 1 ) ;
@@ -249,17 +260,17 @@ mod test {
249
260
#[ test]
250
261
fn not_sampled ( ) -> crate :: Result < ( ) > {
251
262
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) ?;
254
265
assert_eq ! ( context. sampled( ) , false ) ;
255
266
Ok ( ( ) )
256
267
}
257
268
258
269
#[ test]
259
270
fn sampled ( ) -> crate :: Result < ( ) > {
260
271
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) ?;
263
274
assert_eq ! ( context. sampled( ) , true ) ;
264
275
Ok ( ( ) )
265
276
}
0 commit comments