def test_run_hooks_and_send_adds_trace_fields(self): ''' ensure trace fields are propagated backwards ''' m_client = Mock() tracer = SynchronousTracer(m_client) m_span = Mock() m_span.event = Event() m_span.event.start_time = datetime.datetime.now() # set an existing trace field m_span.event.add_field('app.a', 1) m_span.rollup_fields = defaultdict(float) with patch('beeline.trace._should_sample') as m_sample_fn: m_sample_fn.return_value = True # add some trace fields tracer.add_trace_field('a', 0) tracer.add_trace_field('b', 2) tracer.add_trace_field('c', 3) tracer.finish_span(m_span) # ensure we only added fields b and c and did not try to overwrite a self.assertDictContainsSubset({ 'app.a': 1, 'app.b': 2, 'app.c': 3 }, m_span.event.fields())
def test_run_hooks_and_send_adds_trace_fields(self): ''' ensure trace fields are propagated backwards ''' m_client = Mock() tracer = SynchronousTracer(m_client) tracer.start_trace() m_span = Mock() m_span.event = Event() m_span.event.start_time = datetime.datetime.now() # set an existing trace field m_span.event.add_field('app.a', 1) m_span.rollup_fields = defaultdict(float) with patch('beeline.trace._should_sample') as m_sample_fn: m_sample_fn.return_value = True # add some trace fields tracer.add_trace_field('a', 0) tracer.add_trace_field('b', 2) tracer.add_trace_field('c', 3) tracer.finish_span(m_span) # Check that the new, unique fields were successfully added self.assertIn("app.b", m_span.event.fields()) self.assertIn("app.c", m_span.event.fields()) # Check that a was not overwritten with the new value of 0. self.assertEqual(m_span.event.fields()["app.a"], 1)
def test_add_trace_field_propagates(self): m_client = Mock() tracer = SynchronousTracer(m_client) span = tracer.start_trace(context={'big': 'important_stuff'}) # make sure this is the only event in the stack self.assertEqual(tracer._state.stack[0], span) self.assertEqual(len(tracer._state.stack), 1) m_client.new_event.reset_mock() tracer.add_trace_field('another', 'important_thing') tracer.add_trace_field('wide', 'events_are_great') span2 = tracer.start_span(context={'more': 'important_stuff'}) # should still have the root span as the first item in the stack self.assertEqual(tracer._state.stack[0], span) self.assertEqual(tracer._state.stack[-1], span2) # should have the first span id as its parent # should share the same trace id self.assertEqual(span.trace_id, span2.trace_id) self.assertEqual(span.id, span2.parent_id) # trace id should match what the tracer has self.assertEqual(span.trace_id, tracer._state.trace_id) m_client.new_event.assert_called_once_with( data={ 'app.another': 'important_thing', 'app.wide': 'events_are_great' }) m_client.new_event.return_value.add.assert_has_calls([ call(data={'more': 'important_stuff'}), call( data={ 'trace.trace_id': span2.trace_id, 'trace.parent_id': span2.parent_id, 'trace.span_id': span2.id, }), ]) m_client.new_event.reset_mock() m_client.new_event.return_value.fields.return_value = {} # swap out some trace fields tracer.add_trace_field('more', 'data!') tracer.remove_trace_field('another') span3 = tracer.start_span(context={'more': 'important_stuff'}) self.assertEqual(tracer._state.stack[0], span) self.assertEqual(tracer._state.stack[1], span2) self.assertEqual(tracer._state.stack[-1], span3) # should have the second span id as its parent # should share the same trace id self.assertEqual(span.trace_id, span3.trace_id) self.assertEqual(span2.id, span3.parent_id) m_client.new_event.assert_called_once_with(data={ 'app.wide': 'events_are_great', 'app.more': 'data!', })