コード例 #1
0
    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))
コード例 #2
0
    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))
コード例 #3
0
 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)
コード例 #4
0
 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)
コード例 #5
0
 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)
コード例 #6
0
    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)
コード例 #7
0
    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)
コード例 #8
0
    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)
コード例 #9
0
    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)