def _trace_before_publish(self, *args, **kwargs):
        task = utils.retrieve_task_from_sender(kwargs)
        task_id = utils.retrieve_task_id_from_message(kwargs)

        if task is None or task_id is None:
            return

        operation_name = f"{_TASK_APPLY_ASYNC}/{task.name}"
        span = self._tracer.start_span(
            operation_name, kind=trace.SpanKind.PRODUCER
        )

        # apply some attributes here because most of the data is not available
        if span.is_recording():
            span.set_attribute(_TASK_TAG_KEY, _TASK_APPLY_ASYNC)
            span.set_attribute(SpanAttributes.MESSAGING_MESSAGE_ID, task_id)
            span.set_attribute(_TASK_NAME_KEY, task.name)
            utils.set_attributes_from_context(span, kwargs)

        activation = trace.use_span(span, end_on_exit=True)
        activation.__enter__()  # pylint: disable=E1101

        utils.attach_span(task, task_id, (span, activation), is_publish=True)

        headers = kwargs.get("headers")
        if headers:
            inject(headers)
    def test_task_id_from_protocol_v1(self):
        # ensures a `task_id` is properly returned when Protocol v1 is used.
        # `context` is an example of an emitted Signal with Protocol v1
        context = {
            "body": {
                "expires": None,
                "utc": True,
                "args": ["user"],
                "chord": None,
                "callbacks": None,
                "errbacks": None,
                "taskset": None,
                "id": "dffcaec1-dd92-4a1a-b3ab-d6512f4beeb7",
                "retries": 0,
                "task":
                "tests.contrib.celery.test_integration.fn_task_parameters",
                "timelimit": (None, None),
                "eta": None,
                "kwargs": {
                    "force_logout": True
                },
            },
            "sender":
            "tests.contrib.celery.test_integration.fn_task_parameters",
            "exchange": "celery",
            "routing_key": "celery",
            "retry_policy": None,
            "headers": {},
            "properties": {},
        }

        task_id = utils.retrieve_task_id_from_message(context)
        self.assertEqual(task_id, "dffcaec1-dd92-4a1a-b3ab-d6512f4beeb7")
    def _trace_before_publish(self, *args, **kwargs):
        task = utils.retrieve_task_from_sender(kwargs)
        task_id = utils.retrieve_task_id_from_message(kwargs)

        if task is None or task_id is None:
            return

        operation_name = "{0}/{1}".format(_TASK_APPLY_ASYNC, task.name)
        span = self._tracer.start_span(
            operation_name, kind=trace.SpanKind.PRODUCER
        )

        # apply some attributes here because most of the data is not available
        if span.is_recording():
            span.set_attribute(_TASK_TAG_KEY, _TASK_APPLY_ASYNC)
            span.set_attribute(_MESSAGE_ID_ATTRIBUTE_NAME, task_id)
            span.set_attribute(_TASK_NAME_KEY, task.name)
            utils.set_attributes_from_context(span, kwargs)

        activation = self._tracer.use_span(span, end_on_exit=True)
        activation.__enter__()
        utils.attach_span(task, task_id, (span, activation), is_publish=True)

        headers = kwargs.get("headers")
        if headers:
            propagators.inject(type(headers).__setitem__, headers)
    def test_task_id_from_protocol_v2(self):
        # ensures a `task_id` is properly returned when Protocol v2 is used.
        # `context` is an example of an emitted Signal with Protocol v2
        context = {
            "body": (
                ["user"],
                {
                    "force_logout": True
                },
                {
                    u"chord": None,
                    u"callbacks": None,
                    u"errbacks": None,
                    u"chain": None,
                },
            ),
            "sender":
            u"tests.contrib.celery.test_integration.fn_task_parameters",
            "exchange":
            u"",
            "routing_key":
            u"celery",
            "retry_policy":
            None,
            "headers": {
                u"origin": u"gen83744@hostname",
                u"root_id": "7e917b83-4018-431d-9832-73a28e1fb6c0",
                u"expires": None,
                u"shadow": None,
                u"id": "7e917b83-4018-431d-9832-73a28e1fb6c0",
                u"kwargsrepr": u"{'force_logout': True}",
                u"lang": u"py",
                u"retries": 0,
                u"task":
                u"tests.contrib.celery.test_integration.fn_task_parameters",
                u"group": None,
                u"timelimit": [None, None],
                u"parent_id": None,
                u"argsrepr": u"['user']",
                u"eta": None,
            },
            "properties": {
                u"reply_to": "c3054a07-5b28-3855-b18c-1623a24aaeca",
                u"correlation_id": "7e917b83-4018-431d-9832-73a28e1fb6c0",
            },
        }

        task_id = utils.retrieve_task_id_from_message(context)
        self.assertEqual(task_id, "7e917b83-4018-431d-9832-73a28e1fb6c0")
    def _trace_after_publish(*args, **kwargs):
        task = utils.retrieve_task_from_sender(kwargs)
        task_id = utils.retrieve_task_id_from_message(kwargs)

        if task is None or task_id is None:
            return

        # retrieve and finish the Span
        _, activation = utils.retrieve_span(task, task_id, is_publish=True)
        if activation is None:
            logger.warning("no existing span found for task_id=%s", task_id)
            return

        activation.__exit__(None, None, None)  # pylint: disable=E1101
        utils.detach_span(task, task_id, is_publish=True)
예제 #6
0
    def _trace_before_publish(self, *args, **kwargs):
        task = utils.retrieve_task_from_sender(kwargs)
        task_id = utils.retrieve_task_id_from_message(kwargs)

        if task is None or task_id is None:
            return

        span = self._tracer.start_span(task.name, kind=trace.SpanKind.PRODUCER)

        # apply some attributes here because most of the data is not available
        span.set_attribute(_TASK_TAG_KEY, _TASK_APPLY_ASYNC)
        span.set_attribute(_MESSAGE_ID_ATTRIBUTE_NAME, task_id)
        span.set_attribute(_TASK_NAME_KEY, task.name)
        utils.set_attributes_from_context(span, kwargs)

        activation = self._tracer.use_span(span, end_on_exit=True)
        activation.__enter__()
        utils.attach_span(task, task_id, (span, activation), is_publish=True)