import traceback from typing import Any from rq import Queue from sentry_sdk import capture_exception import config from worker import conn from utils.reporting.worker_logger import WorkerLogger class BaseWorker: """ BaseWorker Provides implementation of queue workers Needs to be inherited by another worker and perform method should store business logic of application should be called like `ExampleWorker().perform_async(pr.id, 'hello_world')` """ worker_name: str priority_queue = "default" result_ttl = 0 failure_ttl = 0 retry = 0 __queue = Queue(priority_queue, connection=conn) logger: WorkerLogger = WorkerLogger() def __init__(self): self.worker_name = self.__class__.__name__ def perform_async(self, *args, timeout=None, depends_on=None, retry=None) -> Any: if config.runtime_config().TESTING: return return self.__queue.enqueue_call( func=self.perform, args=args, result_ttl=self.result_ttl, failure_ttl=self.failure_ttl, retry=retry, description=self.worker_name, depends_on=depends_on, timeout=timeout or -1, ) def execute(self, *args): raise NotImplementedError("Please Implement this method") def should_log_exceptions(self): return False def perform(self, *args): try: self.execute(*args) except BaseException as e: if self.should_log_exceptions(): self.logger.error(f"{self.worker_name} Worker Error", f"{e}\n{traceback.format_exc()}") capture_exception(e)