Skip to content

Commit b954e97

Browse files
Fix arq attribute error on settings, support worker args (getsentry#2260)
1 parent 3845489 commit b954e97

2 files changed

Lines changed: 49 additions & 15 deletions

File tree

sentry_sdk/integrations/arq.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,23 @@ def _sentry_create_worker(*args, **kwargs):
200200

201201
settings_cls = args[0]
202202

203-
functions = settings_cls.functions
204-
cron_jobs = settings_cls.cron_jobs
205-
206-
settings_cls.functions = [_get_arq_function(func) for func in functions]
207-
settings_cls.cron_jobs = [_get_arq_cron_job(cron_job) for cron_job in cron_jobs]
203+
if hasattr(settings_cls, "functions"):
204+
settings_cls.functions = [
205+
_get_arq_function(func) for func in settings_cls.functions
206+
]
207+
if hasattr(settings_cls, "cron_jobs"):
208+
settings_cls.cron_jobs = [
209+
_get_arq_cron_job(cron_job) for cron_job in settings_cls.cron_jobs
210+
]
211+
212+
if "functions" in kwargs:
213+
kwargs["functions"] = [
214+
_get_arq_function(func) for func in kwargs["functions"]
215+
]
216+
if "cron_jobs" in kwargs:
217+
kwargs["cron_jobs"] = [
218+
_get_arq_cron_job(cron_job) for cron_job in kwargs["cron_jobs"]
219+
]
208220

209221
return old_create_worker(*args, **kwargs)
210222

tests/integrations/arq/test_arq.py

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,21 @@ def info(self, section):
4040

4141
@pytest.fixture
4242
def init_arq(sentry_init):
43-
def inner(functions_=None, cron_jobs_=None, allow_abort_jobs_=False):
44-
functions_ = functions_ or []
45-
cron_jobs_ = cron_jobs_ or []
43+
def inner(
44+
cls_functions=None,
45+
cls_cron_jobs=None,
46+
kw_functions=None,
47+
kw_cron_jobs=None,
48+
allow_abort_jobs_=False,
49+
):
50+
cls_functions = cls_functions or []
51+
cls_cron_jobs = cls_cron_jobs or []
52+
53+
kwargs = {}
54+
if kw_functions is not None:
55+
kwargs["functions"] = kw_functions
56+
if kw_cron_jobs is not None:
57+
kwargs["cron_jobs"] = kw_cron_jobs
4658

4759
sentry_init(
4860
integrations=[ArqIntegration()],
@@ -55,12 +67,17 @@ def inner(functions_=None, cron_jobs_=None, allow_abort_jobs_=False):
5567
pool = ArqRedis(pool_or_conn=server.connection_pool)
5668

5769
class WorkerSettings:
58-
functions = functions_
59-
cron_jobs = cron_jobs_
70+
functions = cls_functions
71+
cron_jobs = cls_cron_jobs
6072
redis_pool = pool
6173
allow_abort_jobs = allow_abort_jobs_
6274

63-
worker = arq.worker.create_worker(WorkerSettings)
75+
if not WorkerSettings.functions:
76+
del WorkerSettings.functions
77+
if not WorkerSettings.cron_jobs:
78+
del WorkerSettings.cron_jobs
79+
80+
worker = arq.worker.create_worker(WorkerSettings, **kwargs)
6481

6582
return pool, worker
6683

@@ -119,9 +136,12 @@ async def retry_job(ctx):
119136
assert event["extra"]["arq-job"]["retry"] == 2
120137

121138

139+
@pytest.mark.parametrize(
140+
"source", [("cls_functions", "cls_cron_jobs"), ("kw_functions", "kw_cron_jobs")]
141+
)
122142
@pytest.mark.parametrize("job_fails", [True, False], ids=["error", "success"])
123143
@pytest.mark.asyncio
124-
async def test_job_transaction(capture_events, init_arq, job_fails):
144+
async def test_job_transaction(capture_events, init_arq, source, job_fails):
125145
async def division(_, a, b=0):
126146
return a / b
127147

@@ -132,7 +152,8 @@ async def division(_, a, b=0):
132152

133153
cron_job = cron(cron_func, minute=0, run_at_startup=True)
134154

135-
pool, worker = init_arq(functions_=[division], cron_jobs_=[cron_job])
155+
functions_key, cron_jobs_key = source
156+
pool, worker = init_arq(**{functions_key: [division], cron_jobs_key: [cron_job]})
136157

137158
events = capture_events()
138159

@@ -192,12 +213,13 @@ async def division(_, a, b=0):
192213
assert cron_extra["retry"] == 1
193214

194215

216+
@pytest.mark.parametrize("source", ["cls_functions", "kw_functions"])
195217
@pytest.mark.asyncio
196-
async def test_enqueue_job(capture_events, init_arq):
218+
async def test_enqueue_job(capture_events, init_arq, source):
197219
async def dummy_job(_):
198220
pass
199221

200-
pool, _ = init_arq([dummy_job])
222+
pool, _ = init_arq(**{source: [dummy_job]})
201223

202224
events = capture_events()
203225

0 commit comments

Comments
 (0)