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)})
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, )
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
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()
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()
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, )
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()
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()
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)})
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, )
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')
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, )
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)})
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
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)})
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)})
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, )
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')
def test_send_traces_no_token(wrapped_post): trace = trace_factory.get_or_create_trace() trace_factory.send_traces() wrapped_post.assert_not_called()
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()
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')