Siguiendo en el hilo del artículo anterior me enfocare en este post en una función importante que generalmente puede costar un poco de trabajar y es conocer en qué estado se encuentran las tareas que ejecutaste en background, ya que como explicaba anteriormente esta porcion de codigo queda ejecutándose en un servicio y como todo código no está exento de que falle, por ello compartiré algunas herramientas que me han servido para poder consultar el estado de estas tareas en real-time

Por qué Monitorear?

Poder monitorear un servicio en producción será el mayor  y el único feedback que se podrá tener cuando sucede un error, cuando algo falla lo primero que se debe consultar son los sistemas que están haciendo telemetría a nuestros sistemas de producción (y ojala sea un sistema automatizado y no una persona Ver Figura 1) ya que son estos lo que facilitaran encontrar realmente que paso

Figura 1: Comic el Monitoreo manual se hace imposible

Cuando se ejecutan tareas en segundo plano esto es un paradigma diferente a la ejecución síncrona que se realiza convencionalmente Ver Figura 2 por ello si algo falla en tareas en segundo plano puede ser difícil detectar que paso si no se tiene un sistema que esté recolectando información sobre el estado estos sistemas, no solo haciendo error tracking si no también APM, una analogía bastante válida es una que leía en un artículo donde se decía que lanzar una nave espacial sin utilizar telemetría, es como volar a ciegas  por ello hablaremos de 3 herramientas fundamentales que facilitan esta labor

Figura 2: Entorno de ejecución convencional vs entorno de ejecución asíncrono

Herramientas

Flower

Es una herramienta para realizar monitoreo de las tareas de celery, es una herramienta web con una amplia red de características y podría decirse que es la herramienta de monitoreo oficial,  para instalarla usare poetry y el proyecto que utilice en el artículo anterior

poetry add flower

ahora para ejecutar flower me ubico en el proyecto donde ejecuto el worker y ejecuto el siguiente comando

poetry run celery flower --port=5566 

Esto levantará un servicio en el cual al ingresar por el puerto 5566 veré la siguiente interfaz

Figura 3 : interfaz gráfica de flower con tareas recibidas

anteriormente puse a ejecutar 4 tareas y para que no se ejecutarán tan rápido puse una espera de tiempo de 1 minuto, ya con esto se puede ver los argumentos que recibe la tarea, a continuación mostrare el codigo que ejecuta esta tarea

@app.task(name="show_info_excel")
def show_info_excel(location: str):
    workbook_with_data = load_workbook(filename=location, data_only=True)
    first_sheet = workbook_with_data.sheetnames[0]
    sheet_range = workbook_with_data[first_sheet]
    time.sleep(60)
    for row_cell in sheet_range.iter_rows(min_row=2):
        user_info = " "
        for cell in row_cell:
            user_info = user_info + str(cell.value) + " "
        celery_log.info(f"Info {user_info}")
    return "OK"

en este código se puede ver  que recibe un parámetro string , esto se aprecia igualmente en la Figura 4, también se tiene información del estado de la tarea para saber si ya esta en ejecución , no la tomo ningun woker o si se generó algún fallo. Esta herramienta como se pudo apreciar es muy sencilla de implementar es fácil de entender y permite tener una visión general de lo que esta pasando en background, a continuación en al siguiente Figura se puede apreciar cuando todas las tareas se han ejecutado con éxito

Figura 4 : interfaz gráfica de flower con tareas exitosas

RabbitMQ Management Plugin

Esta herramienta es una interfaz web que facilita visualizar el estado de los nodos propios de RabbitMQ para poder monitorear las tareas, constantemente va recolectando información y va actualizando su estado en tiempo real, es una herramienta bastante completa sin embargo la principal desventaja es que solo funcionara cuando se use de broker RabbitMQ, para ejecutarla lo haré utilizando la imagen de docker

docker run -d -p 5672:5672 -p 8080:15672  --name rabbit-broker rabbitmq:3-management

ahora entro por el puerto 8080 en el navegador y me carga la siguiente interfaz

Figura 5: interfaz gráfica del plugin de monitoreo de RabbitMQ

En este caso ejecute 5 tareas se pueden apreciar en la estadísticas, esta herramienta funciona un nivel más abajo enfocado más en las colas y la comunicación con el broker que como tal en celery, por lo tanto hace su uso un poco más complejo

Clearly

Es una herramienta enfocada en recolectar información sobre celery en donde se guarda metadata relacionada con las tareas ejecutadas sus parámetros sus estados y demás información , una característica que la diferencia de las demás herramientas es que esta permite hacer debug ya que esta se divide en dos componentes, el primero es el recolector de la información llamado aquí server y el segundo es el cli por el cual brinda una gran cantidad de beneficios ya que este usa IPython lo cual brinda una consola totalmente interactiva, antes de ejecutarla es importante habilitar los eventos en celery worker utilizando el parámetro -E

poetry run celery -A celery_config worker -E  --loglevel=INFO

luego de ello ejecutare el servidor utilizando docker

sudo docker run --rm --name clearly-server -p 12223:12223       rsalmei/clearly server amqp://guest@localhost// --backend redis://localhost

después de ejecutar el comando el servidor se empezará  ejecutar como se aprecia a continuación

Figura 6: clearly server en ejecución

ahora ejecutare el cliente el cual permite hacer el debug

sudo docker run --rm -ti --name clearly-client    rsalmei/clearly client localhost 12223

el cliente es una consola interactiva como se puede ver en la siguiente Figura

Figura 7:  Opciones de configuración para clearly client

esta herramienta está muy interesante ya que se puede jugar con ella por ejemplo en el siguiente caso se pueden ver las tareas exitosas con los argumentos que se recibieron

Figura 8: Tareas exitosas en el cliente de clearly

existen algunas métricas que se pueden consultar

Figura 9: Métricas de clearly

esta herramienta como se pudo observar es muy interesante, pueden encontrar más comandos en su documentación oficial , su uso como pudieron apreciar se enfoca más que nada como herramienta de debug, igualmente podría usarse de manera complementaria con las herramientas mencionadas anteriormente

Conclusión

Al ejecutar tareas en background el paradigma cambia un poco (como mencionaba al principio del artículo) ya que no se tiene una respuesta automática a nivel técnico, para el usuario es transparente pues para él la respuesta si es instantánea, esto conlleva responsabilidades a la hora de monitorear estos procesos ya que un fallo en estas tareas ocurre de manera asíncrona por ello saber qué sucedió, cómo ocurrió y con qué parámetros fallo es importante para recrear estos errores y a futuro solucionarlos, por consiguiente estas herramientas brindan un gran opcion para cumplir este objetivo