Skip to content

Commit 14ab5ea

Browse files
author
Ricardo Lopes
authored
Fix AttributeError when extracting tags from pika (#355)
* Fix pika BlockingChannel AttributeError * Remove duplicate span tag on pika consume * Bump patch version * Add test case for BlockingConnection * Add test case for trace context * Remove unused imports * Refactor test cases for BlockingConnection * Remove unused class attributes
1 parent 07e827f commit 14ab5ea

File tree

3 files changed

+98
-5
lines changed

3 files changed

+98
-5
lines changed

instana/instrumentation/pika.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ def _extract_publisher_tags(span, conn, exchange, routing_key):
3232
def _extract_consumer_tags(span, conn, queue):
3333
_extract_broker_tags(span, conn)
3434

35-
span.set_tag("address", "%s:%d" % (conn.params.host, conn.params.port))
3635
span.set_tag("sort", "consume")
3736
span.set_tag("queue", queue)
3837

@@ -119,7 +118,7 @@ def _cb_wrapper(channel, method, properties, body):
119118
with tracer.start_active_span("rabbitmq", child_of=parent_span) as scope:
120119
try:
121120
_extract_consumer_tags(scope.span,
122-
conn=instance.connection,
121+
conn=instance.connection._impl,
123122
queue=queue)
124123
except:
125124
logger.debug("basic_consume_with_instana: ", exc_info=True)

instana/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33

44
# Module version file. Used by setup.py and snapshot reporting.
55

6-
VERSION = '1.37.0'
6+
VERSION = '1.37.1'

tests/clients/test_pika.py

Lines changed: 96 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@
33

44
from __future__ import absolute_import
55

6-
import os
76
import pika
87
import unittest
98
import mock
109
import threading
1110
import time
1211

13-
from ..helpers import testenv
1412
from instana.singletons import tracer
1513

1614

@@ -375,3 +373,99 @@ def __consume():
375373
# A new span has been started
376374
self.assertIsNotNone(rabbitmq_span.s)
377375
self.assertNotEqual(rabbitmq_span.p, rabbitmq_span.s)
376+
377+
378+
class TestPikaBlockingChannelBlockingConnection(_TestPika):
379+
@mock.patch('pika.adapters.blocking_connection.BlockingConnection', autospec=True)
380+
def _create_connection(self, connection=None):
381+
connection._impl = mock.create_autospec(pika.connection.Connection)
382+
connection._impl.params = pika.connection.Parameters()
383+
return connection
384+
385+
@mock.patch('pika.channel.Channel', spec=pika.channel.Channel)
386+
def _create_obj(self, channel_impl):
387+
self.impl = channel_impl()
388+
self.impl.channel_number = 1
389+
390+
return pika.adapters.blocking_connection.BlockingChannel(self.impl, self.connection)
391+
392+
def _generate_delivery(self, method, properties, body):
393+
from pika.adapters.blocking_connection import _ConsumerDeliveryEvt
394+
evt = _ConsumerDeliveryEvt(method, properties, body)
395+
self.obj._add_pending_event(evt)
396+
self.obj._dispatch_events()
397+
398+
def test_basic_consume(self):
399+
consumer_tag = "test.consumer"
400+
401+
self.impl.basic_consume.return_value = consumer_tag
402+
self.impl._generate_consumer_tag.return_value = consumer_tag
403+
404+
cb = mock.Mock()
405+
406+
self.obj.basic_consume(queue="test.queue", on_message_callback=cb)
407+
408+
body = "Hello!"
409+
properties = pika.BasicProperties()
410+
method = pika.spec.Basic.Deliver(consumer_tag)
411+
self._generate_delivery(method, properties, body)
412+
413+
spans = self.recorder.queued_spans()
414+
self.assertEqual(1, len(spans))
415+
416+
rabbitmq_span = spans[0]
417+
418+
self.assertIsNone(tracer.active_span)
419+
420+
# A new span has been started
421+
self.assertIsNotNone(rabbitmq_span.t)
422+
self.assertIsNone(rabbitmq_span.p)
423+
self.assertIsNotNone(rabbitmq_span.s)
424+
425+
# Error logging
426+
self.assertIsNone(rabbitmq_span.ec)
427+
428+
# Span tags
429+
self.assertIsNone(rabbitmq_span.data["rabbitmq"]["exchange"])
430+
self.assertEqual("consume", rabbitmq_span.data["rabbitmq"]["sort"])
431+
self.assertIsNotNone(rabbitmq_span.data["rabbitmq"]["address"])
432+
self.assertEqual("test.queue", rabbitmq_span.data["rabbitmq"]["queue"])
433+
self.assertIsNotNone(rabbitmq_span.stack)
434+
self.assertTrue(type(rabbitmq_span.stack) is list)
435+
self.assertGreater(len(rabbitmq_span.stack), 0)
436+
437+
cb.assert_called_once_with(self.obj, method, properties, body)
438+
439+
def test_basic_consume_with_trace_context(self):
440+
consumer_tag = "test.consumer"
441+
442+
self.impl.basic_consume.return_value = consumer_tag
443+
self.impl._generate_consumer_tag.return_value = consumer_tag
444+
445+
cb = mock.Mock()
446+
447+
self.obj.basic_consume(queue="test.queue", on_message_callback=cb)
448+
449+
body = "Hello!"
450+
properties = pika.BasicProperties(headers={
451+
"X-INSTANA-T": "0000000000000001",
452+
"X-INSTANA-S": "0000000000000002",
453+
"X-INSTANA-L": "1"
454+
})
455+
method = pika.spec.Basic.Deliver(consumer_tag)
456+
self._generate_delivery(method, properties, body)
457+
458+
spans = self.recorder.queued_spans()
459+
self.assertEqual(1, len(spans))
460+
461+
rabbitmq_span = spans[0]
462+
463+
self.assertIsNone(tracer.active_span)
464+
465+
# Trace context propagation
466+
self.assertEqual("0000000000000001", rabbitmq_span.t)
467+
self.assertEqual("0000000000000002", rabbitmq_span.p)
468+
469+
# A new span has been started
470+
self.assertIsNotNone(rabbitmq_span.s)
471+
self.assertNotEqual(rabbitmq_span.p, rabbitmq_span.s)

0 commit comments

Comments
 (0)