Le duo Celery + Flower

Flower n'est utile qu'avec Celery : il s'y branche en lisant les événements qu'envoient les workers, et en interrogeant le broker. Si tu n'as pas encore lu la fiche Celery, commence par là — Flower sans Celery derrière, c'est juste une UI vide.

À quoi ça sert

Une fois Celery en place, deux questions reviennent en boucle : « ma tâche est-elle passée ? », « pourquoi ça met 30 minutes à dépiler ? ». Sans UI, tu en es réduit à lire des logs de workers et à inspecter Redis/RabbitMQ à la main. Flower te donne :

  • Liste des workers connectés en direct, avec leur statut, leur charge, et les queues qu'ils écoutent.
  • Liste des tâches récentes, filtrables par état (succès, erreur, en cours, retry) et par nom.
  • Détail d'une tâche — arguments, traceback complet en cas d'erreur, timing, worker qui l'a exécutée.
  • Graphes — tâches par seconde, durée moyenne, répartition par queue.
  • Actions — relancer une tâche, l'annuler, redémarrer un worker, changer la concurrence à chaud.
En une phrase

Flower = la fenêtre par laquelle tu regardes tes workers Celery travailler en temps réel — et où tu cliques pour comprendre ce qui a foiré.

Pas un outil de prod sans auth

Par défaut, Flower n'a aucune authentification : si tu l'exposes publiquement, n'importe qui voit tes tâches (et donc potentiellement des données sensibles dans les arguments). Mets toujours une auth basique (--basic-auth=user:pwd) ou place-le derrière un reverse proxy authentifié.

Un exemple d'usage

Tu as l'API + worker de la fiche Celery qui tournent. Tu lances Flower à côté et tu ouvres http://localhost:5555. Tu déclenches 5 fois la route /analyze depuis ton API : tu vois apparaître en direct 5 lignes dans Flower, avec :

  • le nom de la tâche (tasks.analyze_image) ;
  • les arguments passés ;
  • l'état (STARTED puis SUCCESS ou FAILURE) ;
  • la durée d'exécution ;
  • le worker qui l'a traitée.

Si l'une plante, tu cliques dessus et tu lis le traceback complet sans fouiller dans des logs. Tu peux la relancer en un clic.

How-to : démarrer avec Flower

  1. Installer Flower

    bash
    uv add flower

    Flower s'appuie sur le même tasks.py que tes workers : il a besoin de l'objet Celery pour se connecter au broker.

  2. Lancer Flower

    bash
    uv run celery -A tasks flower --port=5555

    Ouvre http://localhost:5555. La page d'accueil liste les workers connectés. Si elle est vide, vérifie qu'au moins un worker tourne (cf. fiche Celery) et que Flower utilise bien la même URL de broker.

  3. Activer le suivi des tâches

    Pour que Flower voie le détail de chaque tâche (états, durées), les workers doivent émettre les événements. Active-le au lancement :

    bash
    celery -A tasks worker --loglevel=info -E

    -E active --task-events. Sans ça, Flower ne voit que les workers, pas les tâches individuelles.

  4. Mettre une auth basique

    bash
    celery -A tasks flower \
      --port=5555 \
      --basic-auth=admin:monsecret

    Chaque accès demandera un login HTTP basic. Pour quelque chose de plus sérieux (OAuth GitHub/Google), regarde --auth.

  5. Avec docker-compose

    En vrai, Flower vit à côté de l'API et du worker dans le même docker-compose.yml. Tu réutilises la même image Python, juste la commande change :

    yaml
    services:
      redis:
        image: redis:7
        ports: ["6379:6379"]
    
      api:
        build: .
        command: uvicorn main:api --host 0.0.0.0
        ports: ["8000:8000"]
        depends_on: [redis]
    
      worker:
        build: .
        command: celery -A tasks worker -l info -E
        depends_on: [redis]
    
      flower:
        build: .
        command: celery -A tasks flower --port=5555 --basic-auth=admin:monsecret
        ports: ["5555:5555"]
        depends_on: [redis, worker]
  6. Explorer l'UI

    Onglets clés :

    • Dashboard — workers connectés, statut, charge.
    • Tasks — historique des tâches récentes, filtrable par état et par nom. Clic sur une ligne → détail + traceback.
    • Broker — état des queues (longueur, consommateurs).
    • Monitor — graphes temps réel (tâches/seconde, succès, échecs).
    Persistance

    Par défaut, Flower garde l'historique des tâches en mémoire : un redémarrage et tout disparaît. Pour persister, ajoute --persistent=True --db=/data/flower.db et monte un volume sur /data.

Aide-mémoire

CLI
celery -A tasks flower
celery -A tasks flower --port=5555 --basic-auth=admin:pwd
celery -A tasks flower --persistent=True --db=/data/flower.db
celery -A tasks flower --broker=redis://other-host:6379/0
API REST de Flower
# Lister les workers
curl http://localhost:5555/api/workers

# Détail d'une tâche
curl http://localhost:5555/api/task/info/<task_id>

# Lancer une tâche depuis l'extérieur
curl -X POST http://localhost:5555/api/task/async-apply/tasks.add \
  -d '{"args":[1,2]}'

Flower et le reste de l'écosystème

  • Celery — le compagnon indissociable. Voir l'encart en haut de page.
  • Redis / RabbitMQ — Flower lit l'état du broker (longueur des queues, consommateurs). Aucun changement côté broker.
  • Prometheus + Grafana — Flower expose /metrics au format Prometheus depuis la version 2.0, donc tu peux aussi tracer ses chiffres dans un dashboard Grafana à côté de tes autres services.
  • Docker / Kubernetes — un seul service à ajouter, qui réutilise l'image de l'app. Sur K8s, expose-le derrière une Ingress avec auth.

Pour aller plus loin