From c6c36ffc04275de4a7d56050166be9bb8654cd41 Mon Sep 17 00:00:00 2001 From: Vlad Vladov Date: Sat, 16 Sep 2023 14:38:56 +0300 Subject: [PATCH 01/14] Add wrapper for `Celery().send_task` to support behavior as `Task.apply_async` --- sentry_sdk/integrations/celery.py | 2 ++ tests/integrations/celery/test_celery.py | 14 +++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/sentry_sdk/integrations/celery.py b/sentry_sdk/integrations/celery.py index 0fd983de8d..7aa4e3673a 100644 --- a/sentry_sdk/integrations/celery.py +++ b/sentry_sdk/integrations/celery.py @@ -108,8 +108,10 @@ def sentry_build_tracer(name, task, *args, **kwargs): trace.build_tracer = sentry_build_tracer from celery.app.task import Task # type: ignore + from celery import Celery # type: ignore Task.apply_async = _wrap_apply_async(Task.apply_async) + Celery.send_task = _wrap_apply_async(Celery.send_task) _patch_worker_exit() diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index 0d44ee992e..bcc857ba7d 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -359,9 +359,12 @@ def dummy_task(self): # TODO: This test is hanging when running test with `tox --parallel auto`. Find out why and fix it! -@pytest.mark.skip +# @pytest.mark.skip @pytest.mark.forked -def test_redis_backend_trace_propagation(init_celery, capture_events_forksafe): +@pytest.mark.parametrize("execution_way", ["apply_async", "send_task"]) +def test_redis_backend_trace_propagation( + init_celery, capture_events_forksafe, execution_way +): celery = init_celery(traces_sample_rate=1.0, backend="redis", debug=True) events = capture_events_forksafe() @@ -375,7 +378,12 @@ def dummy_task(self): with start_transaction(name="submit_celery"): # Curious: Cannot use delay() here or py2.7-celery-4.2 crashes - res = dummy_task.apply_async() + if execution_way == "apply_async": + res = dummy_task.apply_async() + elif execution_way == "send_task": + res = celery.send_task("dummy_task") + else: # pragma: no cover + raise ValueError(execution_way) with pytest.raises(Exception): # noqa: B017 # Celery 4.1 raises a gibberish exception From 016609cb7d77bfdb235c2569182f46a665db2232 Mon Sep 17 00:00:00 2001 From: divaltor Date: Wed, 24 Jan 2024 18:27:58 +0200 Subject: [PATCH 02/14] Rename function `_wrap_apply_async` to `_wrap_task_run` --- sentry_sdk/integrations/celery.py | 13 ++++++++----- tests/integrations/celery/test_celery.py | 14 +++++++------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/sentry_sdk/integrations/celery.py b/sentry_sdk/integrations/celery.py index 7aa4e3673a..122aba1156 100644 --- a/sentry_sdk/integrations/celery.py +++ b/sentry_sdk/integrations/celery.py @@ -110,8 +110,8 @@ def sentry_build_tracer(name, task, *args, **kwargs): from celery.app.task import Task # type: ignore from celery import Celery # type: ignore - Task.apply_async = _wrap_apply_async(Task.apply_async) - Celery.send_task = _wrap_apply_async(Celery.send_task) + Task.apply_async = _wrap_task_run(Task.apply_async) + Celery.send_task = _wrap_task_run(Celery.send_task) _patch_worker_exit() @@ -146,7 +146,7 @@ def __exit__(self, exc_type, exc_value, traceback): return None -def _wrap_apply_async(f): +def _wrap_task_run(f): # type: (F) -> F @wraps(f) def apply_async(*args, **kwargs): @@ -172,10 +172,13 @@ def apply_async(*args, **kwargs): except (IndexError, TypeError): task_started_from_beat = False - task = args[0] + if isinstance(args[0], Task): + task_name = args[0].name + else: + task_name = args[1] span_mgr = ( - hub.start_span(op=OP.QUEUE_SUBMIT_CELERY, description=task.name) + hub.start_span(op=OP.QUEUE_SUBMIT_CELERY, description=task_name) if not task_started_from_beat else NoOpMgr() ) # type: Union[Span, NoOpMgr] diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index bcc857ba7d..9a2cfb1e41 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -6,7 +6,7 @@ from sentry_sdk.integrations.celery import ( CeleryIntegration, _get_headers, - _wrap_apply_async, + _wrap_task_run, ) from sentry_sdk._compat import text_type @@ -34,7 +34,7 @@ def init_celery(sentry_init, request): def inner(propagate_traces=True, backend="always_eager", **kwargs): sentry_init( integrations=[CeleryIntegration(propagate_traces=propagate_traces)], - **kwargs + **kwargs, ) celery = Celery(__name__) @@ -372,16 +372,16 @@ def test_redis_backend_trace_propagation( runs = [] @celery.task(name="dummy_task", bind=True) - def dummy_task(self): + def dummy_task(self, x, y): runs.append(1) 1 / 0 with start_transaction(name="submit_celery"): # Curious: Cannot use delay() here or py2.7-celery-4.2 crashes if execution_way == "apply_async": - res = dummy_task.apply_async() + res = dummy_task.apply_async(kwargs={"x": 1, "y": 0}) elif execution_way == "send_task": - res = celery.send_task("dummy_task") + res = celery.send_task("dummy_task", kwargs={"x": 1, "y": 0}) else: # pragma: no cover raise ValueError(execution_way) @@ -579,7 +579,7 @@ def dummy_function(*args, **kwargs): assert "sentry-trace" in headers assert "baggage" in headers - wrapped = _wrap_apply_async(dummy_function) + wrapped = _wrap_task_run(dummy_function) wrapped(mock.MagicMock(), (), headers={}) @@ -593,7 +593,7 @@ def dummy_function(*args, **kwargs): assert "sentry-trace" not in headers assert "baggage" not in headers - wrapped = _wrap_apply_async(dummy_function) + wrapped = _wrap_task_run(dummy_function) wrapped( mock.MagicMock(), [ From ddad2262be6bdac74aa76d4036dc7558e3d88f25 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Thu, 25 Jul 2024 14:38:05 +0200 Subject: [PATCH 03/14] linting --- sentry_sdk/integrations/celery/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/integrations/celery/__init__.py b/sentry_sdk/integrations/celery/__init__.py index 8595b9ba3d..4bc2d3ccb1 100644 --- a/sentry_sdk/integrations/celery/__init__.py +++ b/sentry_sdk/integrations/celery/__init__.py @@ -262,10 +262,11 @@ def apply_async(*args, **kwargs): return f(*args, **kwargs) from celery.app.task import Task # type: ignore + if isinstance(args[0], Task): task_name = args[0].name else: - task_name = args[1] + task_name = args[1] task_started_from_beat = ( sentry_sdk.Scope.get_isolation_scope()._name == "celery-beat" @@ -450,9 +451,10 @@ def _patch_task_apply_async(): def _patch_celery_send_task(): + # type: () -> None from celery import Celery # type: ignore - Celery.send_task = _wrap_task_run(Celery.send_task) + Celery.send_task = _wrap_task_run(Celery.send_task) def _patch_worker_exit(): From 2c8a2b06d5fb462b6400df1588015fb06928414a Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Thu, 25 Jul 2024 14:44:30 +0200 Subject: [PATCH 04/14] Cleanup --- tests/integrations/celery/test_celery.py | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index 3d32c31d0b..04ee005859 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -351,7 +351,7 @@ def test_redis_backend_trace_propagation( runs = [] @celery.task(name="dummy_task", bind=True) - def dummy_task(self, x, y): + def dummy_task(self): runs.append(1) 1 / 0 @@ -582,26 +582,6 @@ def dummy_function(*args, **kwargs): wrapped(mock.MagicMock(), (), headers={}) -def test_apply_async_from_beat_no_span(sentry_init): - sentry_init( - integrations=[CeleryIntegration()], - ) - - def dummy_function(*args, **kwargs): - headers = kwargs.get("headers") - assert "sentry-trace" not in headers - assert "baggage" not in headers - - wrapped = _wrap_task_run(dummy_function) - wrapped( - mock.MagicMock(), - [ - "BEAT", - ], - headers={}, - ) - - def test_apply_async_no_args(init_celery): celery = init_celery() From 5639285951f0ab3c97cb8645139ed0cd200b4239 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Thu, 25 Jul 2024 14:55:28 +0200 Subject: [PATCH 05/14] Updated import --- sentry_sdk/integrations/celery/__init__.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sentry_sdk/integrations/celery/__init__.py b/sentry_sdk/integrations/celery/__init__.py index 4bc2d3ccb1..c61106fe7d 100644 --- a/sentry_sdk/integrations/celery/__init__.py +++ b/sentry_sdk/integrations/celery/__init__.py @@ -41,6 +41,7 @@ try: from celery import VERSION as CELERY_VERSION # type: ignore + from celery.app.task import Task # type: ignore from celery.app.trace import task_has_custom from celery.exceptions import ( # type: ignore Ignore, @@ -261,8 +262,6 @@ def apply_async(*args, **kwargs): if not propagate_traces: return f(*args, **kwargs) - from celery.app.task import Task # type: ignore - if isinstance(args[0], Task): task_name = args[0].name else: @@ -445,14 +444,12 @@ def sentry_build_tracer(name, task, *args, **kwargs): def _patch_task_apply_async(): # type: () -> None - from celery.app.task import Task # type: ignore - Task.apply_async = _wrap_task_run(Task.apply_async) def _patch_celery_send_task(): # type: () -> None - from celery import Celery # type: ignore + from celery import Celery Celery.send_task = _wrap_task_run(Celery.send_task) From b232e5f5a4a1d53868b5bb3e01036a4c9fe76994 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Thu, 25 Jul 2024 16:29:23 +0200 Subject: [PATCH 06/14] remove new test case --- tests/integrations/celery/test_celery.py | 32 ++++++++++++++---------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index 04ee005859..8fe38be980 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -105,15 +105,28 @@ def celery(init_celery): task.apply_async(kwargs=dict(x=x, y=y)), {"args": [], "kwargs": {"x": x, "y": y}}, ), + "call_celery_send_task", ] ) -def celery_invocation(request): +def celery_invocation(request, init_celery): """ Invokes a task in multiple ways Celery allows you to (testing our apply_async monkeypatch). Currently limited to a task signature of the form foo(x, y) """ - return request.param + if request.param == "call_celery_send_task": + def call_celery_send_task(task, x, y): + celery = init_celery(traces_sample_rate=1.0, backend="redis") + return ( + celery.send_task(task.__name__, kwargs={"x": x, "y": y}), + {"args": [], "kwargs": {"x": x, "y": y}}, + ) + + return call_celery_send_task + + else: + return request.param + def test_simple_with_performance(capture_events, init_celery, celery_invocation): @@ -129,6 +142,7 @@ def dummy_task(x, y): celery_invocation(dummy_task, 1, 2) _, expected_context = celery_invocation(dummy_task, 1, 0) + import ipdb; ipdb.set_trace() (_, error_event, _, _) = events assert error_event["contexts"]["trace"]["trace_id"] == transaction.trace_id @@ -340,10 +354,7 @@ def dummy_task(self): reason="This test is hanging when running test with `tox --parallel auto`. TODO: Figure out why and fix it!" ) @pytest.mark.forked -@pytest.mark.parametrize("execution_way", ["apply_async", "send_task"]) -def test_redis_backend_trace_propagation( - init_celery, capture_events_forksafe, execution_way -): +def test_redis_backend_trace_propagation(init_celery, capture_events_forksafe): celery = init_celery(traces_sample_rate=1.0, backend="redis") events = capture_events_forksafe() @@ -351,18 +362,13 @@ def test_redis_backend_trace_propagation( runs = [] @celery.task(name="dummy_task", bind=True) - def dummy_task(self): + def dummy_task(self, x, y): runs.append(1) 1 / 0 with start_transaction(name="submit_celery"): # Curious: Cannot use delay() here or py2.7-celery-4.2 crashes - if execution_way == "apply_async": - res = dummy_task.apply_async(kwargs={"x": 1, "y": 0}) - elif execution_way == "send_task": - res = celery.send_task("dummy_task", kwargs={"x": 1, "y": 0}) - else: # pragma: no cover - raise ValueError(execution_way) + res = dummy_task.apply_async(kwargs={"x": 1, "y": 0}) with pytest.raises(Exception): # noqa: B017 # Celery 4.1 raises a gibberish exception From a4878f6ab3329204fba575b8aba31f4841036110 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Thu, 25 Jul 2024 16:31:13 +0200 Subject: [PATCH 07/14] cleanup --- tests/integrations/celery/test_celery.py | 46 +++++++++++++++--------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index 8fe38be980..2fd71a12f8 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -105,7 +105,6 @@ def celery(init_celery): task.apply_async(kwargs=dict(x=x, y=y)), {"args": [], "kwargs": {"x": x, "y": y}}, ), - "call_celery_send_task", ] ) def celery_invocation(request, init_celery): @@ -114,19 +113,7 @@ def celery_invocation(request, init_celery): Currently limited to a task signature of the form foo(x, y) """ - if request.param == "call_celery_send_task": - def call_celery_send_task(task, x, y): - celery = init_celery(traces_sample_rate=1.0, backend="redis") - return ( - celery.send_task(task.__name__, kwargs={"x": x, "y": y}), - {"args": [], "kwargs": {"x": x, "y": y}}, - ) - - return call_celery_send_task - - else: - return request.param - + return request.param def test_simple_with_performance(capture_events, init_celery, celery_invocation): @@ -142,7 +129,6 @@ def dummy_task(x, y): celery_invocation(dummy_task, 1, 2) _, expected_context = celery_invocation(dummy_task, 1, 0) - import ipdb; ipdb.set_trace() (_, error_event, _, _) = events assert error_event["contexts"]["trace"]["trace_id"] == transaction.trace_id @@ -362,13 +348,13 @@ def test_redis_backend_trace_propagation(init_celery, capture_events_forksafe): runs = [] @celery.task(name="dummy_task", bind=True) - def dummy_task(self, x, y): + def dummy_task(self): runs.append(1) 1 / 0 with start_transaction(name="submit_celery"): # Curious: Cannot use delay() here or py2.7-celery-4.2 crashes - res = dummy_task.apply_async(kwargs={"x": 1, "y": 0}) + res = dummy_task.apply_async() with pytest.raises(Exception): # noqa: B017 # Celery 4.1 raises a gibberish exception @@ -799,3 +785,29 @@ def task(): ... assert span["origin"] == "auto.queue.celery" monkeypatch.setattr(kombu.messaging.Producer, "_publish", old_publish) + + +# @pytest.mark.forked +# @pytest.mark.parametrize("execution_way", ["apply_async", "send_task"]) +# def test_redis_backend_trace_propagation( +# init_celery, capture_events_forksafe, execution_way +# ): +# celery = init_celery(traces_sample_rate=1.0, backend="redis") + +# events = capture_events_forksafe() + +# runs = [] + +# @celery.task(name="dummy_task", bind=True) +# def dummy_task(self, x, y): +# runs.append(1) +# 1 / 0 + +# with start_transaction(name="submit_celery"): +# # Curious: Cannot use delay() here or py2.7-celery-4.2 crashes +# if execution_way == "apply_async": +# res = dummy_task.apply_async(kwargs={"x": 1, "y": 0}) +# elif execution_way == "send_task": +# res = celery.send_task("dummy_task", kwargs={"x": 1, "y": 0}) +# else: # pragma: no cover +# raise ValueError(execution_way) From 6d9d616b2cb4627f923247608417178a7fec1592 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Thu, 25 Jul 2024 16:31:58 +0200 Subject: [PATCH 08/14] cleanup --- tests/integrations/celery/test_celery.py | 28 +----------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index 2fd71a12f8..19cc953ea2 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -107,7 +107,7 @@ def celery(init_celery): ), ] ) -def celery_invocation(request, init_celery): +def celery_invocation(request): """ Invokes a task in multiple ways Celery allows you to (testing our apply_async monkeypatch). @@ -785,29 +785,3 @@ def task(): ... assert span["origin"] == "auto.queue.celery" monkeypatch.setattr(kombu.messaging.Producer, "_publish", old_publish) - - -# @pytest.mark.forked -# @pytest.mark.parametrize("execution_way", ["apply_async", "send_task"]) -# def test_redis_backend_trace_propagation( -# init_celery, capture_events_forksafe, execution_way -# ): -# celery = init_celery(traces_sample_rate=1.0, backend="redis") - -# events = capture_events_forksafe() - -# runs = [] - -# @celery.task(name="dummy_task", bind=True) -# def dummy_task(self, x, y): -# runs.append(1) -# 1 / 0 - -# with start_transaction(name="submit_celery"): -# # Curious: Cannot use delay() here or py2.7-celery-4.2 crashes -# if execution_way == "apply_async": -# res = dummy_task.apply_async(kwargs={"x": 1, "y": 0}) -# elif execution_way == "send_task": -# res = celery.send_task("dummy_task", kwargs={"x": 1, "y": 0}) -# else: # pragma: no cover -# raise ValueError(execution_way) From abfbc8d031a7ac87209e96d5c1dc0b3c4b89818e Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Mon, 2 Sep 2024 11:07:35 +0200 Subject: [PATCH 09/14] Make `task_name` logic safe --- sentry_sdk/integrations/celery/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/integrations/celery/__init__.py b/sentry_sdk/integrations/celery/__init__.py index 47aa937e4c..88a2119c09 100644 --- a/sentry_sdk/integrations/celery/__init__.py +++ b/sentry_sdk/integrations/celery/__init__.py @@ -263,9 +263,11 @@ def apply_async(*args, **kwargs): return f(*args, **kwargs) if isinstance(args[0], Task): - task_name = args[0].name - else: + task_name = args[0].name # type: str + elif len(args) > 1 and isinstance(args[1], str): task_name = args[1] + else: + task_name = "" task_started_from_beat = sentry_sdk.get_isolation_scope()._name == "celery-beat" From de1c69931ad3bf521510a97b926208985fa25066 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Mon, 2 Sep 2024 15:24:13 +0200 Subject: [PATCH 10/14] test(celery): Add test for `send_task` --- tests/integrations/celery/test_celery.py | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index a23e6025b4..835ec7dbe2 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -783,3 +783,51 @@ def task(): ... assert span["origin"] == "auto.queue.celery" monkeypatch.setattr(kombu.messaging.Producer, "_publish", old_publish) + + +def test_send_task_wrapped(monkeypatch, sentry_init, capture_events): + calls = [] + + def send_task(*args, **kwargs): + calls.append((args, kwargs)) + + monkeypatch.setattr(Celery, "send_task", send_task) + + sentry_init(integrations=[CeleryIntegration()], enable_tracing=True) + celery = Celery(__name__, broker="redis://example.com") # noqa: E231 + + events = capture_events() + + with sentry_sdk.start_transaction(name="custom_transaction"): + celery.send_task("very_creative_task_name", args=(1, 2), kwargs={"foo": "bar"}) + + (call,) = calls # We should have exactly one call + (args, kwargs) = call + + assert args == (celery, "very_creative_task_name") + assert kwargs["args"] == (1, 2) + assert kwargs["kwargs"] == {"foo": "bar"} + assert set(kwargs["headers"].keys()) == { + "sentry-task-enqueued-time", + "sentry-trace", + "baggage", + "headers", + } + assert set(kwargs["headers"]["headers"].keys()) == { + "sentry-trace", + "baggage", + "sentry-task-enqueued-time", + } + assert ( + kwargs["headers"]["sentry-trace"] + == kwargs["headers"]["headers"]["sentry-trace"] + ) + + (event,) = events # We should have exactly one event (the transaction) + assert event["type"] == "transaction" + assert event["transaction"] == "custom_transaction" + + (span,) = event["spans"] # We should have exactly one span + assert span["description"] == "very_creative_task_name" + assert span["op"] == "queue.submit.celery" + assert span["trace_id"] == kwargs["headers"]["sentry-trace"].split("-")[0] From d85583216e5314a9a6dc000a0491310e3a1b10b4 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Mon, 2 Sep 2024 15:28:50 +0200 Subject: [PATCH 11/14] fork test --- tests/integrations/celery/test_celery.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index 835ec7dbe2..b80795ef0b 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -785,6 +785,7 @@ def task(): ... monkeypatch.setattr(kombu.messaging.Producer, "_publish", old_publish) +@pytest.mark.forked def test_send_task_wrapped(monkeypatch, sentry_init, capture_events): calls = [] From 3140275c5a861a54b78c54eb7c5665854ee6b134 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Mon, 2 Sep 2024 17:04:03 +0200 Subject: [PATCH 12/14] hopefully fix test --- tests/integrations/celery/test_celery.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index b80795ef0b..5b10d7a2f1 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -785,15 +785,13 @@ def task(): ... monkeypatch.setattr(kombu.messaging.Producer, "_publish", old_publish) -@pytest.mark.forked -def test_send_task_wrapped(monkeypatch, sentry_init, capture_events): - calls = [] - - def send_task(*args, **kwargs): - calls.append((args, kwargs)) - - monkeypatch.setattr(Celery, "send_task", send_task) - +@mock.patch("celery.Celery.send_task") +def test_send_task_wrapped( + patched_send_task, + sentry_init, + capture_events, + reset_integrations, +): sentry_init(integrations=[CeleryIntegration()], enable_tracing=True) celery = Celery(__name__, broker="redis://example.com") # noqa: E231 @@ -802,7 +800,7 @@ def send_task(*args, **kwargs): with sentry_sdk.start_transaction(name="custom_transaction"): celery.send_task("very_creative_task_name", args=(1, 2), kwargs={"foo": "bar"}) - (call,) = calls # We should have exactly one call + (call,) = patched_send_task.call_args_list # We should have exactly one call (args, kwargs) = call assert args == (celery, "very_creative_task_name") From ebb4a8e50561099aa81753d9a6e8f9e79a909c1f Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 3 Sep 2024 11:17:13 +0200 Subject: [PATCH 13/14] hanging tests fix --- tests/integrations/celery/test_celery.py | 1 + tox.ini | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index 5b10d7a2f1..ffd3f0db62 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -785,6 +785,7 @@ def task(): ... monkeypatch.setattr(kombu.messaging.Producer, "_publish", old_publish) +@pytest.mark.forked @mock.patch("celery.Celery.send_task") def test_send_task_wrapped( patched_send_task, diff --git a/tox.ini b/tox.ini index fcab3ad1ed..2a680b64da 100644 --- a/tox.ini +++ b/tox.ini @@ -371,8 +371,9 @@ deps = celery-v5.4: Celery~=5.4.0 celery-latest: Celery - {py3.7}-celery: importlib-metadata<5.0 {py3.6,py3.7,py3.8,py3.9,py3.10,py3.11,py3.12}-celery: newrelic + {py3.6,py3.7}-celery: pytest<6 + {py3.7}-celery: importlib-metadata<5.0 # Chalice chalice-v1.16: chalice~=1.16.0 From d88dfb3a648120bcb17da4163c6d6c2a5bab0aa4 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 3 Sep 2024 11:22:53 +0200 Subject: [PATCH 14/14] fix --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 2a680b64da..dd1dbf1156 100644 --- a/tox.ini +++ b/tox.ini @@ -372,7 +372,7 @@ deps = celery-latest: Celery {py3.6,py3.7,py3.8,py3.9,py3.10,py3.11,py3.12}-celery: newrelic - {py3.6,py3.7}-celery: pytest<6 + celery: pytest<7 {py3.7}-celery: importlib-metadata<5.0 # Chalice