mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-07-31 22:23:12 +08:00
61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
import threading
|
|
|
|
from ddtrace.context import Context
|
|
from ddtrace.internal.context_manager import DefaultContextManager
|
|
from ddtrace.span import Span
|
|
|
|
from ..base import BaseTestCase
|
|
|
|
|
|
class TestDefaultContextManager(BaseTestCase):
|
|
"""
|
|
Ensures that a ``ContextManager`` makes the Context
|
|
local to each thread or task.
|
|
"""
|
|
def test_get_or_create(self):
|
|
# asking the Context multiple times should return
|
|
# always the same instance
|
|
ctxm = DefaultContextManager()
|
|
assert ctxm.get() == ctxm.get()
|
|
|
|
def test_set_context(self):
|
|
# the Context can be set in the current Thread
|
|
ctx = Context()
|
|
ctxm = DefaultContextManager()
|
|
assert ctxm.get() is not ctx
|
|
|
|
ctxm.set(ctx)
|
|
assert ctxm.get() is ctx
|
|
|
|
def test_multiple_threads_multiple_context(self):
|
|
# each thread should have it's own Context
|
|
ctxm = DefaultContextManager()
|
|
|
|
def _fill_ctx():
|
|
ctx = ctxm.get()
|
|
span = Span(tracer=None, name='fake_span')
|
|
ctx.add_span(span)
|
|
assert 1 == len(ctx._trace)
|
|
|
|
threads = [threading.Thread(target=_fill_ctx) for _ in range(100)]
|
|
|
|
for t in threads:
|
|
t.daemon = True
|
|
t.start()
|
|
|
|
for t in threads:
|
|
t.join()
|
|
|
|
# the main instance should have an empty Context
|
|
# because it has not been used in this thread
|
|
ctx = ctxm.get()
|
|
assert 0 == len(ctx._trace)
|
|
|
|
def test_reset_context_manager(self):
|
|
ctxm = DefaultContextManager()
|
|
ctx = ctxm.get()
|
|
|
|
# new context manager should not share same context
|
|
ctxm = DefaultContextManager()
|
|
assert ctxm.get() is not ctx
|