Cómo usar Azure Logic Apps para crear una Alerta de Azure Monitor más Detallada
Un escenario común que observamos al trabajar con socios es la necesidad de crear alertas con más detalles en Azure. Actualmente, la alerta predeterminada que configura al establecer una Alerta de Azure Monitor se ve así:
Como socio que probablemente administra múltiples entornos de clientes, estas alertas predeterminadas no proporcionan suficiente información para poder identificar rápidamente qué inquilino es el que se ve afectado. Algunos datos que podrían incluirse en la alerta y que pueden ayudar con esto son:
Cliente afectado.
Suscripción del cliente afectado.
Recursos afectados.
Afortunadamente, hay varias soluciones alternativas para esto. El objetivo es transformar la alerta mencionada anteriormente en esta:
En esta publicación de blog, nos adentraremos en el proceso de crear alertas exhaustivas utilizando Azure Logic App. Nuestra discusión abarcará los siguientes puntos clave:
Establecimiento de los cimientos de Azure Logic Apps
Mejora de la profundidad de la información en sus alertas
Exploración de conectores notables de Azure Logic App
Una guía paso a paso a través de la configuración de la aplicación lógica
Es importante reconocer que uno de los aspectos destacados de Azure Logic Apps es la versatilidad que ofrece. Existen múltiples caminos para lograr resultados similares. Por lo tanto, este blog no solo sirve como una guía, sino también como una vía de inspiración.
Alentamos a todos los lectores a considerar no solo métodos para refinar los conceptos presentados, sino también a reflexionar sobre cómo estas ideas pueden integrarse sin problemas con diversos escenarios. Su enfoque innovador puede elevar aún más las capacidades de Azure Logic Apps.
Cómo configurar Azure Logic Apps
Existen dos modelos principales para configurar Azure Logic Apps:
Modelo 1: La alerta de Azure Monitor y los componentes de Logic App se almacenan en el inquilino del cliente.
Modelo 2: La alerta de Azure Monitor se ejecuta en el inquilino del cliente, y el componente de Azure Logic App se ejecuta en el lado del socio.
Model 1 - Azure Monitor alert and Logic App components are stored on the customer tenant
En este ejemplo, el socio gestiona a dos clientes a través de Azure Lighthouse; las alertas de Azure Monitor y los libros de jugadas (playbooks) se almacenan y ejecutan en el inquilino del cliente.
Consideraciones para este modelo:
El precio de ejecución de Logic App se cobra al cliente.
El cliente es responsable de los cargos asociados con las Alertas de Azure Monitor.
La supervisión tanto para el éxito como para el fallo requiere observación dentro del entorno del cliente.
Model 2 - Azure Monitor alert runs on the customer tenant, and the Azure Logic App Component runs on the partner side.
En el ejemplo anterior, el socio gestiona a dos clientes a través de Azure Lighthouse; las alertas de Azure Monitor se almacenan y gestionan en el inquilino del cliente. La Azure Logic App se almacena en el inquilino del socio. Se utilizará un webhook seguro o el tipo de acción de Azure Logic App para activar la Azure Logic App. Cabe destacar que, aunque es posible utilizar un webhook no seguro, no recomendamos esto, ya que no existe autenticación ni cifrado incorporados.
Consideraciones para este modelo:
El precio de ejecución de Logic App se cobra al socio.
El precio de las alertas de Azure Monitor se cobra al cliente.
Se utiliza un grupo de acciones que activa un webhook o una Azure Logic App.
El Esquema de Alerta Común (Common Alert Schema) estandariza el consumo de las notificaciones de alerta de Azure Monitor. Históricamente, los registros de actividad, las alertas de métricas y las alertas de registros tenían sus propias plantillas de correo electrónico y esquemas de webhook. El Esquema de Alerta Común proporciona un esquema estandarizado para todas las notificaciones de alerta.
El uso de un esquema estandarizado ayuda a minimizar el número de integraciones, simplificando la gestión y el mantenimiento de sus integraciones. El esquema común permite una experiencia de consumo de alertas más rica en el portal de Azure y en la aplicación móvil de Azure.
El Esquema de Alerta Común también proporcionará acceso a más información y la forma de obtener más información mediante otros conectores de Azure Logic App.
El Esquema de Alerta Común proporciona una estructura consistente para:
Plantillas de correo electrónico: Utilice la plantilla de correo electrónico detallada para diagnosticar problemas de un vistazo. Los enlaces incorporados a la instancia de alerta en el portal y al recurso afectado garantizan que pueda pasar rápidamente al proceso de remediación.
Estructura JSON: Utilice la estructura JSON consistente para construir integraciones para todos los tipos de alertas utilizando:
Azure Logic Apps
Azure Functions
Runbook de Azure Automation
Aqui esta un ejemplo del contenido de la Esquema de Alerta Común Common Alert Schema:
{
"schemaId": "azureMonitorCommonAlertSchema",
"data": {
"essentials": {
"alertId": "/subscriptions/<subscription ID>/providers/Microsoft.AlertsManagement/alerts/b9569717-bc32-442f-add5-83a997729330",
"alertRule": "WCUS-R2-Gen2",
"severity": "Sev3",
"signalType": "Metric",
"monitorCondition": "Resolved",
"monitoringService": "Platform",
"alertTargetIDs": [
"/subscriptions/<subscription ID>/resourcegroups/pipelinealertrg/providers/microsoft.compute/virtualmachines/wcus-r2-gen2"
],
"configurationItems": [
"wcus-r2-gen2"
],
"originAlertId": "3f2d4487-b0fc-4125-8bd5-7ad17384221e_PipeLineAlertRG_microsoft.insights_metricAlerts_WCUS-R2-Gen2_-117781227",
"firedDateTime": "2019-03-22T13:58:24.3713213Z",
"resolvedDateTime": "2019-03-22T14:03:16.2246313Z",
"description": "",
"essentialsVersion": "1.0",
"alertContextVersion": "1.0"
},
"alertContext": {
"properties": null,
"conditionType": "SingleResourceMultipleMetricCriteria",
"condition": {
"windowSize": "PT5M",
"allOf": [
{
"metricName": "Percentage CPU",
"metricNamespace": "Microsoft.Compute/virtualMachines",
"operator": "GreaterThan",
"threshold": "25",
"timeAggregation": "Average",
"dimensions": [
{
"name": "ResourceId",
"value": "3efad9dc-3d50-4eac-9c87-8b3fd6f97e4e"
}
],
"metricValue": 7.727
}
]
}
},
"customProperties": {
"Key1": "Value1",
"Key2": "Value2"
}
}
}
}
Utilizaremos el Esquema de Alerta Común con Azure Logic Apps en este escenario. El siguiente enlace proporciona más información sobre el Esquema de Alerta Común, incluidos detalles sobre los campos:
https://learn.microsoft.com/en-us/azure/azure-monitor/alerts/alerts-common-schema
Creando la Azure Logic App
La creación de la Azure Logic App consta de varios componentes: los conectores y la plantilla HTML.
Los Conectores y Acciones Correspondientes:
HTTP - HTTP
Azure Monitor Logs – Run Query and list results
·Variables – Initialize variable.
Variables – Set Variable
Data Operations – Create HTML Table
Data Operations – Parse JSON
Office 365 Outlook – Send Email (V2)
Control – Switch
HTTP Connector
El conector HTTP sirve como una herramienta valiosa para ejecutar llamadas a API, lo que le permite adquirir información adicional para complementar el contenido de la alerta. Por ejemplo, puede aprovecharlo para recuperar el nombre de la suscripción utilizando el ID de la suscripción o para obtener el nombre del inquilino utilizando el ID del inquilino.
Puede obtener más información sobre el conector aquí:
Call service endpoints by using HTTP or HTTPS - Azure Logic Apps | Microsoft Learn
Azure Monitor Log
El Conector de Registro de Azure Monitor se utiliza para tomar la Consulta de Búsqueda obtenida del Esquema de Alerta Común para realizar la misma consulta de Kusto. La consulta se realiza utilizando las acciones "Ejecutar consulta" y "Listar resultados".
Puede obtener más información sobre el Conector de Registro de Azure Monitor aquí:
Azure Monitor Logs - Connectors | Microsoft Learn
La acción utilizada es la siguiente:
Run query and list results
También existe la versión 2; sin embargo, siempre recomendamos proceder con precaución al usar algo en vista previa, ya que el SLA y el soporte son limitados. En nuestra experiencia, hemos visto que ciertas características se eliminan por completo durante la vista previa.
Variables
Las variables son una herramienta increíble en Azure Logic Apps. Puedes usarlas para crear tipos de datos como enteros, flotantes, booleanos, cadenas, matrices y objetos. Piensa en las variables como lo haces con las variables en la programación.
Después de crear una variable, puedes realizar tareas como:
Referenciar el valor de la variable en otro lugar.
Incrementar o disminuir la variable en un valor constante, también conocido como incrementar y decrementar.
Asignar un valor diferente a la variable.
Insertar o añadir el valor de la variable como el último elemento en una cadena o matriz.
Las variables existen y son globales solo dentro de la instancia del flujo de trabajo que las crea. También persisten a lo largo de cualquier iteración de bucle dentro de una instancia del flujo de trabajo. Al hacer referencia a una variable, utiliza el nombre de la variable como el token, no el nombre de la acción, que es la forma habitual de hacer referencia a las salidas de una acción.
En esta Azure Logic App, las variables se inicializarán y establecerán. Utiliza esto para almacenar el nombre de la suscripción, el ID, la ubicación del grupo de recursos del recurso afectado y mucho más. Utiliza estas variables para mantener la información que te gustaría incluir en un correo electrónico o que necesitarás usar nuevamente para futuras llamadas de API.
El siguiente enlace proporciona una descripción general de las variables:
Create variables to store and pass values - Azure Logic Apps | Microsoft Learn
Operaciones de Datos
Azure Logic Apps incluye varias acciones que se pueden utilizar para realizar operaciones de datos. Estas acciones incluyen:
Crear una cadena o un objeto JavaScript Object Notation (JSON) a partir de múltiples entradas que tienen diferentes tipos de datos. Luego puedes usar esta cadena como una entrada única en lugar de ingresar repetidamente las mismas entradas.
Crear tokens amigables para el usuario a partir de propiedades de un objeto JavaScript Object Notation (JSON) para que puedas usar esas propiedades fácilmente en tu flujo de trabajo.
Crear una tabla HTML o CSV a partir de una matriz.
Crear una matriz a partir de otra matriz en función de un filtro o condición especificados.
Crear una matriz en función de las propiedades especificadas para todos los elementos en otra matriz.
Crear una cadena a partir de todos los elementos en una matriz y separar esos elementos usando un carácter especificado.
Haz referencia a la siguiente documentación para obtener más detalles sobre las operaciones de datos:
Perform operations on data - Azure Logic Apps | Microsoft Learn
Para esta Azure Logic App, crearemos una tabla HTML a partir de los resultados obtenidos de la consulta Kusto.
Office 365 Outlook Connector
Con el conector de Office 365 Outlook, puedes enviar un correo electrónico utilizando el Send an email (V2)
Para usar este conector, necesitas una cuenta de Microsoft Office 365 para Outlook en la que inicies sesión con una cuenta de trabajo o escuela.
Puedes obtener más información sobre el conector de Office 365 aquí:
Connect to Office 365 Outlook - Azure Logic Apps | Microsoft Learn
Lo siguiente es una referencia para el conector:
Office 365 Outlook - Connectors | Microsoft Learn
Built-in Actions
Azure Logic Apps proporciona varias acciones integradas para estructurar y controlar las acciones en tu flujo de trabajo. Estas acciones incluyen:
Crea la Plantilla HTML:
El diseño de la alerta está impulsado por la Plantilla HTML que creas. Esta Plantilla HTML debe diseñarse para permitirte agregar detalles de la alerta y otras acciones que realices.
Aquí tienes un ejemplo de una Plantilla HTML que utilizamos en este ejemplo:
<!DOCTYPE html> <html> <style> .code-block { background-color: #FFFFFF; border: 1px solid #ddd; padding: 20px; border-radius: 4px; overflow-x: auto; } pre { margin: 0; } code { font-family: 'Courier New', monospace; font-size: 14px; } body { font-family: Arial, sans-serif; background-color: #ffffff; margin: 0; padding: 0; } .notification-table-header { width: auto; border-top: none; background: #1470AF; /* Updated color */ font-size: 11.0pt; color: white; font-weight: bold; margin-left: 10px; text-align: left; border: none; border-bottom: solid white 1.5pt; } .notification-table-text { margin-left: 5px; width: 70%; text-align: left; border: none; border-bottom: solid white 1.5pt; background: #EAEAEE; /* Updated color */ font-size: 12.0pt; height: 20.05pt; } .notification-card-footer span { font-size: 12.0pt; color: #7F7F7F; /* Updated color */ } .notification-card-footer p { vertical-align: baseline; } .notification-body { margin: 50px auto; width: 650px; border: 1px solid #000000; background-color: #ffffff; padding: 20px; } .notification-severity { background-color: #4D98A8; color: white; font-size: 16px; text-align: center; } .notification-table { margin-top: 20px; border-collapse: collapse; width: 100%; } .notification-table th, .notification-table td { padding: 8px; border: 1px solid #000; text-align: left; font-size: 12px; } .notification-table th { background-color: #00c5f1; color: white; font-weight: bold; } .expand-btn { display: inline-block; padding: 5px 10px; background-color: #f1f1f1; border: none; color: #000; text-align: center; text-decoration: none; cursor: pointer; margin-top: 20px; font-size: 14px; border-radius: 4px; } .expand-btn:hover { background-color: #ddd; } table.data-table { width: 100%; border-collapse: collapse; margin-top: 20px; } .data-table th, .data-table td { padding: 8px; border: 1px solid #000; text-align: left; } .data-table th { background-color: #1470AF; color: white; font-weight: bold; } </style> <div class="json-block"> <button id="copy-json-button" onclick="copyJsonToClipboard()">Copy JSON</button> <pre> <code class="language-json"> { <body style="background-color: #FFFFFF;"> <table style="width:100%;"> <tr> <td style="padding:0;"> <div align="center"> <table class="notification-body"> <tr style="border: 1px grey; border-top:none;"> <td> <p style='font-size:5.0pt;'> <span> </span> </p> <table style='width:590px;margin:0 auto;border-collapse:collapse;'> <tr style='height:20.05pt'> <td colspan="2" class="notification-table-header" style='width:100%; height:20.05pt'> <p style='text-align:center; font-size:16.0pt;'><b>Severity: [Insert Severity]</b><br /> </p> </td> </tr> <tr class="notification-card-footer"> <td colspan="2"> <p style='text-align:left;'><b>This is some notication Test</b></p> <p style='text-align:left;'>Alert Rule Triggered: <b> [Insert Alert Rule']</b></p> </td> </tr> <tr> <td class="notification-table-header"> <span> Customer Name: </span> </td> <td class="notification-table-text"> [Insert Customer Name']</td> </tr> <tr> <td class="notification-table-header"> <span> Subscription Name: </span> </td> <td class="notification-table-text"> [Insert Customer Subscription Name'] </td> </tr> <tr> <td class="notification-table-header"> <span> Subscription ID: </span> </td> <td class="notification-table-text"> [Insert Customer Subscription']</td> </tr> <tr> <td class="notification-table-header"> <span> Log Type:</span> </td> <td class="notification-table-text">[Insert Monitoring Service'] </td> </tr> <tr> <td class="notification-table-header"> <span> Fired Time:</span> </td> <td class="notification-table-text">[Insert Fired Time'] </td> </tr> <tr> <td class="notification-table-header"> <span> Message:</span> </td> <td class="notification-table-text"> [Insert Alert Description']</td> </tr> <tr> <td class="notification-table-header"> <span> Severity:</span> </td> <td class="notification-table-text">Severity Level: [Insert Severity Level]</td> </tr> <tr> <td class="notification-table-header"> <span> Link to Search Results:</span> </td> <td class="notification-table-text"> <a href= target="_blank"> <span style='font-size:12.0pt;color:blue;'>[Insert Link to Search Results]</span> </a> </td> </tr> <tr> <td class="notification-table-header"> <span> Link to Search Results API:</span> </td> <td class="notification-table-text"> <a href="@{body('Parse_JSON')?['LinkToSearchResultsAPI']}" target="_blank"> <span style='font-size:12.0pt;color:blue;'>[Insert Link to Searh Results API]</span> </a> </td> </tr> <tr> <td class="notification-table-header"> <span> Search Query:</span> </td> <td class="notification-table-text">[Insert Search Query Variable]</td> </tr> <tr class="notification-card-footer"> <td colspan="2"> <p style='text-indent:36.0pt;'> <span style='font-size:0.0pt;'> </span> </p> <p style='text-align:center;'> <span> </span> <br /> </p> </td> </tr> </table> </td> </tr> </table> </div> </td> </tr> </table> [Insert HTML Table],'<table>', '<table class="data-table">'] </body> </html>
Recorrido por la Azure Logic App:
Dividiremos estos pasos en fases, separando el flujo en etapas para facilitar las pruebas, especialmente cuando se utiliza un nuevo desencadenador o acción por primera vez.
Configura la Azure Logic App y el Desencadenador HTTP
en el portal de Azure, Crea una nueva Azure Logic App. En la barra de búsqueda en la parte superior de la página, ingresa "Logic App".
en la pagina de Logic App , selecione Add.
Selecciona la suscripción (Subscription) y el grupo de recursos (Resource group) para tu Azure Logic App.
Establece el nombre de la Azure Logic App. Para el "Tipo de plan" (Plan type), selecciona... Consumption.
Selecciona "Review + create" > "Create".
6. Selecciona "Go to resource" después de que se complete la implementación.
7. En la página del Diseñador de Lógica del App, elige "Cuando se recibe una solicitud HTTP".
8. Haz clic en "Usar carga de ejemplo para generar esquema".
9. Luego, haz clic en "Listo" o "Hecho".
A continuación, guarda la Azure Logic App. Después de guardarla, se generará una URL de HTTP Post. Deberías ver algo como esto:
10. Copia y guarda esta URL, la necesitarás cuando creemos el Grupo de Acciones que activará esta Azure Logic App.
Configura la Alerta de Azure Monitor y el Grupo de Acciones para las pruebas.
Por un momento, cambiemos nuestro enfoque de la Logic App y dirijamos nuestra atención hacia la configuración de la Alerta de Azure Monitor y el Grupo de Acciones correspondiente. Nuestra sugerencia es establecer una Alerta de Registro de Azure Monitor, diseñada para activarse de manera sencilla. Esta configuración sirve para fines de prueba y observación de los resultados derivados de la implementación del Esquema de Alerta Común.
Define la consulta de Kusto
Esta es la consulta Kusto que utilizamos para nuestras pruebas, se activa cuando un usuario no puede iniciar sesión en el Portal de Azure:
SigninLogs
| where AppDisplayName contains "Azure Portal"
| where ResultType in ("50126", "50020")
| extend OS = DeviceDetail.operatingSystem, Browser = DeviceDetail.browser
| extend StatusCode = tostring(Status.errorCode), StatusDetails = tostring(Status.additionalDetails)
| extend State = tostring(LocationDetails.state), City = tostring(LocationDetails.city)
| summarize StartTime = min(TimeGenerated),
EndTime = max(TimeGenerated),
IPAddresses = makeset(IPAddress)[0],
DistinctIPCount = dcount(IPAddress),
DeviceOS = makeset(OS)[0],
Browser = makeset(Browser)[0],
City = makeset(City)[0],
AttemptCount = count()
by UserDisplayName,
UserPrincipalName,
AppDisplayName,
ResultType,
ResultDescription,
StatusCode,
StatusDetails,
Location,
State,
UserId,
AADTenantId
| extend timestamp = StartTime, AccountCustomEntity = UserPrincipalName
| sort by AttemptCount
Crea el Grupo de Acciones:
En la sección "Básico", completa lo siguiente:
En el Portal de Azure, En la barra de búsqueda en la parte superior de la página, ingresa "Monitor" y haz clic en él cuando aparezca.
Haz clic en "Alertas".
Haz clic en "Grupos de Acción" (Action Groups).
Haz clic en "+ Crear".
En la sección "Información básica" (Basics), selecciona la Suscripción (Subscription), Grupo de recursos (Resource group), y Región según corresponda.
En la sección "Básico" (Basic), proporciona un nombre para el grupo de acción y el nombre para mostrar (display name).
Haz clic en la sección "Acciones" (Actions) y selecciona el tipo de alerta como "Logic App" / "Secure Webhook" / "Webhook". Elige "Webhook". Para entornos de producción, considera usar un "Secure Webhook" (Webhook seguro).
Establece un nombre.
Bajo la columna "Seleccionado" (Selected Column), haz clic en el icono del lápiz, lo que abrirá una ventana en el lado derecho.
Inserta la URI que obtuvimos del Disparador HTTP en la última fase.
11. Bajo la opción "Habilitar el Esquema de Alerta Común", selecciona "Sí".
12. Luego, haz clic en "Aceptar" o "Ok".
13. Haga Clic en Review + Create y haga clic en Create
Create the Alert Rule
Ahora que tenemos la Consulta de Kusto y el Grupo de Acciones, creemos la regla de alerta.
En este blog, no profundizaremos en el proceso de crear la Alerta de Azure Monitor. Sin embargo, los pasos esenciales son los siguientes:
Incluir la Consulta de Kusto: Al crear la regla de alerta, asegúrate de definir una Consulta de Kusto relevante que se utilizará para monitorear y filtrar los datos. Para fines de prueba, mantenlo simple.
Agregar el Grupo de Acciones: Asocia el Grupo de Acciones que desencadenará la lógica de la aplicación.
Completar los Detalles de la Regla de Alerta: Proporciona todos los detalles necesarios para la regla de alerta, incluido un nombre significativo, descripción, nivel de gravedad y otras configuraciones necesarias.
Para obtener orientación sobre cómo crear las Alertas de Azure Monitor, consulta el siguiente artículo:
Create Azure Monitor alert rules - Azure Monitor | Microsoft Learn
Configure the Rest of the Logic App.
Define the variables.
A continuación, inicializa y establece las variables que utilizarás para almacenar la información que deseas extraer del Esquema de Alerta Común. En este escenario, creamos las siguientes variables:
Recursos Afectados
ID de Suscripción del Cliente
Tiempo de Activación
Nombre del Cliente
Cuerpo del Correo Electrónico
Servicio de Monitoreo
Regla de Alerta
Severidad de la Alerta
Descripción de la Alerta
Nombre de la Suscripción del Cliente
Recurso Afectado
Este es un arreglo que se utilizará para llenar el ID de la Suscripción del Cliente.
Este arreglo se crea utilizando la siguiente expresión: split(triggerBody()?['data']?['essentials']?['alertTargetIDs'][0], '/') para dividir la cadena:
/subscriptions/SubscriptionID/resourcegroups/ResourceGroup/providers/microsoft.operationalinsights/workspaces/WorkspaceName
Expression Explained:
La expresión dada en la Lógica del App utiliza la función "split" para dividir una cadena basándose en un delimitador específico. Desglosemos la expresión paso a paso:
triggerBody(): Esta función recupera el objeto JSON completo desde el disparador de la Lógica del App. En este caso, parece que el disparador está recibiendo un objeto JSON.
?: Este es el operador de navegación segura, que permite que la expresión maneje con elegancia propiedades nulas o ausentes sin generar un error.
['data']: Esto accede a la propiedad "data" dentro del objeto JSON.
['essentials']: Esto accede a la propiedad "essentials" dentro del objeto "data".
['alertTargetIDs'][0]: Esto accede al primer elemento del array "alertTargetIDs" dentro del objeto "essentials". Se utiliza [0] para obtener el primer elemento del array.
Puedes obtener estos valores del array. Las siguientes tablas indicarán cuáles de ellos pueden ser ignorados.
Index | Value | Comments |
---|---|---|
[0] | Empty | Ignore |
[1] | “subscriptions” | Ignore |
[2] | SubsriptionID | Used to get the subscription id. |
[3] | “resourcegroups” | Ignore |
[4] | ResourceGroup | Used to get the resource group of the log analytics workspace that is queried in the alert rule. |
[5] | “providers” | Ignore |
[6] | “Microsoft.operationalinsights” | Ignore |
[7] | “workspace” | Ignore |
[8] | WorkspaceName | The name of the log analytics workspace that is queried in the alert rule. |
El siguiente artículo proporciona más información sobre split:
Customer Subscription ID
Esta variable se utiliza para almacenar el ID de la suscripción del cliente. Se obtiene utilizando la variable previamente definida Affected Resource.
variables('AffectedResource')[2]
Fired Time
Esta variable se utiliza para obtener la hora en que se activó la alerta. Este valor se obtiene utilizando la siguiente expresión de la Azure Logic App:
formatDateTime(triggerBody()?['data']?['essentials']?['firedDateTime'],'MMMM-dd, yyyy HH:mm:ss')
Expression Explained:
La expresión de la Azure Logic App proporcionada utiliza la función "formatDateTime" para dar formato a un valor de fecha y hora obtenido del contenido JSON. Desglosemos la expresión paso a paso:
`triggerBody()`: Esta función recupera todo el contenido JSON de la activación de la Azure Logic App. Parece que la activación está recibiendo un contenido JSON.
`?`: Este es el operador de navegación segura, que permite que la expresión maneje con elegancia propiedades nulas o faltantes sin generar un error.
`['data']`: Esto accede a la propiedad "data" dentro del contenido JSON.
`['essentials']`: Esto accede a la propiedad "essentials" dentro del objeto "data".
`['firedDateTime']`: Esto accede a la propiedad "firedDateTime" dentro del objeto "essentials".
El valor obtenido en este punto debería ser una cadena de fecha y hora en formato ISO 8601, como por ejemplo: "2023-07-12T05:27:38.6313357Z".
formatDateTime(..., 'MMMM-dd, yyyy HH:mm:ss'): Esta parte aplica la función "formatDateTime" a la cadena de fecha y hora obtenida. Formatea la fecha y la hora utilizando la cadena de formato personalizado.g 'MMMM-dd, yyyy HH:mm:ss'.
La cadena de formato personalizado utiliza los siguientes especificadores de formato:
MMMM: Nombre completo del mes (e.g., "July").
dd: Día del mes (2 dígitos, e.g., "12").
yyyy: Año (4 dígitos, e.g., "2023").
HH: Hora(Formato de 24 horas, 2 dígitos, e.g., "05").
mm: Minuto(2 dígitos, e.g., "27").
ss: Segundo(2 dígitos, e.g., "38").
La función "formatDateTime" convertirá la cadena de fecha y hora en formato ISO 8601 al formato especificado. Por ejemplo, si la cadena de fecha y hora de entrada es "2023-07-12T05:27:38.6313357Z", la fecha y hora formateada resultante será "12 de julio de 2023 05:27:38".
Para obtener detalles adicionales:
Para obtener más información sobre la función "formatDateTime", consulta la siguiente documentación:
formatDateTime - function reference
Customer Name
Esta variable se agrega manualmente con fines de demostración. La forma en que se llena esta variable puede ser manualmente o de manera dinámica utilizando código. Es importante destacar que el nombre del cliente no es lo mismo que el inquilino del cliente. Un cliente puede tener varios inquilinos.
Email Body
Este es un marcador de posición que más adelante se llenará con la plantilla HTML creada previamente.
Monitoring Service
Esta variable cumple un papel crucial en identificar el servicio o solución de monitorización responsable de generar la alerta. Su valor es fundamental para determinar los campos específicos presentes en el contexto de la alerta.
Dentro de esta Azure Logic App, aprovechamos esta variable como parte de un Control "Switch" (interruptor), lo que nos permite manejar eficazmente las alertas originadas en diversos servicios de monitorización. Como se mencionó anteriormente, el contexto de la alerta varía según el servicio o solución de monitorización que activó la alerta.
Para una comprensión más profunda del contexto de alerta de cada servicio o solución de monitorización, hemos preparado un artículo completo detallando sus respectivos componentes y atributos. Este artículo ayudará a los usuarios a comprender las particularidades asociadas con cada servicio de monitorización, permitiendo una mejor contextualización e interpretación de las alertas.
Common Alert Schema for Azure Monitor alerts - Azure Monitor | Microsoft Learn
Alert Rule
Esta variable se utiliza para almacenar la regla de alerta que activó la Azure Logic App.
Alert Severity
Esta variable se utiliza para almacenar la gravedad de la alerta asociada con la regla de alerta desencadenada.
Alert Description
Esta variable se utiliza para almacenar la descripción de la regla de alerta. Si se deja en blanco la descripción al crear la alerta de Azure Monitor, esta variable será una cadena vacía.
Nombre de la Suscripción del Cliente
Si ya tienes el ID de suscripción de Azure del cliente, puedes aprovechar una llamada de API para recuperar el nombre de la suscripción de Azure del cliente. Esto ofrece una manera conveniente de identificar rápidamente tanto el nombre de la suscripción del cliente como el ID de la suscripción del cliente afectada.
Las APIs pueden ofrecer información valiosa al proporcionar acceso a diversos tipos de información. Por ejemplo, puedes obtener el ID de inquilino (Tenant ID) y el nombre de inquilino (Tenant Name) asociados con la suscripción, lo cual resulta especialmente útil cuando un único cliente tiene varios inquilinos.
Es importante tener en cuenta que el método de autenticación para llamadas de API puede variar según las llamadas específicas que estés realizando. Por ejemplo, para obtener el nombre de la suscripción del cliente, la Logic App debe tener asignada una Identidad Asignada por el Sistema (System Assigned Identity) o una Identidad Asignada por el Usuario (User Assigned Identity). A esta identidad se le otorga, como mínimo, el rol de Lector (Reader) para la suscripción del cliente.
Al utilizar eficazmente las llamadas de API y los métodos de autenticación apropiados, puedes recopilar información crucial sobre las suscripciones de los clientes y los recursos relacionados, lo que permite procesos de supervisión y gestión simplificados para tu entorno de Azure.
Define el Control Switch :
En el siguiente paso, utilizamos un control switch. Esto puede no ser necesario si sabes exactamente qué solución o servicio de monitorización desencadenará esta Azure Logic App.
En este ejemplo, configuramos nueve posibles casos para capturar cada posible solución o servicio de monitorización. Nuevamente, esto es necesario ya que el contexto de la alerta cambia según la solución o servicio de monitorización. Si sabes qué tipo de alerta desencadenará esta Azure Logic App, no es necesario crear múltiples espacios de trabajo.
Generate the Email
Parse JSON
Utiliza esto para analizar el contexto de la alerta, aunque no es obligatorio. Esto facilita la obtención de detalles de la alerta.
Run Query and list results
Esta parte es opcional. Sin embargo, la incluimos en la alerta para ahorrar tiempo al no tener que hacer clic en el enlace para llegar a la consulta de resultados. Esto devuelve una matriz de resultados. Los resultados de esta acción se pasarán a la operación de datos llamada "Create HTML Table".
Azure Monitor Logs - Connectors | Microsoft Learn
Create HTML Table
Esta acción tomará los resultados de la consulta Kusto y generará una tabla HTML. Debería completarse de la siguiente manera:
From : Value
Columns: Automático o personalizado. Si eliges personalizado, limitará la reutilización de esta lógica de aplicación. Esto se debe a que necesitarás conocer los datos con los que trabajará la alerta de antemano. Supongamos que deseas realizar cambios en la columna sin tener que crear encabezados personalizados. Esto se puede lograr modificando la consulta Kusto en sí y cambiando los nombres de las columnas mediante los comandos "project".
Esta acción no produce una tabla HTML estilizada. En su lugar, debes asegurarte de que la plantilla HTML que estás utilizando pueda aplicar el CSS a la tabla HTML. En esta lógica, lo abordamos primero declarando el estilo CSS. Luego modificamos los resultados devueltos por la acción "Create HTML Table".
Usando la siguiente expresión de Power Automate:
replace(body('Create_HTML_table'), '<table>', '<table class="data-table">')
El propósito de esta expresión es agregar una clase CSS llamada "data-table" a la tabla HTML existente. La clase CSS se puede utilizar para aplicar estilos o formato específico a la tabla. El contenido HTML resultante tendrá la etiqueta <table> actualizada con el atributo de clase agregado.
Por ejemplo, si el contenido HTML original es:
<table> <!-- Table content here --> </table>
La función "replace" lo modificará a:
<table class="data-table"> <!-- Table content here --> </table>
Mediante esta expresión, puedes aplicar dinámicamente una clase a una tabla HTML generada por la acción "Create_HTML_table", lo que brinda flexibilidad en la estilización y presentación dentro del flujo de trabajo de tu Azure Logic App.
Puedes obtener más información sobre esta acción aquí:
Perform operations on data - Azure Logic Apps | Microsoft Learn
Puedes aprender más sobre los operadores en la consulta Kusto que se pueden utilizar para cambiar el nombre de las columnas en:
Project operator | Microsoft Learn
extend operator | Microsoft Learn
Set Email Body
Esta acción es donde pegamos la Plantilla HTML. Dentro de esta Plantilla HTML, podemos comenzar a insertar la información recopilada anteriormente.
Aquí hemos insertado el Nombre del Cliente, el Nombre de la Suscripción del Cliente y el ID de la Suscripción del Cliente.
Send an Email (V2)
Por último, utilizamos la acción "Send an Email (V2)".
En este punto, simplemente pegamos el Cuerpo del Correo Electrónico en el cuerpo del correo electrónico:
Cuando esta Azure Logic App se activa debido a que se ha disparado la alerta de Azure Monitor, ahora recibirás un correo electrónico con más detalles.
En Conclusión
El objetivo de este blog es ejemplificar la utilización del Esquema de Alerta Común para extraer información adicional de una Alerta de Azure Monitor. Específicamente, podemos obtener más información para ayudarnos a discernir el cliente asociado con la alerta. Para mejorar la calidad de las notificaciones por correo electrónico, se puede explorar la incorporación de SendGrid. En entradas futuras, ampliaremos este tema con una colección de ejemplos ilustrativos adicionales.