Skip to content
This repository was archived by the owner on Sep 17, 2025. It is now read-only.

Commit 2caf7f3

Browse files
reyangliyanhui1228
authored andcommitted
refactor - move header name to propagator (part 1) (#216)
1 parent 9369932 commit 2caf7f3

4 files changed

Lines changed: 169 additions & 0 deletions

File tree

opencensus/trace/propagation/google_cloud_format.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from opencensus.trace.span_context import SpanContext
1919
from opencensus.trace.trace_options import TraceOptions
2020

21+
_TRACE_CONTEXT_HEADER_NAME = 'X_CLOUD_TRACE_CONTEXT'
2122
_TRACE_CONTEXT_HEADER_FORMAT = '([0-9a-f]{32})(\/([0-9a-f]{16}))?(;o=(\d+))?'
2223
_TRACE_CONTEXT_HEADER_RE = re.compile(_TRACE_CONTEXT_HEADER_FORMAT)
2324
_TRACE_ID_DELIMETER = '/'
@@ -73,6 +74,21 @@ def from_header(self, header):
7374
.format(header))
7475
return SpanContext()
7576

77+
def from_headers(self, headers):
78+
"""Generate a SpanContext object using the trace context header.
79+
80+
:type headers: dict
81+
:param headers: HTTP request headers.
82+
83+
:rtype: :class:`~opencensus.trace.span_context.SpanContext`
84+
:returns: SpanContext generated from the trace context header.
85+
"""
86+
if headers is None:
87+
return SpanContext()
88+
if _TRACE_CONTEXT_HEADER_NAME not in headers:
89+
return SpanContext()
90+
return self.from_header(headers[_TRACE_CONTEXT_HEADER_NAME])
91+
7692
def to_header(self, span_context):
7793
"""Convert a SpanContext object to header string.
7894
@@ -92,3 +108,17 @@ def to_header(self, span_context):
92108
span_id,
93109
int(trace_options))
94110
return header
111+
112+
def to_headers(self, span_context):
113+
"""Convert a SpanContext object to HTTP request headers.
114+
115+
:type span_context:
116+
:class:`~opencensus.trace.span_context.SpanContext`
117+
:param span_context: SpanContext object.
118+
119+
:rtype: dict
120+
:returns: Trace context headers in google cloud format.
121+
"""
122+
return {
123+
_TRACE_CONTEXT_HEADER_NAME: self.to_header(span_context),
124+
}

opencensus/trace/propagation/trace_context_http_header_format.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from opencensus.trace.span_context import SpanContext
1919
from opencensus.trace.trace_options import TraceOptions
2020

21+
_TRACE_PARENT_HEADER_NAME = 'traceparent'
2122
_TRACE_CONTEXT_HEADER_FORMAT = \
2223
'([0-9a-f]{2})(-([0-9a-f]{32}))(-([0-9a-f]{16}))?(-([0-9a-f]{2}))?'
2324
_TRACE_CONTEXT_HEADER_RE = re.compile(_TRACE_CONTEXT_HEADER_FORMAT)
@@ -76,6 +77,21 @@ def from_header(self, header):
7677

7778
return SpanContext()
7879

80+
def from_headers(self, headers):
81+
"""Generate a SpanContext object using the W3C Distributed Tracing headers.
82+
83+
:type headers: dict
84+
:param headers: HTTP request headers.
85+
86+
:rtype: :class:`~opencensus.trace.span_context.SpanContext`
87+
:returns: SpanContext generated from the trace context header.
88+
"""
89+
if headers is None:
90+
return SpanContext()
91+
if _TRACE_PARENT_HEADER_NAME not in headers:
92+
return SpanContext()
93+
return self.from_header(headers[_TRACE_PARENT_HEADER_NAME])
94+
7995
def to_header(self, span_context):
8096
"""Convert a SpanContext object to header string, using version 0.
8197
@@ -98,3 +114,18 @@ def to_header(self, span_context):
98114
span_id,
99115
trace_options)
100116
return header
117+
118+
def to_headers(self, span_context):
119+
"""Convert a SpanContext object to W3C Distributed Tracing headers,
120+
using version 0.
121+
122+
:type span_context:
123+
:class:`~opencensus.trace.span_context.SpanContext`
124+
:param span_context: SpanContext object.
125+
126+
:rtype: dict
127+
:returns: W3C Distributed Tracing headers.
128+
"""
129+
return {
130+
_TRACE_PARENT_HEADER_NAME: self.to_header(span_context),
131+
}

tests/unit/trace/propagation/test_google_cloud_format.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,22 @@ def test_from_header_no_header(self):
2727

2828
assert isinstance(span_context, SpanContext)
2929

30+
def test_from_headers_none(self):
31+
from opencensus.trace.span_context import SpanContext
32+
33+
propagator = google_cloud_format.GoogleCloudFormatPropagator()
34+
span_context = propagator.from_headers(None)
35+
36+
assert isinstance(span_context, SpanContext)
37+
38+
def test_from_headers_empty(self):
39+
from opencensus.trace.span_context import SpanContext
40+
41+
propagator = google_cloud_format.GoogleCloudFormatPropagator()
42+
span_context = propagator.from_headers({})
43+
44+
assert isinstance(span_context, SpanContext)
45+
3046
def test_header_type_error(self):
3147
header = 1234
3248

@@ -81,6 +97,22 @@ def test_header_not_match(self):
8197

8298
self.assertNotEqual(span_context.trace_id, trace_id)
8399

100+
def test_headers_match(self):
101+
# Trace option is enabled.
102+
headers = {
103+
'X_CLOUD_TRACE_CONTEXT':
104+
'6e0c63257de34c92bf9efcd03927272e/00f067aa0ba902b7;o=1',
105+
}
106+
expected_trace_id = '6e0c63257de34c92bf9efcd03927272e'
107+
expected_span_id = '00f067aa0ba902b7'
108+
109+
propagator = google_cloud_format.GoogleCloudFormatPropagator()
110+
span_context = propagator.from_headers(headers)
111+
112+
self.assertEqual(span_context.trace_id, expected_trace_id)
113+
self.assertEqual(span_context.span_id, expected_span_id)
114+
self.assertTrue(span_context.trace_options.enabled)
115+
84116
def test_to_header(self):
85117
from opencensus.trace import span_context
86118
from opencensus.trace import trace_options
@@ -99,3 +131,23 @@ def test_to_header(self):
99131
trace_id, span_id, 1)
100132

101133
self.assertEqual(header, expected_header)
134+
135+
def test_to_headers(self):
136+
from opencensus.trace import span_context
137+
from opencensus.trace import trace_options
138+
139+
trace_id = '6e0c63257de34c92bf9efcd03927272e'
140+
span_id = '00f067aa0ba902b7'
141+
span_context = span_context.SpanContext(
142+
trace_id=trace_id,
143+
span_id=span_id,
144+
trace_options=trace_options.TraceOptions('1'))
145+
146+
propagator = google_cloud_format.GoogleCloudFormatPropagator()
147+
148+
headers = propagator.to_headers(span_context)
149+
expected_headers = {
150+
'X_CLOUD_TRACE_CONTEXT': '{}/{};o={}'.format(trace_id, span_id, 1),
151+
}
152+
153+
self.assertEqual(headers, expected_headers)

tests/unit/trace/propagation/test_trace_context_http_header_format.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,24 @@ def test_from_header_no_header(self):
2828

2929
assert isinstance(span_context, SpanContext)
3030

31+
def test_from_headers_none(self):
32+
from opencensus.trace.span_context import SpanContext
33+
34+
propagator = trace_context_http_header_format.\
35+
TraceContextPropagator()
36+
span_context = propagator.from_headers(None)
37+
38+
assert isinstance(span_context, SpanContext)
39+
40+
def test_from_headers_empty(self):
41+
from opencensus.trace.span_context import SpanContext
42+
43+
propagator = trace_context_http_header_format.\
44+
TraceContextPropagator()
45+
span_context = propagator.from_headers({})
46+
47+
assert isinstance(span_context, SpanContext)
48+
3149
def test_header_type_error(self):
3250
header = 1234
3351

@@ -97,6 +115,23 @@ def test_header_not_match(self):
97115

98116
self.assertNotEqual(span_context.trace_id, trace_id)
99117

118+
def test_headers_match(self):
119+
# Trace option is enabled.
120+
headers = {
121+
'traceparent':
122+
'00-6e0c63257de34c92bf9efcd03927272e-00f067aa0ba902b7-01',
123+
}
124+
expected_trace_id = '6e0c63257de34c92bf9efcd03927272e'
125+
expected_span_id = '00f067aa0ba902b7'
126+
127+
propagator = trace_context_http_header_format.\
128+
TraceContextPropagator()
129+
span_context = propagator.from_headers(headers)
130+
131+
self.assertEqual(span_context.trace_id, expected_trace_id)
132+
self.assertEqual(span_context.span_id, expected_span_id)
133+
self.assertTrue(span_context.trace_options.enabled)
134+
100135
def test_to_header(self):
101136
from opencensus.trace import span_context
102137
from opencensus.trace import trace_options
@@ -117,3 +152,24 @@ def test_to_header(self):
117152
span_id_hex)
118153

119154
self.assertEqual(header, expected_header)
155+
156+
def test_to_headers(self):
157+
from opencensus.trace import span_context
158+
from opencensus.trace import trace_options
159+
160+
trace_id = '6e0c63257de34c92bf9efcd03927272e'
161+
span_id_hex = '00f067aa0ba902b7'
162+
span_context = span_context.SpanContext(
163+
trace_id=trace_id,
164+
span_id=span_id_hex,
165+
trace_options=trace_options.TraceOptions('1'))
166+
167+
propagator = trace_context_http_header_format.\
168+
TraceContextPropagator()
169+
170+
headers = propagator.to_headers(span_context)
171+
expected_headers = {
172+
'traceparent': '00-{}-{}-01'.format(trace_id, span_id_hex),
173+
}
174+
175+
self.assertEqual(headers, expected_headers)

0 commit comments

Comments
 (0)