Compartir a través de


Envío de alertas de Azure Service Health con ServiceNow mediante webhooks

Este artículo muestra cómo integrar las alertas de estado del servicio de Azure con ServiceNow mediante un webhook. Después de configurar la integración de webhook con su instancia de ServiceNow, obtendrá alertas a través de la infraestructura de notificación existente cuando le afecten los problemas de servicio de Azure. Cada vez que se genera una alerta de Azure Service Health, se llama a un webhook mediante la API REST con script de ServiceNow.

Creación de una API de REST con script en ServiceNow

  1. Asegúrese de que se ha registrado y ha iniciado sesión en su cuenta de ServiceNow.

  2. Vaya hasta la sección System Web Services (Servicios web del sistema) en ServiceNow y seleccione Scripted REST APIs (API de REST con script).

    La sección

  3. Seleccione New (Nuevo) para crear un nuevo servicio de REST con script.

    El botón

  4. Agregue un nombre a la API de REST y establezca el identificador de la API en azureservicehealth.

  5. Seleccione Submit (Enviar).

  6. Seleccione la API de REST que creó, y, en la pestaña Resources (Recursos), seleccione New (Nuevo).

    La pestaña

  7. Nombre el nuevo recurso event y cambie el método HTTP a POST.

  8. En la sección Script, agregue el siguiente código JavaScript:

    Nota:

    Debe actualizar los valores <secret>, <group> y <email> en el siguiente script.

    • <secret> debe ser una cadena aleatoria, como un GUID.
    • <group> debe ser el grupo de ServiceNow al que desea asignar el incidente.
    • <email> debe ser la persona específica a la que desea asignar el incidente (opcional).
    (function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
        var apiKey = request.queryParams['apiKey'];
        var secret = '<secret>';
        if (apiKey == secret) {
            var event = request.body.data;
            var responseBody = {};
            if (event.data.context.activityLog.operationName == 'Microsoft.ServiceHealth/incident/action') {
                var inc = new GlideRecord('incident');
                var incidentExists = false;
                inc.addQuery('number', event.data.context.activityLog.properties.trackingId);
                inc.query();
                if (inc.hasNext()) {
                    incidentExists = true;
                    inc.next();
                } else {
                    inc.initialize();
                }
                var short_description = "Azure Service Health";
                if (event.data.context.activityLog.properties.incidentType == "Incident") {
                    short_description += " - Service Issue - ";
                } else if (event.data.context.activityLog.properties.incidentType == "Maintenance") {
                    short_description += " - Planned Maintenance - ";
                } else if (event.data.context.activityLog.properties.incidentType == "Informational" || event.data.context.activityLog.properties.incidentType == "ActionRequired") {
                    short_description += " - Health Advisory - ";
                }
                short_description += event.data.context.activityLog.properties.title;
                inc.short_description = short_description;
                inc.description = event.data.context.activityLog.properties.communication;
                inc.work_notes = "Impacted subscription: " + event.data.context.activityLog.subscriptionId;
                if (incidentExists) {
                    if (event.data.context.activityLog.properties.stage == 'Active') {
                        inc.state = 2;
                    } else if (event.data.context.activityLog.properties.stage == 'Resolved') {
                        inc.state = 6;
                    } else if (event.data.context.activityLog.properties.stage == 'Closed') {
                        inc.state = 7;
                    }
                    inc.update();
                    responseBody.message = "Incident updated.";
                } else {
                    inc.number = event.data.context.activityLog.properties.trackingId;
                    inc.state = 1;
                    inc.impact = 2;
                    inc.urgency = 2;
                    inc.priority = 2;
                    inc.assigned_to = '<email>';
                    inc.assignment_group.setDisplayValue('<group>');
                    var subscriptionId = event.data.context.activityLog.subscriptionId;
                    var comments = "Azure portal Link: https://app.azure.com/h";
                    comments += "/" + event.data.context.activityLog.properties.trackingId;
                    comments += "/" + subscriptionId.substring(0, 3) + subscriptionId.slice(-3);
                    var impactedServices = JSON.parse(event.data.context.activityLog.properties.impactedServices);
                    var impactedServicesFormatted = "";
                    for (var i = 0; i < impactedServices.length; i++) {
                        impactedServicesFormatted += impactedServices[i].ServiceName + ": ";
                        for (var j = 0; j < impactedServices[i].ImpactedRegions.length; j++) {
                            if (j != 0) {
                                impactedServicesFormatted += ", ";
                            }
                            impactedServicesFormatted += impactedServices[i].ImpactedRegions[j].RegionName;
                        }
    
                        impactedServicesFormatted += "\n";
    
                    }
                    comments += "\n\nImpacted Services:\n" + impactedServicesFormatted;
                    inc.comments = comments;
                    inc.insert();
                    responseBody.message = "Incident created.";
                }
            } else {
                responseBody.message = "Hello from the other side!";
            }
            response.setBody(responseBody);
        } else {
            var unauthorized = new sn_ws_err.ServiceError();
            unauthorized.setStatus(401);
            unauthorized.setMessage('Invalid apiKey');
            response.setError(unauthorized);
        }
    })(request, response);
    
  9. En la pestaña de seguridad, desactive la opción Requires authentication (Requiere autenticación) y seleccione Submit (Enviar). El <secret> establecido protege esta API.

    La casilla

  10. Si volvemos a la sección Scripted REST APIs (API de REST con script), debe encontrar la ruta de la API base para la nueva API de REST:

    La

  11. La dirección URL completa de integración tiene el siguiente aspecto:

    https://<yourInstanceName>.service-now.com/<baseApiPath>?apiKey=<secret>
    

Creación de una alerta con ServiceNow en Azure Portal

Para un nuevo grupo de acciones:

  1. Siga los pasos del 1 al 8 en este artículo para crear una alerta con un nuevo grupo de acciones.

  2. Defina la lista de acciones:

    a. Tipo de acción: Webhook

    b. Detalles: la dirección URL de integración de ServiceNow guardada anteriormente.

    c. Nombre: el identificador, alias o nombre de webhook.

  3. Seleccione Guardar cuando termine para crear la alerta.

Para un grupo de acciones existentes:

  1. En Azure Portal, seleccione Supervisión.

  2. En la sección Configuración, seleccione Grupos de acciones.

  3. Busque el grupo de acciones que desee editar.

  4. Defina la lista de acciones:

    a. Tipo de acción: Webhook

    b. Detalles: la dirección URL de integración de ServiceNow guardada anteriormente.

    c. Nombre: el identificador, alias o nombre de webhook.

  5. Cuando termine de actualizar el grupo de acciones, seleccione Guardar.

Prueba de la integración de webhook a través de una solicitud HTTP POST

  1. Cree la carga de estado del servicio que desee enviar. Puede encontrar una carga de webhook de estado del servicio de ejemplo en Webhooks para alertas del registro de actividad de Azure.

  2. Cree una solicitud HTTP POST de la siguiente manera:

    POST        https://<yourInstanceName>.service-now.com/<baseApiPath>?apiKey=<secret>
    
    HEADERS     Content-Type: application/json
    
    BODY        <service health payload>
    
  3. Debe recibir una respuesta 200 OK con el mensaje "Incident created" (Incidente creado).

  4. Vaya a ServiceNow para confirmar que la integración se ha configurado correctamente.

Pasos siguientes