def test_emit(self): exporter = logging_exporter.LoggingExporter() logger = mock.Mock() exporter.logger = logger span_datas = [ span_data_module.SpanData( name='span', context=span_context.SpanContext(trace_id='1'), span_id='1111', parent_span_id=None, attributes=None, start_time=None, end_time=None, child_span_count=None, stack_trace=None, time_events=None, links=None, status=None, same_process_as_parent_span=None, span_kind=0, ) ] exporter.emit(span_datas) logger.info.assert_called_once_with( span_data_module.format_legacy_trace_json(span_datas))
def emit(self, span_datas): """Send SpanData tuples to Zipkin server, default using the v2 API. :type span_datas: list of :class: `~opencensus.trace.span_data.SpanData` :param list of opencensus.trace.span_data.SpanData span_datas: SpanData tuples to emit """ # convert to the legacy trace json for easier refactoring # TODO: refactor this to use the span data directly trace = span_data.format_legacy_trace_json(span_datas) trace_id = trace.get('traceId') spans = trace.get('spans') try: zipkin_spans = self.translate_to_zipkin(trace_id, spans) result = requests.post(url=self.url, data=json.dumps(zipkin_spans), headers=ZIPKIN_HEADERS) if result.status_code not in SUCCESS_STATUS_CODE: logging.error( "Failed to send spans to Zipkin server! Spans are {}". format(zipkin_spans)) except Exception as e: # pragma: NO COVER logging.error(getattr(e, 'message', e))
def test_format_legacy_trace_json(self): trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05' span_data = span_data_module.SpanData( name='root', context=span_context.SpanContext(trace_id=trace_id, span_id='6e0c63257de34c92'), span_id='6e0c63257de34c92', parent_span_id='6e0c63257de34c93', attributes={'key1': 'value1'}, start_time=utils.to_iso_str(), end_time=utils.to_iso_str(), stack_trace=stack_trace.StackTrace(stack_trace_hash_id='111'), links=[link.Link('1111', span_id='6e0c63257de34c92')], status=status.Status(code=0, message='pok'), annotations=[ time_event.Annotation(timestamp=datetime.datetime(1970, 1, 1), description='description') ], message_events=[ time_event.MessageEvent( timestamp=datetime.datetime(1970, 1, 1), id=0, ) ], same_process_as_parent_span=False, child_span_count=0, span_kind=0, ) trace_json = span_data_module.format_legacy_trace_json([span_data]) self.assertEqual(trace_json.get('traceId'), trace_id) self.assertEqual(len(trace_json.get('spans')), 1)
def emit(self, span_datas): """ :type span_datas: list of :class: `~opencensus.trace.span_data.SpanData` :param list of opencensus.trace.span_data.SpanData span_datas: SpanData tuples to emit """ # convert to the legacy trace json for easier refactoring # TODO: refactor this to use the span data directly legacy_trace_json = span_data.format_legacy_trace_json(span_datas) self.logger.info(legacy_trace_json)
def emit(self, span_datas): """ :type span_datas: list of :class: `~opencensus.trace.span_data.SpanData` :param list of opencensus.trace.span_data.SpanData span_datas: SpanData tuples to emit """ with open(self.file_name, self.file_mode) as file: # convert to the legacy trace json for easier refactoring # TODO: refactor this to use the span data directly legacy_trace_json = span_data.format_legacy_trace_json(span_datas) trace_str = json.dumps(legacy_trace_json) file.write(trace_str)
def emit(self, span_datas): """ :type span_datas: list of :class: `~opencensus.trace.span_data.SpanData` :param list of opencensus.trace.span_data.SpanData span_datas: SpanData tuples to emit """ name = 'projects/{}'.format(self.project_id) # convert to the legacy trace json for easier refactoring # TODO: refactor this to use the span data directly trace = span_data.format_legacy_trace_json(span_datas) stackdriver_spans = self.translate_to_stackdriver(trace) self.client.batch_write_spans(name, stackdriver_spans)
def emit(self, span_datas): """ :type span_datas: list of :class: `~opencensus.trace.span_data.SpanData` :param list of opencensus.trace.span_data.SpanData span_datas: SpanData tuples to emit """ # Map each span data to it's corresponding trace id trace_span_map = defaultdict(list) for sd in span_datas: trace_span_map[sd.context.trace_id] += [sd] dd_spans = [] # Write spans to Datadog for _, sds in trace_span_map.items(): # convert to the legacy trace json for easier refactoring trace = span_data.format_legacy_trace_json(sds) dd_spans.append(self.translate_to_datadog(trace)) self._dd_transport.send_traces(dd_spans)
def emit(self, span_datas): """ :type span_datas: list of :class: `~opencensus.trace.span_data.SpanData` :param list of opencensus.trace.span_data.SpanData span_datas: SpanData tuples to emit """ project = 'projects/{}'.format(self.project_id) # Map each span data to it's corresponding trace id trace_span_map = defaultdict(list) for sd in span_datas: trace_span_map[sd.context.trace_id] += [sd] # Write spans to Stackdriver for _, sds in trace_span_map.items(): # convert to the legacy trace json for easier refactoring # TODO: refactor this to use the span data directly trace = span_data.format_legacy_trace_json(sds) stackdriver_spans = self.translate_to_stackdriver(trace) self.client.batch_write_spans(project, stackdriver_spans)
def test_translate_to_zipkin_span_kind_none(self): trace_id = '6e0c63257de34c92bf9efcd03927272e' spans_ipv4 = [ span_data_module.SpanData( name='child_span', context=span_context.SpanContext(trace_id=trace_id), span_id='6e0c63257de34c92', parent_span_id='6e0c63257de34c93', attributes={'test_key': 'test_value'}, start_time='2017-08-15T18:02:26.071158Z', end_time='2017-08-15T18:02:36.071158Z', child_span_count=None, stack_trace=None, time_events=None, links=None, status=None, same_process_as_parent_span=None, span_kind=0, ), span_data_module.SpanData( name='child_span', context=span_context.SpanContext(trace_id=trace_id), span_id='6e0c63257de34c92', parent_span_id='6e0c63257de34c93', attributes={'test_key': 1}, start_time='2017-08-15T18:02:26.071158Z', end_time='2017-08-15T18:02:36.071158Z', child_span_count=None, stack_trace=None, time_events=None, links=None, status=None, same_process_as_parent_span=None, span_kind=None, ), ] trace_id = '6e0c63257de34c92bf9efcd03927272e' spans_ipv6 = [ span_data_module.SpanData( name='child_span', context=span_context.SpanContext(trace_id=trace_id), span_id='6e0c63257de34c92', parent_span_id=None, attributes={ 'test_key': False, 'test_key2': 'raw_value', # these tags are malformed and should be omitted 'test_key3': 0.1, }, start_time='2017-08-15T18:02:26.071158Z', end_time='2017-08-15T18:02:36.071158Z', child_span_count=None, stack_trace=None, time_events=None, links=None, status=None, same_process_as_parent_span=None, span_kind=1, ), ] ipv4 = '127.0.0.1' ipv6 = '2001:0db8:85a3:0000:0000:8a2e:0370:7334' local_endpoint_ipv4 = { 'serviceName': 'my_service', 'ipv4': ipv4, 'port': 9411, } local_endpoint_ipv6 = { 'serviceName': 'my_service', 'ipv6': ipv6, 'port': 9411, } expected_zipkin_spans_ipv4 = [ { 'traceId': '6e0c63257de34c92bf9efcd03927272e', 'id': '6e0c63257de34c92', 'parentId': '6e0c63257de34c93', 'name': 'child_span', 'timestamp': 1502820146071158, 'duration': 10000000, 'localEndpoint': local_endpoint_ipv4, 'tags': { 'test_key': 'test_value' }, }, { 'traceId': '6e0c63257de34c92bf9efcd03927272e', 'id': '6e0c63257de34c92', 'parentId': '6e0c63257de34c93', 'name': 'child_span', 'timestamp': 1502820146071158, 'duration': 10000000, 'localEndpoint': local_endpoint_ipv4, 'tags': { 'test_key': '1' }, }, ] expected_zipkin_spans_ipv6 = [ { 'traceId': '6e0c63257de34c92bf9efcd03927272e', 'id': '6e0c63257de34c92', 'name': 'child_span', 'timestamp': 1502820146071158, 'duration': 10000000, 'localEndpoint': local_endpoint_ipv6, 'tags': { 'test_key': 'False', 'test_key2': 'raw_value' }, 'kind': 'SERVER', }, ] # Test ipv4 local endpoint exporter_ipv4 = zipkin_exporter.ZipkinExporter( service_name='my_service', ipv4=ipv4) ipv4_trace = span_data_module.format_legacy_trace_json(spans_ipv4) zipkin_spans_ipv4 = exporter_ipv4.translate_to_zipkin( trace_id=trace_id, spans=ipv4_trace.get('spans')) self.assertEqual(zipkin_spans_ipv4, expected_zipkin_spans_ipv4) # Test ipv6 local endpoint exporter_ipv6 = zipkin_exporter.ZipkinExporter( service_name='my_service', ipv6=ipv6) ipv6_trace = span_data_module.format_legacy_trace_json(spans_ipv6) zipkin_spans_ipv6 = exporter_ipv6.translate_to_zipkin( trace_id=trace_id, spans=ipv6_trace.get('spans')) self.assertEqual(zipkin_spans_ipv6, expected_zipkin_spans_ipv6)