def test_set_error_sanity(): event = RunnerEventMock() trace = trace_factory.get_or_create_trace() trace.clear_events() trace.set_runner(event) msg = 'oops' trace.set_error(ValueError(msg)) assert trace.to_dict()['events'][0]['exception']['message'] == msg assert len(trace.to_dict()['events'][0]['exception']['traceback']) > 1
def test_set_error_string(): event = RunnerEventMock() trace = trace_factory.get_or_create_trace() trace.clear_events() trace.set_runner(event) msg = 'oops' trace.set_error(msg) assert trace.to_dict()['events'][0]['exception']['message'] == msg assert trace.to_dict()['events'][0]['exception']['type'] == ( EpsagonException.__name__)
def test_set_error_with_traceback(): event = RunnerEventMock() trace = trace_factory.get_or_create_trace() trace.clear_events() trace.set_runner(event) msg = 'oops' traceback_data = 'test_value' trace.set_error(ValueError(msg), traceback_data=traceback_data) assert trace.to_dict()['events'][0]['exception']['message'] == msg assert (trace.to_dict()['events'][0]['exception']['traceback'] == traceback_data)
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_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_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_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_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_to_dict(): trace = epsagon.trace.Trace() expected_dict = { 'token': 'token', 'app_name': 'app_name', 'events': [EventMockWithCounter(i) for i in range(10)], 'exceptions': 'exceptions', 'version': 'version', 'platform': 'platform' } trace.token = expected_dict['token'] trace.app_name = expected_dict['app_name'] for event in [EventMockWithCounter(i) for i in range(10)]: trace.add_event(event) trace.exceptions = expected_dict['exceptions'] trace.version = expected_dict['version'] trace.platform = expected_dict['platform'] trace_dict = trace.to_dict() assert trace_dict == trace.to_dict()
def test_custom_labels_override_trace(): event = RunnerEventMock() trace = trace_factory.get_or_create_trace() trace.clear_events() trace.set_runner(event) trace.add_label('test_label', 'test_value1') trace.add_label('test_label', 'test_value2') trace_metadata = trace.to_dict()['events'][0]['resource']['metadata'] assert trace_metadata.get('labels') is not None assert json.loads(trace_metadata['labels']) == {'test_label': 'test_value2'}
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) 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_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_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_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_to_dict_empty(): trace = epsagon.trace.Trace() assert trace.to_dict() == { 'token': '', 'app_name': '', 'events': [], 'exceptions': [], 'version': epsagon.constants.__version__, 'platform': 'Python {}.{}'.format(sys.version_info.major, sys.version_info.minor) }
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_multi_value_labels_sanity(): event = RunnerEventMock() trace = trace_factory.get_or_create_trace() trace.clear_events() trace.set_runner(event) trace.add_label('test_label', { 'test2_label': 15, 'test3_label': 'test', 4: 'hey' }) trace_metadata = trace.to_dict()['events'][0]['resource']['metadata'] assert trace_metadata.get('labels') is not None assert json.loads(trace_metadata['labels']) == { 'test_label.test2_label': '15', 'test_label.test3_label': 'test', 'test_label.4': 'hey', }
def test_custom_labels_sanity(): event = RunnerEventMock() trace = trace_factory.get_or_create_trace() trace.clear_events() trace.set_runner(event) trace.add_label('test_label', 'test_value') trace.add_label('test_label_2', 42) trace.add_label('test_label_3', 42.2) trace.add_label('test_label_invalid', {}) trace_metadata = trace.to_dict()['events'][0]['resource']['metadata'] assert trace_metadata.get('labels') is not None assert json.loads(trace_metadata['labels']) == { 'test_label': 'test_value', 'test_label_2': '42', 'test_label_3': '42.2', }
def test_custom_labels_sanity(): event = RunnerEventMock() trace = trace_factory.get_or_create_trace() trace.clear_events() trace.set_runner(event) trace.add_label('test_label', 'test_value') trace.add_label('test_label_2', 42) trace.add_label('test_label_3', 42.2) trace.add_label('test_label_4', True) # This is not an invalid label, but it won't be added because dict is empty. trace.add_label('test_label_invalid', {}) trace_metadata = trace.to_dict()['events'][0]['resource']['metadata'] assert trace_metadata.get('labels') is not None assert json.loads(trace_metadata['labels']) == { 'test_label': 'test_value', 'test_label_2': 42, 'test_label_3': 42.2, 'test_label_4': True, }
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')