Exemplo n.º 1
0
def test_send_traces_sanity(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    trace.token = 'a'
    trace_factory.send_traces()
    wrapped_post.assert_called_with(
        '',
        data=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
Exemplo n.º 2
0
def test_send_traces_sanity(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    trace_factory.send_traces()
    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )
Exemplo n.º 3
0
def test_runner_duration(_wrapped_post):
    runner = RunnerEventMock()
    runner.terminated = False
    trace = trace_factory.get_or_create_trace()
    trace.token = 'a'
    trace.set_runner(runner)
    time.sleep(0.2)
    trace_factory.send_traces()

    assert 0.2 < runner.duration < 0.3
Exemplo n.º 4
0
def test_send_with_sample_good_rate_with_error(wrapped_post, _):
    trace = trace_factory.get_or_create_trace()
    trace.runner = RunnerEventMock()
    trace.sample_rate = 0.6
    trace.runner.error_code = ErrorCode.ERROR
    trace.add_event(trace.runner)
    trace.token = 'a'
    trace.add_event(EventMock())
    trace_factory.send_traces()
    wrapped_post.assert_called_once()
Exemplo n.º 5
0
def test_send_on_error_only_off_no_error(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    trace.token = 'a'
    trace.runner = RunnerEventMock()
    trace.runner.error_code = ErrorCode.OK
    event = EventMock()
    event.resource['metadata'] = datetime.fromtimestamp(1000)
    trace.add_event(event)
    trace_factory.send_traces()
    wrapped_post.assert_called_once()
Exemplo n.º 6
0
def test_send_traces_unicode(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    runner = UnicodeReturnValueEventMock()
    trace.set_runner(runner)
    trace_factory.send_traces()
    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict(), ensure_ascii=False),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )
Exemplo n.º 7
0
def test_send_with_split_on_small_trace(wrapped_post, monkeypatch):
    # Should be low enough to force trace split.
    monkeypatch.setenv('EPSAGON_MAX_TRACE_SIZE', '500')
    trace = trace_factory.get_or_create_trace()
    trace.runner = RunnerEventMock()
    trace.add_event(trace.runner)
    trace.token = 'a'
    trace.split_on_send = True
    event = EventMock()
    trace.add_event(event)
    trace_factory.send_traces()
    wrapped_post.assert_called_once()
Exemplo n.º 8
0
def test_send_with_split_off(wrapped_post):
    # Should be low enough to force trace split.
    os.environ['EPSAGON_MAX_TRACE_SIZE'] = '500'
    trace = trace_factory.get_or_create_trace()
    trace.runner = RunnerEventMock()
    trace.add_event(trace.runner)
    trace.token = 'a'
    trace.split_on_send = False
    for _ in range(10):
        event = EventMock()
        trace.add_event(event)
    trace_factory.send_traces()
    wrapped_post.assert_called_once()
Exemplo n.º 9
0
def test_event_with_datetime(wrapped_post):
    trace = trace_factory.get_or_create_trace()

    trace.token = 'a'
    event = EventMock()
    event.resource['metadata'] = datetime.fromtimestamp(1000)
    trace.add_event(event)
    trace_factory.send_traces()
    wrapped_post.assert_called_with(
        '',
        data=json.dumps(trace.to_dict(), cls=TraceEncoder),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
Exemplo n.º 10
0
def test_event_with_datetime(wrapped_post):
    epsagon.utils.init(token='token', app_name='app-name', collector_url='collector')
    trace = trace_factory.get_or_create_trace()

    event = EventMock()
    event.resource['metadata'] = datetime.fromtimestamp(1000)
    trace.add_event(event)
    trace_factory.send_traces()
    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict(), cls=TraceEncoder),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )
Exemplo n.º 11
0
def test_return_value_key_to_ignore(wrapped_post):
    key_to_ignore = 'key_to_ignore_in_return_value'
    os.environ['EPSAGON_IGNORED_KEYS'] = key_to_ignore
    keys_to_ignore = [key_to_ignore]
    # reset traces created at setup function
    trace_factory.traces = {}
    epsagon.utils.init(token='token',
                       app_name='app-name',
                       collector_url='collector',
                       metadata_only=False)

    trace = trace_factory.get_or_create_trace()
    return_value = {
        key_to_ignore: 'f',
        's': {
            'a': 1,
            'b': 2,
            'c': {
                'f': 1,
                key_to_ignore: '1',
                'g': {
                    key_to_ignore: '1'
                }
            }
        }
    }
    copied_return_value = return_value.copy()
    runner = ReturnValueEventMock(return_value)
    trace.set_runner(runner)
    trace.token = 'a'
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    _assert_key_not_exist(actual_return_value, key_to_ignore)
    # check that original return value hasn't been changed
    assert copied_return_value == return_value

    wrapped_post.assert_called_with(
        'collector',
        data=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
    os.environ.pop('EPSAGON_IGNORED_KEYS')
Exemplo n.º 12
0
def test_send_invalid_return_value(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    runner = InvalidReturnValueEventMock()
    trace.set_runner(runner)
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    assert actual_return_value == FAILED_TO_SERIALIZE_MESSAGE

    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )
Exemplo n.º 13
0
def test_send_invalid_return_value(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    runner = InvalidReturnValueEventMock()
    trace.set_runner(runner)
    trace.token = 'a'
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    assert actual_return_value == FAILED_TO_SERIALIZE_MESSAGE

    wrapped_post.assert_called_with(
        '',
        data=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
Exemplo n.º 14
0
def test_timeout_happyflow_handler_call(wrapped_post):
    """
    Test in case we already sent the traces on happy flow,
    that timeout handler call won't send them again.
    """
    context = ContextMock(300)
    runner = RunnerEventMock()
    trace = trace_factory.get_or_create_trace()
    trace.set_runner(runner)

    trace.token = 'a'
    trace_factory.send_traces()

    trace.set_timeout_handler(context)
    time.sleep(0.5)
    trace.reset_timeout_handler()

    assert trace.trace_sent
    assert wrapped_post.call_count == 1
Exemplo n.º 15
0
def test_metadata_field_too_big(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    max_size = MAX_METADATA_FIELD_SIZE_LIMIT
    return_value = {'1': 'a' * (max_size + 1)}
    runner = ReturnValueEventMock(return_value)
    trace.set_runner(runner)
    trace.token = 'a'
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    assert actual_return_value == json.dumps(return_value)[:max_size]

    wrapped_post.assert_called_with(
        '',
        data=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
Exemplo n.º 16
0
def test_send_big_trace(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    runner = RunnerEventMock()

    trace.set_runner(runner)
    trace.token = 'a'

    for _ in range(2):
        trace.add_event(BigEventMock())
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 3
    for event in trace.to_dict()['events']:
        if event['origin'] == 'runner':
            assert event['resource']['metadata']['is_trimmed']

    wrapped_post.assert_called_with(
        '',
        data=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
Exemplo n.º 17
0
def test_send_big_trace(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    runner = RunnerEventMock()

    trace.set_runner(runner)

    for _ in range(2):
        trace.add_event(BigEventMock())
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 3
    for event in trace.to_dict()['events']:
        if event['origin'] == 'runner':
            assert event['resource']['metadata']['is_trimmed']

    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )
Exemplo n.º 18
0
def test_return_value_key_to_ignore(wrapped_post):
    key_to_ignore = 'key_to_ignore_in_return_value'
    os.environ['EPSAGON_IGNORED_KEYS'] = key_to_ignore
    epsagon.utils.init(
        token='token',
        app_name='app-name',
        collector_url='collector',
        metadata_only=False
    )

    trace = trace_factory.get_or_create_trace()
    return_value = {
        key_to_ignore: 'f',
        's': {
            'a': 1,
            'b': 2,
            'c': {
                'f': 1,
                key_to_ignore: '1',
                'g': {
                    key_to_ignore: '1'
                }
            }
        }
    }
    copied_return_value = return_value.copy()
    runner = ReturnValueEventMock(return_value)
    trace.set_runner(runner)
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    _assert_key_not_exist(actual_return_value, key_to_ignore)
    # check that original return value hasn't been changed
    assert copied_return_value == return_value

    os.environ.pop('EPSAGON_IGNORED_KEYS')
Exemplo n.º 19
0
def test_send_traces_no_token(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    trace_factory.send_traces()
    wrapped_post.assert_not_called()
Exemplo n.º 20
0
def test_send_traces_no_token(wrapped_post):
    epsagon.init(token='', app_name='test_app')
    trace = trace_factory.get_or_create_trace()
    trace_factory.send_traces()
    wrapped_post.assert_not_called()
Exemplo n.º 21
0
def test_whitelist_full_flow(wrapped_post):
    key_to_allow = 'key_to_allow_in_return_value'
    os.environ['EPSAGON_ALLOWED_KEYS'] = key_to_allow
    epsagon.utils.init(
        token='token',
        app_name='app-name',
        collector_url='collector',
        metadata_only=False
    )

    trace = trace_factory.get_or_create_trace()
    input_dict, expected_dict = (
        {
            key_to_allow: 'b',
            'a': {
                key_to_allow: 'end-of-branch',
                'd': {
                    'e': {
                        'f': 'end-of-branch'
                    }
                },
                'e': {
                    key_to_allow: {
                        'g': 'end-of-branch'
                    },
                    'g': {
                        'h': 'end-of-branch',
                        'i': {
                            key_to_allow: 'end-of-branch'
                        },
                        'j': {
                            'k': {
                                'l': 'end-of-branch'
                            }
                        }
                    }
                }
            }
        },
        {
            key_to_allow: 'b',
            'a': {
                key_to_allow: 'end-of-branch',
                'e': {
                    key_to_allow: {
                        'g': 'end-of-branch'
                    },
                    'g': {
                        'i': {
                            key_to_allow: 'end-of-branch'
                        },
                    }
                }
            }
        }
    )
    copied_input_dict = input_dict.copy()
    runner = ReturnValueEventMock(input_dict)
    trace.set_runner(runner)
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    assert actual_return_value == expected_dict
    # check that original return value hasn't been changed
    assert copied_input_dict == input_dict

    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )

    os.environ.pop('EPSAGON_ALLOWED_KEYS')