def test_defer_task(self): expected_uuid = "00000000-0000-0000-0000-000000000000" request = self.factory.get("/foo") request.user = AnonymousUser() @shared_task def test_task(value): # pragma: no cover pass from celery.signals import before_task_publish, after_task_publish before_task_publish.connect(receivers.receiver_before_task_publish) after_task_publish.connect(receivers.receiver_after_task_publish) try: with structlog.threadlocal.tmp_bind(self.logger): self.logger.bind(request_id=expected_uuid) with self.assertLogs( logging.getLogger("django_structlog.celery.receivers"), logging.INFO ) as log_results: test_task.delay("foo") finally: before_task_publish.disconnect(receivers.receiver_before_task_publish) after_task_publish.disconnect(receivers.receiver_after_task_publish) self.assertEqual(1, len(log_results.records)) record = log_results.records[0] self.assertEqual("task_enqueued", record.msg["event"]) self.assertEqual("INFO", record.levelname) self.assertIn("child_task_id", record.msg) self.assertEqual(expected_uuid, record.msg["request_id"])
def run_worker(**kwargs): after_task_publish.disconnect(run_worker) worker = celery.Worker(concurrency=1, pool_cls='solo', use_eventloop=False, prefetch_multiplier=1, quiet=True, without_heartbeat=True) @task_postrun.connect def stop_worker_soon(**kwargs): task_postrun.disconnect(stop_worker_soon) if hasattr(worker.consumer, '_pending_operations'): # Celery 4.x def stop_worker(): # avoiding AttributeError that makes tests noisy worker.consumer.connection.drain_events = mock.Mock() worker.stop() # worker must be stopped not earlier than # data exchange with RabbitMQ is completed worker.consumer._pending_operations.insert(0, stop_worker) else: # Celery 3.x worker.stop() worker.start()
def disconnect_traced_handlers(self): if self._propagate: before_task_publish.disconnect(self._prepublish) after_task_publish.disconnect(self._postpublish) task_prerun.disconnect(self._start_span) task_failure.disconnect(self._tag_error) task_retry.disconnect(self._tag_retry) task_postrun.disconnect(self._finish_span) log.debug('Disconnected CeleryTracing signal handlers.')