def app_with_scout(config=None): """ Context manager that configures a Dramatiq app with Scout middleware installed. """ # Enable Scout by default in tests. if config is None: config = {"monitor": True} # Disable running the agent. config["core_agent_launch"] = False broker = StubBroker() broker.emit_after("process_boot") dramatiq.set_broker(broker) @dramatiq.actor(max_retries=0) def hello(): return "Hello World!" @dramatiq.actor(max_retries=0) def fail(): raise ValueError("BØØM!") # non-ASCII worker = dramatiq.Worker(broker, worker_timeout=0) # Setup according to https://docs.scoutapm.com/#dramatiq Config.set(**config) broker.add_middleware(ScoutMiddleware(), before=broker.middleware[0].__class__) worker.start() App = namedtuple("App", ["broker", "worker", "hello", "fail"]) try: yield App(broker=broker, worker=worker, hello=hello, fail=fail) finally: worker.stop() # Reset Scout configuration. Config.reset_all()
class InitDB(dramatiq.Middleware): def before_worker_boot(self, broker, worker): async def run(): from . import db await db.db.set_bind(db.CONNECTION_STR) loop.run_until_complete(run()) def before_worker_shutdown(self, broker, worker): shutdown.set() MIDDLEWARE = [ m() for m in (AgeLimit, ShutdownNotifications, Callbacks, Pipelines, Retries) ] if TEST: broker = StubBroker(middleware=MIDDLEWARE) broker.emit_after("process_boot") else: broker = RedisBroker( connection_pool=redis.ConnectionPool.from_url(REDIS_HOST), middleware=MIDDLEWARE) broker.add_middleware(InitDB()) dramatiq.set_broker(broker)
# Setup backends result_backend = ResultStubBackend() rate_limits_backend = RateLimitsStubBackend() # Setup brokers broker = StubBroker() else: logger.info("Setup redis broker") # Setup backends result_backend = ResultRedisBackend(url=settings.RESULT_REDIS_URL) rate_limits_backend = RateLimitsRedisBackend( url=settings.RATE_LIMITS_REDIS_URL) # Setup brokers broker = RedisBroker(url=settings.BROKER_REDIS_URL) results = Results(backend=result_backend) broker.add_middleware(results) if settings.PROMETHEUS_METRICS_SERVER_ENABLE: broker.add_middleware( Prometheus( http_host=settings.PROMETHEUS_METRICS_LISTEN_HOST, http_port=settings.PROMETHEUS_METRICS_LISTEN_PORT, )) dramatiq.set_broker(broker=broker) DISTRIBUTED_MUTEX_REPORT = ConcurrentRateLimiter(rate_limits_backend, "distributed-mutex-report", limit=1) bot = telegram.Bot(token=settings.TELEGRAM_TOKEN)