Alertas por errores en Business Central con Power Automate y telemetría - Business Central

Breaking

domingo, 6 de noviembre de 2022

Alertas por errores en Business Central con Power Automate y telemetría

Frecuentemente, como partner o como responsable del departamento de informática, puedes escuchar eso de: algo no funciona en Business Central.  Después de perder un tiempo, te das cuenta que esa cola de proyectos que se debía de haber programado, lleva tres días sin ejecutarse por un error.

No sería mejor, adelantarnos y que de alguna manera, pudieramos recibir una alerta para detectar que las colas de proyecto se han parado.


¿Que son las colas de proyectos?

Las colas de proyecto es una herramienta disponible en Business Central para ejecutar procesos (reports y codeunits) desatendidamente en unos horarios predeterminados.  Lo habitual es que dichos procesos se ejecuten fuera del horario habitual de trabajo, bien por los recursos que consumen (facturación automática, generación de facturas por EDI,...) bien por que solamente con que se ejecuten una vez al día sería suficiente (actualización del tipo de cambio, descargar las reservas de un Channel manager,...)



En una cola de proyecto, debemos definir:

El tipo de objeto a ejecutar:  Codeunit o Report

El ID del objeto a ejecutar: El número de la codeunit o del report

Primera hora de inicio:  A partir de cuando se tendrá que ejecutar.

Periodicidad:  Cuando se tendrá que ejecutar y a qué hora.

Una vez configurada, hay que marcar la cola de proyecto como "Preparada":


Eso significará, que cuando llegue la hora programa, se ejecutará.

El problema puede venir, si en algún momento ese proceso nos da un error.  Dado que se ha ejecutado desatendidamente, no veremos que realmente no ha finalizado correctamente.  Solamente queda una marca indicando "Error" pero no avisa a nadie.



Eso puede llevarnos a unos problemas como por ejemplo que estemos facturando con un tipo de cambio que no está actualizado, o que por ejemplo si fuesemos un hotel y desde Booking nos han realizado una reserva, no nos hemos enterado puesto que no se han descargado correctamente.

Telemetría

La telemetría de Business Central ha llegado para ayudarnos en estas tareas.  En un post anterior (ver aquí) os indicaba como poder conectar Business Central a un Azure Application Insight y visualizar los datos en un Power BI.  Esto está fenomenal, pero claro o tenemos un panel en nuestra oficina al estilo de la NASA para controlar nuestros sistemas:



O utilizamos las alertas.

En esta documentación oficial de Microsoft (link) podemos encontrar todos los eventos que genera la telemetría de Business Central.  Es importante saber que se generan, los utilices tú o no, generarse se están generando.

Hay muchos eventos:  Accesos con error, accesos satisfactorios, borrados de empresas, ... pero hoy nos vamos a centrar en el error cuando una cola de proyectos falla: AL0000HE7

Puedes ver la documentación oficial aquí: AL0000HE7

Si quieres utilizarlos, tienes que crearte un recurso de Azure Application Insight (en tu tenant, no tiene que ser en el tenant del cliente), como explicaba en el anterior post, y obtener la cadena de conexión:



Con esa cadena de conexión, vas al admin de Business Central del entorno que quieres controlar y la copias en el sitio correspondiente:



NOTA: La instancia del servidor se reinicializa cuando instalas la cadena de conexión, por lo que ten especial cuidado de hacerlo cuando no esten trabajando en el sistema.


Probando que la telemetría llega.

Ya está configurado, ahora solamente nos queda probar que realmente la telemetría está llegando a nuestro Application Insights.

Para ello seleccionaremos en el panel lateral de Azure Application Insights, la opción "Registros" y aquí podemos hacer consultas en lenguaje KQL.  Es verdad, que no es un lenguaje conocido pero es una variación del SQL.  (ver documentación aquí ).  Pese a todo, Microsoft nos suministra ya una serie de ejemplos de consultas que podemos utilizar en Github (ver aquí)

En especial, para el caso que nos ocupa, tenemos una consulta ya definida en la que nos muestra como capturar los errores de las colas de proyectos:

https://github.com/microsoft/BCTech/blob/master/samples/AppInsights/Alerts/AlertingKQLSamples/JobQueueFailures.kql

Por tanto, ya podemos probar la consulta en Application Insights:


La consulta en cuestión es la siguiente:

traces

| where timestamp > ago(1d) // adjust as needed

    and customDimensions.eventId == 'AL0000HE7'

| project timestamp

, aadTenantId = customDimensions.aadTenantId

, environmentName = customDimensions.environmentName

, environmentType = customDimensions.environmentType

, alJobQueueId = customDimensions.alJobQueueId

, alJobQueueObjectId = customDimensions.alJobQueueObjectId

, alJobQueueObjectType = customDimensions.alJobQueueObjectType

, alJobQueueStatus = customDimensions.alJobQueueStatus

, alJobQueueExecutionTimeInMs = customDimensions.alJobQueueExecutionTimeInMs

, alJobQueueStacktrace = customDimensions.alJobQueueStacktrace


Una vez probada, comprobamos en la parte inferior que efectivamente ha habido errores en nuestros tenants.  Hemos ganado que ahora, podemos comprobar todos desde el mismo sitio, pero seguimos teniendo un problema de tener que venir a mirar aquí.

Creando alertas en Power Automate

Es posible crear alertas desde el propio Application Insights como nos explica en este blog Stefano Demiliani (ver blog) pero tiene coste en Azure por cada alerta, por lo que yo voy a generarlo con Power Automate, que tendrá que no tiene coste asociado (salvo el del propio Power Automate y Azure Application Insights.  Hay que decir, que esto mismo se puede programar en Logic Apps.

Lo primero que debemos hacer es crear un flujo programado.  Es decir, que se ejecute a unos determinados momentos.  La periodicidad será en función de la criticidad de las colas de proyecto que tengamos.  Supongamos que lo programamos para que el flujo se ejecute cada hora.


Añadimos un paso del conector de "Application Insights" - Ejecutar consulta.  La primera vez, necesitarás la conexión a la API del conector, que te pedirá: Nombre, ID Aplicación y Clave API.  El nombre será el que tu quieras y los otros dos parametros los obtendremos del recurso "Application Insight":


  

La clave API generada, solamente la podrás ver una vez, así toma nota de ella.

Una vez que tenemos la conexión en Power Automate, nos pedirá la consulta a ejecutar.  Es decir, la misma que hemos ejecutado en el Application Insight, la pondremos aquí para que se ejecute con la recurrencia indicada.

El siguiente paso será poner una condición en el flujo, mediante el cual decidiremos si la condición nos ha devuelto algo o no.  Esto lo haremos con la expresión:

length(outputs('Ejecutar_la_consulta_de_Analytics')?['body/value'])

Es decir, comprueba si la longitud de la consulta anterior es mayor que cero:


Si es cero, entonces el flujo se acaba.

En caso de que sea mayor que cero, significa que nos ha devuelto algún error, por lo que con el conector de datos, generamos una tabla HTML.  Podemos generar un CSV, un JSON, etc, por si lo que queréis es crear un fichero, pero yo en este caso quiero enviar un email, por lo que una tabla HTML me viene fenomenal.

El valor que recibira el conector de datos, será la salida de la consulta.  El conector de correo electrónico tendrá como contenido dinámico en el body el valor devuelto por la generación de la tabla HTML:



Con esto, tendrías terminado el flujo y tendrías un sistema de alertas estupendo para comprobar que todo está en orden.

Al probarlo, si se han recibido errores, te llegará un email como este:




Si lo quieres ver en marcha, puedes verlo en mi canal de Youtube:


Si tienes cualquier duda, puedes preguntarlo en los comentarios.  

Espero que te ayude.


No hay comentarios: