def check_celery(app_configs, **kwargs): errors = [] if settings.CELERY_TASK_ALWAYS_EAGER: errors.append( weblate_check("weblate.E005", "Celery is configured in the eager mode", Error)) elif settings.CELERY_BROKER_URL == "memory://": errors.append( weblate_check( "weblate.E026", "Celery is configured to store queue in local memory")) else: if is_celery_queue_long(): errors.append( weblate_check( "weblate.E009", "The Celery tasks queue is too long, either the worker " "is not running, or is too slow.", )) result = ping.delay() try: pong = result.get(timeout=10, disable_sync_subtasks=False) # Check for outdated Celery running different version of configuration if ping() != pong: errors.append( weblate_check( "weblate.E034", "The Celery process is outdated, please restart it.", )) except TimeoutError: errors.append( weblate_check( "weblate.E019", "The Celery does not process tasks, or is too slow " "in processing them.", )) except NotImplementedError: errors.append( weblate_check( "weblate.E020", "The Celery is not configured to store results, " "CELERY_RESULT_BACKEND is probably not set.", )) heartbeat = cache.get("celery_heartbeat") loaded = cache.get("celery_loaded") now = time.time() if loaded and now - loaded > 60 and (not heartbeat or now - heartbeat > 600): errors.append( weblate_check( "weblate.C030", "The Celery beat scheduler is not executing periodic tasks " "in a timely manner.", )) return errors
def check_celery(app_configs, **kwargs): # Import this lazily to avoid evaluating settings too early from weblate.utils.tasks import ping errors = [] if settings.CELERY_TASK_ALWAYS_EAGER: errors.append( weblate_check("weblate.E005", "Celery is configured in the eager mode", Error)) elif settings.CELERY_BROKER_URL == "memory://": errors.append( weblate_check( "weblate.E026", "Celery is configured to store queue in local memory")) else: if is_celery_queue_long(): errors.append( weblate_check( "weblate.E009", "The Celery tasks queue is too long, either the worker " "is not running, or is too slow.", )) result = ping.delay() try: pong = result.get(timeout=10, disable_sync_subtasks=False) current = ping() # Check for outdated Celery running different version of configuration if current != pong: if pong is None: # Celery runs Weblate 4.0 or older differing = ["version"] else: differing = [ key for key, value in current.items() if key not in pong or value != pong[key] ] errors.append( weblate_check( "weblate.E034", "The Celery process is outdated or misconfigured." " Following items differ: {}".format( ", ".join(differing)), )) except TimeoutError: errors.append( weblate_check( "weblate.E019", "The Celery does not process tasks, or is too slow " "in processing them.", )) except NotImplementedError: errors.append( weblate_check( "weblate.E020", "The Celery is not configured to store results, " "CELERY_RESULT_BACKEND is probably not set.", )) heartbeat = cache.get("celery_heartbeat") loaded = cache.get("celery_loaded") now = time.time() if loaded and now - loaded > 60 and (not heartbeat or now - heartbeat > 600): errors.append( weblate_check( "weblate.C030", "The Celery beat scheduler is not executing periodic tasks " "in a timely manner.", )) return errors