Exemplo n.º 1
0
def test_trace_sqlalchemy_nested_use_scope_manager(monkeypatch, session,
                                                   recorder):
    trace_sqlalchemy(use_scope_manager=True)

    @trace()
    def create_user():
        user = User(name='Tracer')
        assert opentracing.tracer.active_span.operation_name == 'create_user'
        session.add(user)
        session.commit()

    top_span = None
    with opentracing.tracer.start_active_span(
            operation_name='top_span') as scope:
        top_span = scope.span
        create_user()

        assert top_span == opentracing.tracer.active_span

    assert len(recorder.spans) == 3

    sql_span = recorder.spans[0]
    assert sql_span.context.trace_id == top_span.context.trace_id
    assert sql_span.parent_id == recorder.spans[1].context.span_id

    assert sql_span.tags[
        'db.statement'] == 'INSERT INTO users (name, is_active) VALUES (?, ?)'
    assert_sqlalchemy_span(sql_span, operation_name='insert')
Exemplo n.º 2
0
def test_trace_sqlalchemy_operation_name(monkeypatch, session, recorder):
    def get_operation_name(conn, cursor, statement, parameters, context,
                           executemany):
        return 'custom_query'

    trace_sqlalchemy(operation_name=get_operation_name)

    user = User(name='Tracer', is_active=True)
    session.add(user)
    session.commit()

    assert recorder.spans[0].operation_name == 'custom_query'
Exemplo n.º 3
0
def test_trace_sqlalchemy_skip_span(monkeypatch, session, recorder):
    def skip_span(conn, cursor, statement, parameters, context, executemany):
        return statement.lower().startswith('insert')

    trace_sqlalchemy(skip_span=skip_span)

    user = User(name='Tracer', is_active=True)
    session.add(user)
    session.commit()

    session.query(User).first()

    assert len(recorder.spans) == 1
    assert recorder.spans[0].operation_name != 'insert'
Exemplo n.º 4
0
def test_trace_sqlalchemy_enrich_span(monkeypatch, session, recorder):
    parameters_tag = 'parameters'
    user_name = 'Tracer'

    def enrich_span(span, conn, cursor, statement, parameters, context,
                    executemany):
        span.set_tag(parameters_tag, parameters)

    trace_sqlalchemy(enrich_span=enrich_span)

    user = User(name=user_name, is_active=True)
    session.add(user)
    session.commit()

    assert len(recorder.spans) == 1
    assert parameters_tag in recorder.spans[0].tags
    assert recorder.spans[0].tags[parameters_tag] == (user_name, 1)
Exemplo n.º 5
0
def test_trace_sqlalchemy_span_extractor(monkeypatch, session, recorder):
    ignored_span = opentracing.tracer.start_span(operation_name='ignored_span')
    custom_span = opentracing.tracer.start_span(operation_name='custom_span')

    def get_custom_parent_span(conn, cursor, statement, parameters, context,
                               executemany):
        return custom_span

    trace_sqlalchemy(span_extractor=get_custom_parent_span)

    user = User(name='Tracer', is_active=True)
    session.add(user)
    session.commit()

    assert recorder.spans[0].parent_id == custom_span.context.span_id

    custom_span.finish()
    ignored_span.finish()
Exemplo n.º 6
0
def test_trace_sqlalchemy(monkeypatch, session, recorder):
    trace_sqlalchemy()

    top_span = opentracing.tracer.start_span(operation_name='top_span')

    with top_span:
        user = User(name='Tracer', is_active=True)
        session.add(user)
        session.commit()

    assert len(recorder.spans) == 2

    sql_span = recorder.spans[0]
    assert sql_span.context.trace_id == top_span.context.trace_id
    assert sql_span.parent_id == top_span.context.span_id

    assert sql_span.tags[
        'db.statement'] == 'INSERT INTO users (name, is_active) VALUES (?, ?)'
    assert_sqlalchemy_span(sql_span, operation_name='insert')
Exemplo n.º 7
0
def test_trace_sqlalchemy_select_where(monkeypatch, session, recorder):
    trace_sqlalchemy()

    user = User(name='Tracer', is_active=True)
    session.add(user)
    session.commit()

    top_span = opentracing.tracer.start_span(operation_name='top_span')

    with top_span:
        users = [u for u in session.query(User).filter(User.name == 'Tracer')]
        assert len(users) == 1

    sql_span = recorder.spans[1]
    assert sql_span.context.trace_id == top_span.context.trace_id
    assert sql_span.parent_id == top_span.context.span_id

    assert sql_span.tags['db.statement'] == (
        'SELECT users.id AS users_id, users.name AS users_name, users.is_active '
        'AS users_is_active \nFROM users \nWHERE users.name = ?')
    assert_sqlalchemy_span(sql_span)
Exemplo n.º 8
0
def test_trace_sqlalchemy_delete(monkeypatch, session, recorder):
    trace_sqlalchemy()

    user = User(name='Tracer', is_active=True)
    session.add(user)
    session.commit()

    top_span = opentracing.tracer.start_span(operation_name='top_span')

    with top_span:
        user = session.query(User).first()
        session.delete(user)
        session.commit()

    sql_span = recorder.spans[2]
    assert sql_span.context.trace_id == top_span.context.trace_id
    assert sql_span.parent_id == top_span.context.span_id

    assert sql_span.tags[
        'db.statement'] == 'DELETE FROM users WHERE users.id = ?'
    assert_sqlalchemy_span(sql_span, operation_name='delete')
Exemplo n.º 9
0
def test_trace_sqlalchemy_error(monkeypatch, session, recorder, error):
    trace_sqlalchemy(set_error_tag=error)

    top_span = opentracing.tracer.start_span(operation_name='top_span')

    with top_span:
        user = User(name='Tracer', is_active=True)
        session.add(user)
        session.commit()

        with pytest.raises(IntegrityError):
            user = User(name='Tracer', is_active=True)
            session.add(user)
            session.commit()

    # This is ugly but somehow overcomes the inconsistency of spans order!
    span_error = False
    for span in recorder.spans:
        if 'error' in span.tags:
            span_error = True
            break
    assert span_error is error