Entérate de los errores de tus flows
Crear flujos en Power Automate es rápido y fácil. En unos minutos, podemos tener una automatización que nos ahorre tiempo para realizar otras tareas. Pero, ¿y si el flujo falla? Muchas veces nos conectamos a sistemas de terceros sobre los que no tenemos control y que pueden hacer que nuestra automatización falle. ¿Hemos preparado el flujo para actuar sobre ese fallo? ¿Nos vamos a enterar si algo falla?
Los propietarios de flujos Power Automate reciben un resumen semanal de los flujos que les han fallado, pero esta información es reactiva y debemos ser capaces de, o de implementar una alternativa al error o al menos recibir una alerta cuando se produzca el error para estar al tanto.
Para ello existen varias prácticas para el manejo de errores, desde un nivel simple hasta algo más avanzado, dependiendo de lo que estemos buscando o necesitemos.
Nivel Básico — Configure Run After
Una manera sencilla de implementar un control de errores es usar la opción Configure run after dentro de las acciones.
Esto te permite configurar cuándo debe ejecutarse una acción en función del estado de la acción anterior.
Por ejemplo, aquí tenemos un flujo donde vamos a ser notificados tanto si se ejecuta correctamente (opcional) como si se produce un fallo en la acción Get lists.
Podemos conseguir esto haciendo click en los 3 puntos de la acción Send notification by mail (esquina superior derecha) y seleccionar Configure Run after:
Se mostrará la acción previa y de forma predeterminada tendrá marcada la opción is successful, de ahi que los flujos por defecto ejecuten sus acciones de manera secuencial hasta que una de ellas falla, que es cuando el flujo terminará abruptamente.
Pero también podemos configurarlo para que se ejecute cuando las acción anterior falle, se omita o de un timeout.
En nuestro ejemplo, solo queremos que este correo se envie cuando la acción anterior haya fallado, así que nos aseguramos de que solo se haya seleccionado la opción has failed:
Al hacer clic en Done, veremos que la rama que une ambas acciones termina en color rojo, confirmando que hay una acción Run after configurada.
La otra acción de correo electrónico todavía usa la configuración predeterminada, es decir, se ejecutará después de que la acción anterior sea correcta:
Ahora cuando se produzca un fallo en la acción de Get lists recibiremos un correo y estaremos notificados al instante:
Pero aún así, el flujo quedará en estado de fallo, con lo cual seremos alertados semanalmente con la notificación automática de Power Platform y es mas, se suspenderá automáticamente pasado un tiempo.
Para evitar esto, podemos agregar una acción Terminate despues de la notificación del error y así forzar a terminar el flujo con un estado OK.
Cuando vuelva a fallar veremos que ahora el flujo termina de manera satisfactoria, a pesar de tener un error dentro:
Avanzado — Uso de Try-Catch
El control básico de errores mostrado anteriormente nos permite tomar decisiones después del error de una única acción. Pero, ¿cómo controlar el error de un proceso completo con varias acciones? ¿Cómo poder tener el detalle del error en la notificación por correo?
Para el manejo avanzado de errores, necesitamos modificar un poco nuestro flujo anterior antes de poder profundizar en él. Esto se debe a que esta característica solo funciona en acciones agrupadas en algún tipo de contenedor como Scope, Condition, Apply to Each or Do Until. En este ejemplo, usaremos Scope.
Agrupación de acciones
Como mencioné antes, necesitamos colocar nuestro proceso (conjunto de acciones) en un contenedor, para lo cual usamos un Scope: uno para las acciones Try y el otro para las acciones Catch. Este scope Catch se configurará con run after y así si una acción de nuestro proceso incluida en el scope Try falla, controlaremos el error aplicando una lógica alternativa y/o notificándolo.
result() expression
Para profundizar en los errores que pueden ocurrir en nuestro scope Try, necesitamos hacer uso de la expresión result().
Por ejemplo, si en nuestro Catch ponemos esa expresión en una acción Compose y establecemos la condición Run after de esa acción para que se ejecute cuando la acción anterior, ahora el scope Try ha fallado, veremos el resultado de esta expresión:
Como podemos ver, la expresión te mostrará los detalles de cada acción dentro del contenedor. Ahora, lo interesante de estos detalles es que podemos ver qué la acción ha fallado y el mensaje de error completo.
Procesando el resultado
Ahora que sabemos cómo extraer los detalles del error de una acción, debemos procesarlo correctamente. Podemos tener múltiples acciones dentro del Try, por lo tanto, múltiples resultados en la expresión result(). Por esta razón, necesitamos agregar un Apply to each que recorrerá los detalles de cada acción. La salida para usar dentro de Apply to each es la misma que acabamos de ver en el ejemplo anterior usando Compose.
Dentro del Apply to each, podemos juntar toda la información del error. Pero dado que la expresión result() recorrerá cada acción, todas las acciones correctas también se procesarán, así que nos interesará excluirlas.
Podemos hacer esto agregando una condición que verificará si el atributo de estado del resultado es igual a Failed:
items(‘Apply_to_each_Try_result’)?[‘status’]
Cuando ponemos esto en una condición verificará si el valor de la expresión es igual a failed:
En este ejemplo, vamos a querer el nombre de la acción y el mensaje de error. Debido a que es posible que se produzcan varios errores, agregaremos los mensaje de error a una variable, para poder usar más adelante en un correo electrónico.
Para esto, necesitamos inicializar una acción de variable String al principio del flujo y una acción Append to string dentro de la rama If Yes de la condición que acabamos de configurar.
replace(items(‘Apply_to_each_Try_result’)?[‘name’],’_’,’ ‘)
Mensaje de error
Con esta expresión extraeremos el detalle del error de la acción:
items(‘Apply_to_each_Try_result’)?[‘error’]?[‘message’]
Esto lo podemos maquillar con un poco de HTML para que luego se vea más amigable en el correo:
Información del flujo
También podemos usar la función Workflow() para recuperar información del flujo como el nombre y el id del entorno.
Agregamos entonces una acción Parse JSON que convertirá el resultado de la función Workflow() en un formato más fácil de usar.
Esto nos da acceso a los datos del flujo de trabajo pero no el nombre del entorno.
Para tener este dato, debemos recuperar la información para todos los entornos (List My Environments).
Y luego filtramos la fila deseada de la lista de entornos partiendo del id que obtuvimos con la expresión workflow():
URL de la ejecución con error del flujo
Algo muy útil será incluir en la notificación la url directa de la ejecución, algo que podremos lograr con esta expresión y los datos anteriormente recopilados:
concat(‘https://make.powerautomate.com/environments/', body(‘ParseJSONflowinfo’)?[‘tags’]?[‘environmentName’], ‘/flows/’, body(‘ParseJSONflowinfo’)?[‘name’], ‘/runs/’, body(‘ParseJSONflow_info’)?[‘run’]?[‘name’])
Notificación
Ahora podemos añadir toda esta información en un correo, teams, etc.
Por ejemplo:
Y listo, ahora cuando algo nos falle en nuestro flow recibiremos un correo con el detalle.
Plantilla
Podéis descargaros el flujo aquí descrito a modo de plantilla en mi repo de github:
Cómo siempre, muchas gracias por llegar hasta aquí.
Me voy de vacaciones 🏄