Example #1
0
    def test_trace_pubsub_error(self):
        pubsub = self.client.pubsub()

        with patch.object(pubsub, 'parse_response',
                          side_effect=ValueError) as parse_response:
            parse_response.__name__ = 'parse_response'

            redis_opentracing.init_tracing(self.tracer,
                                           trace_all_classes=False,
                                           prefix='Test')
            redis_opentracing.trace_pubsub(pubsub)

            call_exc = None
            try:
                pubsub.get_message()
            except ValueError as exc:
                call_exc = exc

            self.assertEqual(parse_response.call_count, 1)
            self.assertEqual(len(self.tracer.spans), 1)
            self.assertEqual(self.tracer.spans[0].operation_name, 'Test/SUB')
            self.assertEqual(self.tracer.spans[0].is_finished, True)
            self.assertEqual(
                self.tracer.spans[0].tags, {
                    'component': 'redis-py',
                    'db.type': 'redis',
                    'db.statement': '',
                    'span.kind': 'client',
                    'error': 'true',
                    'error.object': call_exc,
                })
Example #2
0
    def test_trace_pubsub_execute_command(self):
        pubsub = self.client.pubsub()

        with patch.object(pubsub, 'execute_command',
                          return_value='hello') as execute_command:
            execute_command.__name__ = 'parse_response'

            redis_opentracing.init_tracing(self.tracer,
                                           trace_all_classes=False,
                                           prefix='Test')
            redis_opentracing.trace_pubsub(pubsub)
            res = pubsub.execute_command('GET', 'foo')

            self.assertEqual(res, 'hello')
            self.assertEqual(execute_command.call_count, 1)
            self.assertEqual(len(self.tracer.spans), 1)
            self.assertEqual(self.tracer.spans[0].operation_name, 'Test/GET')
            self.assertEqual(self.tracer.spans[0].is_finished, True)
            self.assertEqual(
                self.tracer.spans[0].tags, {
                    'component': 'redis-py',
                    'db.type': 'redis',
                    'db.statement': 'GET foo',
                    'span.kind': 'client',
                })
    def test_trace_pubsub_start_span_cb(self):
        def start_span_cb(span):
            span.set_operation_name('Test')

        pubsub = self.client.pubsub()
        return_value = [  # Simulate a real message
            'pmessage',
            'pattern1',
            'channel1',
            'hello',
        ]

        with patch.object(pubsub, 'parse_response',
                          return_value=return_value) as parse_response:
            parse_response.__name__ = 'parse_response'

            redis_opentracing.init_tracing(self.tracer,
                                           trace_all_classes=False,
                                           start_span_cb=start_span_cb)
            redis_opentracing.trace_pubsub(pubsub)
            res = pubsub.get_message()

            spans = self.tracer.finished_spans()
            self.assertEqual(len(spans), 1)
            self.assertEqual(spans[0].operation_name, 'Test')
    def test_trace_pubsub_error(self):
        pubsub = self.client.pubsub()

        with patch.object(pubsub, 'parse_response',
                          side_effect=ValueError) as parse_response:
            parse_response.__name__ = 'parse_response'

            redis_opentracing.init_tracing(self.tracer,
                                           trace_all_classes=False)
            redis_opentracing.trace_pubsub(pubsub)

            call_exc = None
            try:
                pubsub.get_message()
            except ValueError as exc:
                call_exc = exc

            self.assertEqual(parse_response.call_count, 1)
            self.assertEqual(len(self.tracer.finished_spans()), 1)
            span = self.tracer.finished_spans()[0]
            self.assertEqual(span.operation_name, 'SUB')
            self.assertEqual(
                span.tags, {
                    'component': 'redis-py',
                    'db.type': 'redis',
                    'db.statement': '',
                    'span.kind': 'client',
                    'error': True,
                })
            self.assertEqual(len(span.logs), 1)
            self.assertEqual(span.logs[0].key_values.get('event', None),
                             'error')
            self.assertTrue(
                isinstance(span.logs[0].key_values.get('error.object', None),
                           ValueError))
    def test_trace_pubsub(self):
        pubsub = self.client.pubsub()
        return_value = [ # Simulate a real message
            'pmessage',
            'pattern1',
            'channel1',
            'hello',
        ]

        with patch.object(pubsub, 'parse_response',
                          return_value=return_value) as parse_response:
            parse_response.__name__ = 'parse_response'

            redis_opentracing.init_tracing(self.tracer,
                                           trace_all_classes=False)
            redis_opentracing.trace_pubsub(pubsub)
            res = pubsub.get_message()

            self.assertEqual(res, {
                'type': 'pmessage',
                'pattern': 'pattern1',
                'channel': 'channel1',
                'data': 'hello',
            })
            self.assertEqual(parse_response.call_count, 1)
            self.assertEqual(len(self.tracer.finished_spans()), 1)
            self.assertEqual(self.tracer.finished_spans()[0].operation_name, 'SUB')
            self.assertEqual(self.tracer.finished_spans()[0].tags, {
                'component': 'redis-py',
                'db.type': 'redis',
                'db.statement': '',
                'span.kind': 'client',
            })
    def test_trace_pubsub_error(self):
        pubsub = self.client.pubsub()

        with patch.object(pubsub, 'parse_response',
                          side_effect=ValueError) as parse_response:
            parse_response.__name__ = 'parse_response'

            redis_opentracing.init_tracing(self.tracer,
                                           trace_all_classes=False)
            redis_opentracing.trace_pubsub(pubsub)

            call_exc = None
            try:
                pubsub.get_message()
            except ValueError as exc:
                call_exc = exc

            self.assertEqual(parse_response.call_count, 1)
            self.assertEqual(len(self.tracer.finished_spans()), 1)
            span = self.tracer.finished_spans()[0]
            self.assertEqual(span.operation_name, 'SUB')
            tags = {
                'component': 'redis-py',
                'db.type': 'redis',
                'db.statement': '',
                'span.kind': 'client',
                'error': True,
            }

            for k, v in tags.items():
                assert k in span.tags
                assert span.tags[k] == v

            self.assertEqual(span.tags['error'], True)
            self.assertEqual(span.tags['sfx.error.message'], '')
            self.assertEqual(span.tags['sfx.error.kind'], 'ValueError')
            self.assertEqual(span.tags['sfx.error.object'], '<class \'ValueError\'>')
            assert len(span.tags['sfx.error.stack']) > 50