|
36 | 36 | from opentelemetry.instrumentation.botocore import BotocoreInstrumentor
|
37 | 37 | from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY
|
38 | 38 | from opentelemetry.propagate import get_global_textmap, set_global_textmap
|
| 39 | +from opentelemetry.propagators.aws.aws_xray_propagator import TRACE_HEADER_KEY |
39 | 40 | from opentelemetry.semconv.trace import SpanAttributes
|
40 | 41 | from opentelemetry.test.mock_textmap import MockTextMapPropagator
|
41 | 42 | from opentelemetry.test.test_base import TestBase
|
| 43 | +from opentelemetry.trace.span import format_span_id, format_trace_id |
42 | 44 |
|
43 | 45 | _REQUEST_ID_REGEX_MATCH = r"[A-Z0-9]{52}"
|
44 | 46 |
|
@@ -225,27 +227,21 @@ def test_unpatch(self):
|
225 | 227 | @mock_ec2
|
226 | 228 | def test_uninstrument_does_not_inject_headers(self):
|
227 | 229 | headers = {}
|
228 |
| - previous_propagator = get_global_textmap() |
229 |
| - try: |
230 |
| - set_global_textmap(MockTextMapPropagator()) |
231 | 230 |
|
232 |
| - def intercept_headers(**kwargs): |
233 |
| - headers.update(kwargs["request"].headers) |
| 231 | + def intercept_headers(**kwargs): |
| 232 | + headers.update(kwargs["request"].headers) |
234 | 233 |
|
235 |
| - ec2 = self._make_client("ec2") |
| 234 | + ec2 = self._make_client("ec2") |
236 | 235 |
|
237 |
| - BotocoreInstrumentor().uninstrument() |
| 236 | + BotocoreInstrumentor().uninstrument() |
238 | 237 |
|
239 |
| - ec2.meta.events.register_first( |
240 |
| - "before-send.ec2.DescribeInstances", intercept_headers |
241 |
| - ) |
242 |
| - with self.tracer_provider.get_tracer("test").start_span("parent"): |
243 |
| - ec2.describe_instances() |
| 238 | + ec2.meta.events.register_first( |
| 239 | + "before-send.ec2.DescribeInstances", intercept_headers |
| 240 | + ) |
| 241 | + with self.tracer_provider.get_tracer("test").start_span("parent"): |
| 242 | + ec2.describe_instances() |
244 | 243 |
|
245 |
| - self.assertNotIn(MockTextMapPropagator.TRACE_ID_KEY, headers) |
246 |
| - self.assertNotIn(MockTextMapPropagator.SPAN_ID_KEY, headers) |
247 |
| - finally: |
248 |
| - set_global_textmap(previous_propagator) |
| 244 | + self.assertNotIn(TRACE_HEADER_KEY, headers) |
249 | 245 |
|
250 | 246 | @mock_sqs
|
251 | 247 | def test_double_patch(self):
|
@@ -306,20 +302,42 @@ def check_headers(**kwargs):
|
306 | 302 | "EC2", "DescribeInstances", request_id=request_id
|
307 | 303 | )
|
308 | 304 |
|
309 |
| - self.assertIn(MockTextMapPropagator.TRACE_ID_KEY, headers) |
310 |
| - self.assertEqual( |
311 |
| - str(span.get_span_context().trace_id), |
312 |
| - headers[MockTextMapPropagator.TRACE_ID_KEY], |
| 305 | + # only x-ray propagation is used in HTTP requests |
| 306 | + self.assertIn(TRACE_HEADER_KEY, headers) |
| 307 | + xray_context = headers[TRACE_HEADER_KEY] |
| 308 | + formated_trace_id = format_trace_id( |
| 309 | + span.get_span_context().trace_id |
313 | 310 | )
|
314 |
| - self.assertIn(MockTextMapPropagator.SPAN_ID_KEY, headers) |
315 |
| - self.assertEqual( |
316 |
| - str(span.get_span_context().span_id), |
317 |
| - headers[MockTextMapPropagator.SPAN_ID_KEY], |
| 311 | + formated_trace_id = ( |
| 312 | + formated_trace_id[:8] + "-" + formated_trace_id[8:] |
318 | 313 | )
|
319 | 314 |
|
| 315 | + self.assertEqual( |
| 316 | + xray_context.lower(), |
| 317 | + f"root=1-{formated_trace_id};parent={format_span_id(span.get_span_context().span_id)};sampled=1".lower(), |
| 318 | + ) |
320 | 319 | finally:
|
321 | 320 | set_global_textmap(previous_propagator)
|
322 | 321 |
|
| 322 | + @mock_ec2 |
| 323 | + def test_override_xray_propagator_injects_into_request(self): |
| 324 | + headers = {} |
| 325 | + |
| 326 | + def check_headers(**kwargs): |
| 327 | + nonlocal headers |
| 328 | + headers = kwargs["request"].headers |
| 329 | + |
| 330 | + BotocoreInstrumentor().instrument() |
| 331 | + |
| 332 | + ec2 = self._make_client("ec2") |
| 333 | + ec2.meta.events.register_first( |
| 334 | + "before-send.ec2.DescribeInstances", check_headers |
| 335 | + ) |
| 336 | + ec2.describe_instances() |
| 337 | + |
| 338 | + self.assertNotIn(MockTextMapPropagator.TRACE_ID_KEY, headers) |
| 339 | + self.assertNotIn(MockTextMapPropagator.SPAN_ID_KEY, headers) |
| 340 | + |
323 | 341 | @mock_xray
|
324 | 342 | def test_suppress_instrumentation_xray_client(self):
|
325 | 343 | xray_client = self._make_client("xray")
|
|
0 commit comments