Odesílání upozornění služby Azure Service Health pomocí ServiceNow pomocí webhooků

V tomto článku se dozvíte, jak integrovat upozornění služby Azure Service Health s ServiceNow pomocí webhooku. Po nastavení integrace webhooku s vaší instancí ServiceNow dostanete upozornění prostřednictvím stávající infrastruktury oznámení, když vás ovlivňují problémy se službou Azure. Pokaždé, když se aktivuje upozornění služby Azure Service Health, volá webhook prostřednictvím skriptovaného rozhraní REST API ServiceNow.

Vytvoření skriptovaného rozhraní REST API ve službě ServiceNow

  1. Ujistěte se, že jste se zaregistrovali a jste přihlášení ke svému účtu ServiceNow .

  2. Přejděte do části Systémové webové služby v ServiceNow a vyberte Skriptovaná rozhraní REST API.

    Část Skriptovaná webová služba v ServiceNow

  3. Výběrem možnosti Nový vytvořte novou skriptovanou službu REST.

    Tlačítko New Scripted REST API (Nové skriptované rozhraní REST API) v ServiceNow

  4. Přidejte do rozhraní REST API název a nastavte ID rozhraní API na azureservicehealth.

  5. Vyberte položku Odeslat.

    Nastavení rozhraní REST API ve službě ServiceNow

  6. Vyberte rozhraní REST API, které jste vytvořili, a na kartě Prostředky vyberte Nový.

    Karta Prostředek ve službě ServiceNow

  7. Pojmenujte nový prostředek event a změňte metodu HTTP na POST.

  8. V části Skript přidejte následující kód JavaScriptu:

    Poznámka:

    Potřebujete aktualizovat <secret><group>hodnotu a <email> hodnotu ve skriptu níže.

    • <secret> by měl být náhodný řetězec, například identifikátor GUID.
    • <group> by měla být skupina ServiceNow, ke které chcete incident přiřadit.
    • <email> by měla být konkrétní osoba, ke které chcete incident přiřadit (volitelné).
    (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. Na kartě Zabezpečení zrušte zaškrtnutí políčka Vyžaduje ověření a vyberte Odeslat. Nastavené <secret> rozhraní API místo toho chrání.

    Zaškrtávací políčko Vyžaduje ověření ve službě ServiceNow

  10. Zpátky v části Skriptovaná rozhraní REST API byste měli najít cestu základního rozhraní API pro nové rozhraní REST API:

    Cesta základního rozhraní API v ServiceNow

  11. Úplná adresa URL integrace vypadá takto:

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

Vytvoření upozornění pomocí ServiceNow na webu Azure Portal

Pro novou skupinu akcí:

  1. Podle kroků 1 až 8 v tomto článku vytvořte upozornění s novou skupinou akcí.

  2. Definujte v seznamu akcí:

    a. Typ akce: Webhook

    b. Podrobnosti: Adresa URL integrace ServiceNow, kterou jste dříve uložili.

    c. Název: Název, alias nebo identifikátor webhooku.

  3. Výběrem možnosti Uložit po dokončení vytvořte upozornění.

Pro existující skupinu akcí:

  1. Na webu Azure Portal vyberte Monitorovat.

  2. V části Nastavení vyberte skupiny akcí.

  3. Najděte a vyberte skupinu akcí, kterou chcete upravit.

  4. Přidat do seznamu akcí:

    a. Typ akce: Webhook

    b. Podrobnosti: Adresa URL integrace ServiceNow, kterou jste dříve uložili.

    c. Název: Název, alias nebo identifikátor webhooku.

  5. Výběrem možnosti Uložit po dokončení aktualizujte skupinu akcí.

Testování integrace webhooku prostřednictvím požadavku HTTP POST

  1. Vytvořte datovou část stavu služby, kterou chcete odeslat. Ukázkovou datovou část webhooku stavu služby najdete v webhoocích pro upozornění protokolu aktivit Azure.

  2. Následujícím způsobem vytvořte požadavek HTTP POST:

    POST        https://<yourInstanceName>.service-now.com/<baseApiPath>?apiKey=<secret>
    
    HEADERS     Content-Type: application/json
    
    BODY        <service health payload>
    
  3. Měli byste obdržet odpověď se zprávou 200 OK "Incident byl vytvořen".

  4. Přejděte do ServiceNow a ověřte, že vaše integrace byla úspěšně nastavena.

Další kroky