1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- # Copyright 2024 The Chromium Authors
- # Use of this source code is governed by a BSD-style license that can be
- # found in the LICENSE file.
- """Test the trace implementation."""
- import contextlib
- from typing import Sequence
- from opentelemetry import trace as trace_api
- from opentelemetry.sdk import trace as trace_sdk
- from opentelemetry.sdk import resources
- from opentelemetry.sdk.trace import export as export_sdk
- from . import trace as trace
- class SpanExporterStub(export_sdk.SpanExporter):
- """Stub for SpanExporter."""
- def __init__(self) -> None:
- self._spans = []
- @property
- def spans(self):
- return self._spans
- def export(
- self, spans: Sequence[trace_sdk.ReadableSpan]
- ) -> export_sdk.SpanExportResult:
- self._spans.extend(spans)
- return export_sdk.SpanExportResult.SUCCESS
- def test_span_to_capture_keyboard_interrupt_as_decorator() -> None:
- """Test span can capture KeyboardInterrupt as decorator."""
- exporter = SpanExporterStub()
- provider = trace.TracerProvider(trace_sdk.TracerProvider())
- provider.add_span_processor(
- export_sdk.BatchSpanProcessor(span_exporter=exporter))
- tracer = provider.get_tracer(__name__)
- @tracer.start_as_current_span("test-span")
- def test_function() -> None:
- raise KeyboardInterrupt()
- with contextlib.suppress(KeyboardInterrupt):
- test_function()
- provider.shutdown()
- assert len(exporter.spans) == 1
- assert exporter.spans[0].events[0].name == "exception"
- assert (exporter.spans[0].events[0].attributes["exception.type"] ==
- "KeyboardInterrupt")
- assert exporter.spans[0].status.status_code == trace_api.StatusCode.OK
- def test_span_to_capture_keyboard_interrupt_in_context() -> None:
- """Test span can capture KeyboardInterrupt in context."""
- exporter = SpanExporterStub()
- provider = trace.TracerProvider(trace_sdk.TracerProvider())
- provider.add_span_processor(
- export_sdk.BatchSpanProcessor(span_exporter=exporter))
- tracer = provider.get_tracer(__name__)
- with contextlib.suppress(KeyboardInterrupt):
- with tracer.start_as_current_span("test-span"):
- raise KeyboardInterrupt()
- provider.shutdown()
- assert len(exporter.spans) == 1
- assert exporter.spans[0].events[0].name == "exception"
- assert (exporter.spans[0].events[0].attributes["exception.type"] ==
- "KeyboardInterrupt")
- assert exporter.spans[0].status.status_code == trace_api.StatusCode.OK
|