trace_unittest.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # Copyright 2024 The Chromium Authors
  2. # Use of this source code is governed by a BSD-style license that can be
  3. # found in the LICENSE file.
  4. """Test the trace implementation."""
  5. import contextlib
  6. from typing import Sequence
  7. from opentelemetry import trace as trace_api
  8. from opentelemetry.sdk import trace as trace_sdk
  9. from opentelemetry.sdk import resources
  10. from opentelemetry.sdk.trace import export as export_sdk
  11. from . import trace as trace
  12. class SpanExporterStub(export_sdk.SpanExporter):
  13. """Stub for SpanExporter."""
  14. def __init__(self) -> None:
  15. self._spans = []
  16. @property
  17. def spans(self):
  18. return self._spans
  19. def export(
  20. self, spans: Sequence[trace_sdk.ReadableSpan]
  21. ) -> export_sdk.SpanExportResult:
  22. self._spans.extend(spans)
  23. return export_sdk.SpanExportResult.SUCCESS
  24. def test_span_to_capture_keyboard_interrupt_as_decorator() -> None:
  25. """Test span can capture KeyboardInterrupt as decorator."""
  26. exporter = SpanExporterStub()
  27. provider = trace.TracerProvider(trace_sdk.TracerProvider())
  28. provider.add_span_processor(
  29. export_sdk.BatchSpanProcessor(span_exporter=exporter))
  30. tracer = provider.get_tracer(__name__)
  31. @tracer.start_as_current_span("test-span")
  32. def test_function() -> None:
  33. raise KeyboardInterrupt()
  34. with contextlib.suppress(KeyboardInterrupt):
  35. test_function()
  36. provider.shutdown()
  37. assert len(exporter.spans) == 1
  38. assert exporter.spans[0].events[0].name == "exception"
  39. assert (exporter.spans[0].events[0].attributes["exception.type"] ==
  40. "KeyboardInterrupt")
  41. assert exporter.spans[0].status.status_code == trace_api.StatusCode.OK
  42. def test_span_to_capture_keyboard_interrupt_in_context() -> None:
  43. """Test span can capture KeyboardInterrupt in context."""
  44. exporter = SpanExporterStub()
  45. provider = trace.TracerProvider(trace_sdk.TracerProvider())
  46. provider.add_span_processor(
  47. export_sdk.BatchSpanProcessor(span_exporter=exporter))
  48. tracer = provider.get_tracer(__name__)
  49. with contextlib.suppress(KeyboardInterrupt):
  50. with tracer.start_as_current_span("test-span"):
  51. raise KeyboardInterrupt()
  52. provider.shutdown()
  53. assert len(exporter.spans) == 1
  54. assert exporter.spans[0].events[0].name == "exception"
  55. assert (exporter.spans[0].events[0].attributes["exception.type"] ==
  56. "KeyboardInterrupt")
  57. assert exporter.spans[0].status.status_code == trace_api.StatusCode.OK