Azure monitoring | Cómo crear alertas usando una plantilla ARM

Cómo administradores nos pasamos el día desplegando cosas y todos sabemos lo tedioso que resulta el tener que hacerlo de manera manual, editando o seleccionando opciones según se van presentando en pantalla. También es cierto que podemos automatizar tareas por ejemplo mediante el uso de scripts pero las plantillas van un poco más allá. En el caso de Azure Monitoring nos permiten reutilizar parte de lo que ya tenemos hecho y configurar y desplegar nuestras alertas de un modo rápido y totalmente transparente.

Azure dispone de una API amigable que mediante el uso de plantillas Resource Manager, permite configurar alertas de una forma coherente y reproducible en todos los entornos.

Existen dos tipos de alertas básicas en Azure Monitoring, las basadas en Métricas y las basadas en Logs o registros

Las métricas son medidas de determinadas características de un recurso durante un período determinado. Por ejemplo, utilización de CPU, IOPS de disco, número de conexiones, etc. Suelen ser en tiempo real y, dado que se almacenan como valores con un intervalo de recopilación estándar, son ideales para visualizarlos como gráficos que le ayudarán a ver los resultados a lo largo del tiempo.

Las métricas son valores numéricos que describen algún aspecto de un sistema en un momento determinado. Azure Monitor puede capturar métricas casi en tiempo real. Las métricas se recopilan a intervalos regulares y son útiles para crear alertas debido a su muestreo frecuente o para informar sobre el rendimiento del sistema.

Los registros, también conocidos como logs, contienen información con marca de tiempo sobre los cambios realizados en los recursos. El tipo de información registrada varía según la fuente del registro. Los datos de registro se organizan en tablas, con diferentes conjuntos de propiedades para cada tipo de registro. Los registros pueden incluir valores numéricos, como métricas de Azure Monitor, pero la mayoría incluye datos de texto en lugar de valores numéricos.

El tipo más común de entrada de registro registra un evento. Los eventos pueden ocurrir esporádicamente en lugar de a intervalos fijos o de acuerdo con un horario. Los eventos son creados por aplicaciones y servicios, que proporcionan el contexto para los eventos.

Creando Metric Alerts con una plantilla ARM

Existe mucha documentación en la web de Microsoft al respecto por lo que te será muy fácil configurar este tipo de alertas. Básicamente el proceso pasa por definir dos plantillas, en la primera definimos la plantilla en sí con su configuración y una segunda con los parámetros necesarios. Ambos son dos archivos JSON que podemos editar con cualquier editor de textos.

Aunque podemos “medirlo prácticamente todo” conviene tener muy en cuenta qué definimos para el parámetro metricName. Mi recomendación antes de comenzar pasa por revisar las métricas disponibles en Métricas compatibles de Azure Monitor y definir el método de implementación que usaremos para evitar problemas.

Plantilla para una alerta de métricas de umbral estático simple

Siguiendo este ejemplo para crear una alerta de este tipo mediante una plantilla de Resource Manager, crearemos un recurso de tipo Microsoft.Insights/metricAlerts. También debemos rellenar todas las propiedades relacionadas. En este ejemplo no hay mucha ciencia, pues vamos a crear una regla para una única métrica, pero en según que casos puede complicarse un poco.

Esta plantilla luego la guardaremos como un archivo JSON con el nombre simplestaticmetricalert.json.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "alertName": {
            "type": "string",
            "minLength": 1,
            "metadata": {
                "description": "Name of the alert"
            }
        },
        "alertDescription": {
            "type": "string",
            "defaultValue": "This is a metric alert",
            "metadata": {
                "description": "Description of alert"
            }
        },
        "alertSeverity": {
            "type": "int",
            "defaultValue": 3,
            "allowedValues": [
                0,
                1,
                2,
                3,
                4
            ],
            "metadata": {
                "description": "Severity of alert {0,1,2,3,4}"
            }
        },
        "isEnabled": {
            "type": "bool",
            "defaultValue": true,
            "metadata": {
                "description": "Specifies whether the alert is enabled"
            }
        },
        "resourceId": {
            "type": "string",
            "minLength": 1,
            "metadata": {
                "description": "Full Resource ID of the resource emitting the metric that will be used for the comparison. For example /subscriptions/00000000-0000-0000-0000-0000-00000000/resourceGroups/ResourceGroupName/providers/Microsoft.compute/virtualMachines/VM_xyz"
            }
        },
        "metricName": {
"type": "string",
            "minLength": 1,
            "metadata": {
                "description": "Name of the metric used in the comparison to activate the alert."
            }
        },
        "operator": {
            "type": "string",
            "defaultValue": "GreaterThan",
            "allowedValues": [
                "Equals",
                "NotEquals",
                "GreaterThan",
                "GreaterThanOrEqual",
                "LessThan",
                "LessThanOrEqual"
            ],
            "metadata": {
                "description": "Operator comparing the current value with the threshold value."
            }
        },
        "threshold": {
            "type": "string",
            "defaultValue": "0",
            "metadata": {
                "description": "The threshold value at which the alert is activated."
            }
        },
        "timeAggregation": {
            "type": "string",
            "defaultValue": "Average",
            "allowedValues": [
                "Average",
                "Minimum",
                "Maximum",
                "Total",
                "Count"
            ],
            "metadata": {
                "description": "How the data that is collected should be combined over time."
            }
        },
        "windowSize": {
            "type": "string",
            "defaultValue": "PT5M",
            "allowedValues": [
                "PT1M",
"PT5M",
                "PT15M",
                "PT30M",
                "PT1H",
                "PT6H",
                "PT12H",
                "PT24H"
            ],
            "metadata": {
                "description": "Period of time used to monitor alert activity based on the threshold. Must be between one minute and one day. ISO 8601 duration format."
            }
        },
        "evaluationFrequency": {
            "type": "string",
            "defaultValue": "PT1M",
            "allowedValues": [
                "PT1M",
                "PT5M",
                "PT15M",
                "PT30M",
                "PT1H"
            ],
            "metadata": {
                "description": "how often the metric alert is evaluated represented in ISO 8601 duration format"
            }
        },
        "actionGroupId": {
            "type": "string",
            "defaultValue": "",
            "metadata": {
                "description": "The ID of the action group that is triggered when the alert is activated or deactivated"
            }
        }
    },
    "variables": {  },
    "resources": [
        {
            "name": "[parameters('alertName')]",
            "type": "Microsoft.Insights/metricAlerts",
            "location": "global",
            "apiVersion": "2018-03-01",
            "tags": {},
            "properties": {
                "description": "[parameters('alertDescription')]",
                "severity": "[parameters('alertSeverity')]",
                "enabled": "[parameters('isEnabled')]",
                "scopes": ["[parameters('resourceId')]"],
"evaluationFrequency":"[parameters('evaluationFrequency')]",
                "windowSize": "[parameters('windowSize')]",
                "criteria": {
                    "odata.type": "Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria",
                    "allOf": [
                        {
                            "name" : "1st criterion",
                            "metricName": "[parameters('metricName')]",
                            "dimensions":[],
                            "operator": "[parameters('operator')]",
                            "threshold" : "[parameters('threshold')]",
                            "timeAggregation": "[parameters('timeAggregation')]"
                        }
                    ]
                },
                "actions": [
                    {
                        "actionGroupId": "[parameters('actionGroupId')]"
                    }
                ]
            }
        }
    ]
}

Si esto te parece un poco confuso, ten en cuenta que se trata de un esquema simple en donde definimos una serie de propiedades. El detalle de todas las opciones disponibles puedes consultarlo aquí.

El siguiente paso, y recomendado, es definir un archivo de parámetros separado. Verás que es posible introducir los parámetros directamente usando la línea de comandos pero esto tiene el riesgo de que podamos cometer un error en el proceso y la alerta no se desplegará correctamente.

Continuando con el ejemplo, ahora crearemos una plantilla con los parámetros. Esta plantilla la guardaremos en formato JSON con el nombre simplestaticmetricalert.parameters.json y la modificaremos según nuestras preferencias si es necesario.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "alertName": {
            "value": "New Metric Alert"
        },
        "alertDescription": {
            "value": "New metric alert created via template"
        },
        "alertSeverity": {
            "value":3
        },
        "isEnabled": {
            "value": true
        },
        "resourceId": {
            "value": "/subscriptions/replace-with-subscription-id/resourceGroups/replace-with-resourceGroup-name/providers/Microsoft.Compute/virtualMachines/replace-with-resource-name"
        },
        "metricName": {
            "value": "Percentage CPU"
        },
        "operator": {
          "value": "GreaterThan"
        },
        "threshold": {
            "value": "80"
        },
        "timeAggregation": {
            "value": "Average"
        },
        "actionGroupId": {
            "value": "/subscriptions/replace-with-subscription-id/resourceGroups/resource-group-name/providers/Microsoft.Insights/actionGroups/replace-with-action-group"
        }
    }
}

Con esto ya tendremos todo lo necesario para crear nuestra alerta. Solo recuerda cambiar al menos las partes que he resaltado para que nuestro “experimento” funcione como toca. Para el siguiente paso, podemos crear la alerta de métrica con la plantilla y el archivo de parámetros mediante PowerShell o la CLI de Azure.

Mediante el uso de Azure PowerShell

  1. Nos conectamos a nuestra cuenta: Connect-AzAccount

  2. Si tenemos varias suscripciones lo recomendable es seleccionar antes la adecauda:  Select-AzSubscription -SubscriptionName <yourSubscriptionName>

  3. Desplegamos nuestra alerta mediante la siguiente instrucción: New-AzResourceGroupDeployment -Name AlertDeployment -ResourceGroupName ResourceGroupofTargetResource `-TemplateFile simplestaticmetricalert.json -TemplateParameterFile simplestaticmetricalert.parameters.json

Mediante el uso de Azure CLI

  1. Nos conectamos a nuestra cuenta: az login

  2. Desplegamos nuestra alerta mediante la siguiente instrucción: az deployment group create --name AlertDeployment --resource-group ResourceGroupOfTargetResource--template-file simplestaticmetricalert.json --parameters @simplestaticmetricalert.parameters.json

Nota: Aunque la alerta de métrica se puede crear en un grupo de recursos distinto al recurso de destino, se recomienda usar el mismo grupo de recursos que el recurso de destino.

Creación de una alerta de registro con una plantilla ARM

Las alertas de logs o registro (Log Alert en inglés) nos permiten usar una consulta de Log Analytics para evaluar los registros de los recursos según una frecuencia establecida y activar una alerta en función de los resultados. Las reglas pueden desencadenar la ejecución de una o varias acciones mediante grupos de acciones. Algo que veremos en futuros artículos.

Los datos de registro de un área de trabajo de Log Analytics se pueden enviar al almacén de métricas de Azure Monitor. Las alertas de métricas tienen diferentes comportamientos, lo que puede ser más conveniente en función de los datos con los que esté trabajando.

Plantilla simple (hasta la versión de API 2018-04-16)

Plantilla de creación de reglas de consulta programadas basada en el número de alertas de registro de resultados (conjunto de datos de ejemplo como variables):

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
    },
    "variables": {
        "alertLocation": "southcentralus",
        "alertName": "samplelogalert",
        "alertDescription": "Sample log search alert",
        "alertStatus": "true",
        "alertSource":{
            "Query":"requests",
            "SourceId": "/subscriptions/a123d7efg-123c-1234-5678-a12bc3defgh4/resourceGroups/myRG/providers/microsoft.insights/components/sampleAIapplication",
            "Type":"ResultCount"
        },
        "alertSchedule":{
            "Frequency": 15,
            "Time": 60
        },
        "alertActions":{
            "SeverityLevel": "4"
        },
        "alertTrigger":{
            "Operator":"GreaterThan",
            "Threshold":"1"
        },
        "actionGrp":{
            "ActionGroup": "/subscriptions/a123d7efg-123c-1234-5678-a12bc3defgh4/resourceGroups/myRG/providers/microsoft.insights/actiongroups/sampleAG",
            "Subject": "Customized Email Header",
            "Webhook": "{ \"alertname\":\"#alertrulename\", \"IncludeSearchResults\":true }"
        }
    },
    "resources":[ {
"name":"[variables('alertName')]",
        "type":"Microsoft.Insights/scheduledQueryRules",
        "apiVersion": "2018-04-16",
        "location": "[variables('alertLocation')]",
        "properties":{
            "description": "[variables('alertDescription')]",
            "enabled": "[variables('alertStatus')]",
            "source": {
                "query": "[variables('alertSource').Query]",
                "dataSourceId": "[variables('alertSource').SourceId]",
                "queryType":"[variables('alertSource').Type]"
            },
            "schedule":{
                "frequencyInMinutes": "[variables('alertSchedule').Frequency]",
                "timeWindowInMinutes": "[variables('alertSchedule').Time]"
            },
            "action":{
                "odata.type": "Microsoft.WindowsAzure.Management.Monitoring.Alerts.Models.Microsoft.AppInsights.Nexus.DataContracts.Resources.ScheduledQueryRules.AlertingAction",
                "severity":"[variables('alertActions').SeverityLevel]",
                "aznsAction":{
                    "actionGroup":"[array(variables('actionGrp').ActionGroup)]",
                    "emailSubject":"[variables('actionGrp').Subject]",
                    "customWebhookPayload":"[variables('actionGrp').Webhook]"
                },
                "trigger":{
                    "thresholdOperator":"[variables('alertTrigger').Operator]",
                    "threshold":"[variables('alertTrigger').Threshold]"
                }
            }
        }
    } ]
}

Una vez editemos las partes resaltadas en amarillo en el documento JSON de ejemplo este se puede guardar e implementar mediante el Azure Resource Manager disponible en Azure Portal o siguiendo los ejemplos para PowerShell o Azure CLI antes comentados.

En PowerShell implementar esto desde una plantilla local es muy sencillo. Por ejemplo:

New-AzResourceGroupDeployment `

-Name ExampleDeployment `

-ResourceGroupName ExampleGroup `

-TemplateFile <path-to-template>

También es posible utilizar la API REST para crear o actualizar nuestras plantillas, si quieres trastear un poco con este último método en la web de Microsoft encontrarás además de documentación adicional, un simulador para que puedas hacer tu laboratorio sin riesgos.

Conclusión:

Y con esto llegamos al final de nuestro artículo. En él hemos visto cómo definir nuestra plantilla para crear diferentes tipos de alertas utilizando ARM. Como hemos podido ver las plantillas ARM  pueden ser usadas para múltiples usos. En este ejemplo hemos creado alertas para monitorizar nuestros recursos pero también podemos desplegar nuevos recursos usando el mismo método. Esto lo veremos en próximos artículos.

 

 

Guía de posibilidades profesionales sobre Azure
He leído y acepto la política de privacidad
Acepto recibir emails sobre actividades de recruiting NTT DATA