def wrapper(*args, **kwargs): # Get a new current span wrapping this traced function. # ``get_new_span`` should retrieve parent_span if any! span_arg_name, current_span = get_new_span( f, args, kwargs, inspect_stack=inspect_stack, ignore_parent_span=ignore_parent_span, span_extractor=span_extractor, use_follows_from=use_follows_from) if pass_span and span_arg_name: kwargs[span_arg_name] = current_span else: if span_extractor: kwarg_span, _ = get_span_from_kwargs(**kwargs) kwargs.pop(kwarg_span, None) kwargs.pop(span_arg_name, None) current_span = adjust_span(current_span, operation_name, component, tags) with current_span: return f(*args, **kwargs)
def test_get_new_span_with_extractor_with_scope(): opentracing.tracer = BasicTracer() parent_span = opentracing.tracer.start_span() extractor = MagicMock() extractor.return_value = parent_span ctx = '123' def f(ctx, extras=True): pass with opentracing.tracer.start_active_span("ignored_parent", finish_on_close=True): span_arg_name, using_scope_manager, span = get_new_span( f, [ctx], {'extras': True}, span_extractor=extractor, inspect_stack=False) assert DEFAULT_SPAN_ARG_NAME == span_arg_name # span_extractor takes precedence. assert span.parent_id == parent_span.context.span_id assert using_scope_manager is False extractor.assert_called_with(ctx, extras=True)
def test_get_new_span(): def f(): pass span_arg_name, span = get_new_span(f, [], {}) assert DEFAULT_SPAN_ARG_NAME == span_arg_name assert isinstance(span, opentracing.Span)
def test_get_new_span_with_failing_extractor(): def f(): pass def extractor(): raise RuntimeError('Failed') span_arg_name, span = get_new_span(f, [], {}, span_extractor=extractor) assert DEFAULT_SPAN_ARG_NAME == span_arg_name assert span.parent_id is None
def test_get_new_span(): opentracing.tracer = BasicTracer(scope_manager=NotActiveScopeManager()) def f(): pass span_arg_name, using_scope_manager, span = get_new_span(f, [], {}) assert DEFAULT_SPAN_ARG_NAME == span_arg_name assert isinstance(span, opentracing.Span) assert using_scope_manager is False
def test_get_new_span_with_scope_manager_no_active_span(): # BasicTracer comes with an "active" scope_manager. opentracing.tracer = BasicTracer() def f(): pass span_arg_name, using_scope_manager, span = get_new_span(f, [], {}) assert DEFAULT_SPAN_ARG_NAME == span_arg_name assert isinstance(span, opentracing.Span) assert using_scope_manager is False
def test_get_new_span_with_scope_manager(): # BasicTracer comes with an "active" scope_manager. opentracing.tracer = BasicTracer() with opentracing.tracer.start_active_span("parent_span") as scope: def f(): pass span_arg_name, using_scope_manager, span = get_new_span(f, [], {}) assert DEFAULT_SPAN_ARG_NAME == span_arg_name assert isinstance(span, opentracing.Span) assert span.parent_id == scope.span.context.span_id assert using_scope_manager is True
def test_get_new_span_with_legacy_tracer(): # Does not have active_span opentracing.tracer = LegacyTracer() with opentracing.tracer.start_span("parent_span") as parent_span: def f(): pass span_arg_name, using_scope_manager, span = get_new_span(f, [], {}) assert DEFAULT_SPAN_ARG_NAME == span_arg_name assert isinstance(span, opentracing.Span) # detected via inspect_stack (i.e. fallback). assert span.parent_id == parent_span.context.span_id assert using_scope_manager is False
def test_get_new_span_with_extractor(): opentracing.tracer = BasicTracer() parent_span = opentracing.tracer.start_span() extractor = MagicMock() extractor.return_value = parent_span ctx = '123' def f(ctx, extras=True): pass span_arg_name, span = get_new_span(f, [ctx], {'extras': True}, span_extractor=extractor, inspect_stack=False) assert DEFAULT_SPAN_ARG_NAME == span_arg_name assert span.parent_id == parent_span.context.span_id extractor.assert_called_with(ctx, extras=True)
def test_get_new_span_kwargs_with_scope(monkeypatch): opentracing.tracer = BasicTracer() parent_span = opentracing.tracer.start_span() ctx = '123' def f(ctx, extras=True): pass with opentracing.tracer.start_active_span("ignored_parent", finish_on_close=True): span_arg_name, using_scope_manager, span = get_new_span( f, [ctx], { 'extras': True, 'span': parent_span }, inspect_stack=False) assert 'span' == span_arg_name # span in kwargs takes precedence. assert span.parent_id == parent_span.context.span_id assert using_scope_manager is False