Partilhar via


Enviar alertas de integridade do serviço do Azure com o ServiceNow usando webhooks

Este artigo mostra como integrar alertas de integridade do serviço do Azure com o ServiceNow usando um webhook. Depois de configurar a integração do webhook com sua instância ServiceNow, você recebe alertas por meio de sua infraestrutura de notificação existente quando problemas de serviço do Azure o afetam. Sempre que um alerta de Integridade do Serviço do Azure é acionado, ele chama um webhook por meio da API REST com script do ServiceNow.

Criando uma API REST com script no ServiceNow

  1. Certifique-se de que se inscreveu e iniciou sessão na sua conta ServiceNow .

  2. Navegue até a seção Serviços Web do Sistema no ServiceNow e selecione APIs REST com script.

    A seção

  3. Selecione Novo para criar um novo serviço REST com script.

    O botão

  4. Adicione um Nome à sua API REST e defina o ID da API como azureservicehealth.

  5. Selecione Submeter.

    As

  6. Selecione a API REST que você criou e, na guia Recursos , selecione Novo.

    A

  7. Nomeie seu novo recurso event e altere o método HTTP para POST.

  8. Na seção Script, adicione o seguinte código JavaScript:

    Nota

    Você precisa atualizar o <secret>,<group>, e <email> valor no script abaixo.

    • <secret> deve ser uma cadeia de caracteres aleatória, como um GUID
    • <group> deve ser o grupo ServiceNow ao qual você deseja atribuir o incidente
    • <email> deve ser a pessoa específica à qual você deseja atribuir o 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. Na guia segurança, desmarque Requer autenticação e selecione Enviar. Em vez disso, o <secret> conjunto você protege essa API.

    A caixa de seleção

  10. De volta à seção APIs REST com script, você deve encontrar o caminho da API base para sua nova API REST:

    O

  11. O URL de integração completo tem a seguinte aparência:

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

Criar um alerta usando ServiceNow no portal do Azure

Para um novo grupo de ação:

  1. Siga as etapas 1 a 8 neste artigo para criar um alerta com um novo grupo de ações.

  2. Defina na lista de Ações:

    a. Tipo de ação: Webhook

    b. Detalhes: A URL de integração ServiceNow que você salvou anteriormente.

    c. Nome: nome, alias ou identificador do Webhook.

  3. Selecione Salvar quando terminar para criar o alerta.

Para um grupo de ação existente:

  1. No portal do Azure, selecione Monitor.

  2. Na seção Configurações, selecione Grupos de ações.

  3. Localize e selecione o grupo de ações que deseja editar.

  4. Adicionar à lista de Ações:

    a. Tipo de ação: Webhook

    b. Detalhes: A URL de integração ServiceNow que você salvou anteriormente.

    c. Nome: nome, alias ou identificador do Webhook.

  5. Selecione Salvar quando terminar para atualizar o grupo de ações.

Testando sua integração de webhook por meio de uma solicitação HTTP POST

  1. Crie a carga útil de integridade do serviço que você deseja enviar. Você pode encontrar um exemplo de carga de webhook de integridade do serviço em Webhooks para alertas de log de atividades do Azure.

  2. Crie uma solicitação HTTP POST da seguinte maneira:

    POST        https://<yourInstanceName>.service-now.com/<baseApiPath>?apiKey=<secret>
    
    HEADERS     Content-Type: application/json
    
    BODY        <service health payload>
    
  3. Você deve receber uma 200 OK resposta com a mensagem "Incidente criado".

  4. Vá para ServiceNow para confirmar que sua integração foi configurada com êxito.

Próximos passos