Gestire gli allarmi con ServiceNow

In questo argomento viene spiegato come archiviare automaticamente i ticket ServiceNow ogni volta che si attivano allarmi.

In questo scenario, ogni volta che l'uso della CPU supera la soglia specificata dall'allarme, viene creato un ticket ServiceNow per il tecnico di chiamata.

Non inserire informazioni riservate durante l'assegnazione di descrizioni, tag o nomi descrittivi alle risorse cloud tramite la console, l'API o l'interfaccia CLI di Oracle Cloud Infrastructure.

Questo scenario prevede la scrittura di una funzione nel file dei ticket ServiceNow (e la creazione di un segreto per memorizzare le credenziali ServiceNow), l'aggiunta di tale funzione e di un messaggio di posta elettronica facoltativo come sottoscrizioni a un argomento e la creazione di un allarme che invia messaggi a tale argomento quando viene superata la soglia di allarme. Il messaggio viene aggiunto alle sottoscrizioni dell'argomento, che include un indirizzo e-mail di gruppo oltre alla funzione. La funzione viene richiamata alla ricezione del messaggio.

Tutto tranne la funzione può essere impostato nella console. In alternativa, puoi utilizzare l'interfaccia CLI o l'API di Oracle Cloud Infrastructure, che ti consente di eseguire manualmente le singole operazioni.

Il diagramma riportato di seguito illustra il flusso generale del processo.



servicenow-notifiche-oracle.zip

Memorizza le credenziali ServiceNow in un segreto

Creare un segreto a cui fare riferimento in seguito quando si crea la funzione.

Creare un segreto utilizzando la console (è anche possibile creare un segreto utilizzando l'interfaccia della riga di comando (CLI, Command Line Interface) o l'API (Application Programming Interface).

  1. Aprire il menu di navigazione, fare clic su Identità e sicurezza, quindi su Errore.
  2. Nella lista Ambito lista fare clic sul nome del compartimento in cui si desidera creare un segreto.
  3. Dalla lista dei vault nel compartimento, effettuare una delle operazioni riportate di seguito.
    • Fare clic sul nome del vault in cui si desidera creare un segreto.
    • Creare un nuovo vault per il segreto, quindi fare clic sul nome del vault.
  4. Creare il segreto username:
    1. Fare clic su Secrets, quindi su Crea segreto.
    2. Nella finestra di dialogo Crea segreto scegliere un compartimento dalla lista Crea nel compartimento. I segreti possono esistere all'esterno del compartimento in cui si trova il vault.
    3. Fare clic su Nome, quindi immettere un nome per identificare il segreto. Evitare di inserire informazioni riservate in questo campo.
      Nome di esempio: servicenow_username_plain_text
    4. Fare clic su Descrizione, quindi immettere una breve descrizione del segreto per facilitarne l'identificazione. Evitare di inserire informazioni riservate in questo campo.
      Descrizione di esempio: servicenow_username_plain_text
    5. Scegliere la chiave di cifratura master che si desidera usare per cifrare i contenuti dei segreti durante l'importazione nel vault (la chiave deve appartenere allo stesso vault).
    6. Per il modello di tipo segreto, scegliere Testo non codificato.
    7. Fare clic su Contenuti segreti, quindi immettere il nome utente ServiceNow:
      <your-servicenow-username>
    8. Fare clic su Crea segreto.
    9. Prendere nota dell'OCID segreto.

Creazione della funzione

Iniziare con il codice di esempio riportato di seguito per creare una funzione per il file dei ticket ServiceNow e quindi autorizzare la funzione ad accedere alle credenziali ServiceNow nel segreto creato utilizzando il servizio Oracle Cloud Infrastructure Vault.

L'esempio di codice include le variabili SNOW_URL, SNOW_USER_ID_SEC e SNOW_USER_PWD_SEC utilizzate nella funzione ipotetica. È possibile scegliere di leggere questi valori direttamente dalla funzione oppure passare i valori come parametri di configurazione personalizzati.

#####################################################
# THIS SAMPLE CODE IS FOR DEMO PURPOSES ONLY
#*************************************************
# ******** DO NOT USE IN PRODUCTION *************
# ************************************************
#####################################################
import io
import sys
import oci
import json
import base64
import requests
from fdk import response
SNOW_URL = '<Provide Service Now URL here>'
SNOW_USER_ID_SEC = '<Provide the OCID of OCI Secret for Service Now User ID>'
SNOW_USER_PWD_SEC = '<Provide the OCID of OCI Secret for Service Now User Password>'
OCI_TO_SNOW_SEV_MAP =
{    'CRITICAL'  : '1',    'WARNING'   : '2',    'ERROR'     : '3',    'INFO'      : '4' }
def handler(ctx, data: io.BytesIO = None):
    try:
        funDataStr = data.read().decode('utf-8')
        funDataJSON =  json.loads(funDataStr)
        alarmData = {}
        alarmData['type'] = funDataJSON['type']
        alarmData['metaDataList'] = funDataJSON['alarmMetaData']
        alarmData['title'] = funDataJSON['title']
        alarmData['body'] = funDataJSON['body']
        alarmData['sev'] = OCI_TO_SNOW_SEV_MAP[funDataJSON['severity'].upper()]
        if alarmData['type'].upper() == 'OK_TO_FIRING':
            snowURL = SNOW_URL
            snowUsrIDSec = SNOW_USER_ID_SEC
            snowUsrPwdSec = SNOW_USER_PWD_SEC
            ociResPrncplSigner = oci.auth.signers.get_resource_principals_signer()
            ociSecSvc = oci.secrets.SecretsClient(config={}, signer=ociResPrncplSigner)
            snowUserID = readSecValueFromSecSvc(ociSecSvc, snowUsrIDSec)
            snowPswd = readSecValueFromSecSvc(ociSecSvc, snowUsrPwdSec)
            snowData = getSNOWData(alarmData)
            sendDataToSnow(snowURL, snowUserID, snowPswd, snowData)
    except Exception as e:
        sys.stderr.write("Exception : " + str(e))
        sys.stderr.write("Exception Class : " + str(e._class_))
    return response.Response(ctx, response_data="", headers={"Content-Type": "application/json"})
def sendDataToSnow(snowURL, uid, pwd, snowData):
    try:
{ 
snowHdrs =
      "Content-Type" : "application/json",
counter = 0
for sd in snowData:
"Accept" : "application/json"         }
        snowResp = requests.post(snowURL, auth=(uid, pwd), headers=snowHdrs, data=json.dumps(sd))
except Exception as e:
    sys.stderr.write("Exception : " + str(e))
    sys.stderr.write("Exception Class : " + str(e._class_))
   def getSNOWData(alarmData):
       snowData = []
       if alarmData['type'].upper() == 'OK_TO_FIRING':
           alrmMD = alarmData['metaDataList'][0]
           for d in alrmMD['dimensions']:
               snowDataElem = {}
               snowDataElem['node'] = d['resourceDisplayName']
               snowDataElem['source'] = 'OCI'
               snowDataElem['severity'] = alarmData['sev']
               snowDataElem['description'] = alarmData['body']
               snowDataElem['type'] = alarmData['title']
               snowData.append(snowDataElem)
       return snowData
   def readSecValueFromSecSvc(ociSecSvc, secID):
       secResp = ociSecSvc.get_secret_bundle(secID)
       secContent = secResp.data.secret_bundle_content.content
       secret_content = base64.b64decode(secContent).decode('utf-8')
       return secret_content

Utilizzare un gruppo dinamico per concedere alla funzione la possibilità di leggere i segreti. La funzione deve disporre di questa autorizzazione per accedere alle credenziali ServiceNow, che vengono memorizzate nei segreti creati in precedenza.

  1. Individuare e prendere nota dell'OCID della funzione nel seguente formato:
    ocid1.fnfunc.oc1.iad.<exampleuniqueID>

    Includere la funzione nel gruppo dinamico pertinente specificando la regola seguente:

    resource.id = '<function-ocid>'

    In alternativa, è possibile creare un gruppo dinamico che includa tutte le funzioni:

    ALL{resource.type=’fnfunc’, resource.compartment.id=’<compartment_OCID>’}
  2. Concedere l'accesso gruppo dinamico ai segreti aggiungendo il criterio seguente.
    allow dynamic-group <dynamic-group-name> to read secret-family in tenancy

    Per autorizzare la funzione ad accedere ad altre risorse di Oracle Cloud Infrastructure, ad esempio le istanze di computazione, includere la funzione in un gruppo dinamico e creare un criterio per concedere al gruppo dinamico l'accesso a tali risorse.

Crea l'argomento

Crea l'argomento che utilizzerai per le sottoscrizioni e l'allarme.

Un topic è un canale di comunicazione per inviare messaggi alle sottoscrizioni. Ogni nome di argomento è univoco nella tenancy. È possibile creare l'argomento utilizzando la console, l'interfaccia a riga di comando (CLI, Command Line Interface) o l'API (Application Programming Interface).

È necessario distribuire la funzione per utilizzarla con un argomento.

  1. Per creare l'argomento mediante la console:
    1. Aprire il menu di navigazione e fare clic su Servizi per sviluppatori. In Integrazione applicazioni, fare clic su Notifiche.
    2. Fare clic su Crea argomento nella parte superiore dell'elenco degli argomenti.
    3. Nella finestra di dialogo Crea argomento, configurare l'argomento:
      • Nome: specificare un nome descrittivo per l'argomento. Deve essere univoco all'interno della tenancy; la convalida fa distinzione tra maiuscole e minuscole. Evitare di fornire informazioni riservate.
      • Descrizione: è possibile immettere una descrizione per l'argomento. Evitare di fornire informazioni riservate.
    4. Fare clic su Crea.
  2. Per creare l'argomento mediante l'interfaccia CLI, aprire un prompt dei comandi e immettere un comando simile al seguente:
    oci ons topic create
    --name "My Topic"
    --compartment-id "<compartment-ocid>"
  3. Per creare l'argomento mediante l'API, utilizzare operazioni simili alle seguenti:
    POST /20181201/topics
    Host: notification.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "name": "My Topic",
      "compartmentId": "<compartment_OCID>"
    }
    

Creare le sottoscrizioni

Creare la sottoscrizione per l'argomento.

Una sottoscrizione è l'endpoint di un argomento. I messaggi pubblicati vengono inviati a ciascuna sottoscrizione per un topic.

È necessario distribuire la funzione prima di poterla utilizzare con una sottoscrizione ed è necessario disporre dell'autorizzazione FN_INVOCATION affinché la funzione possa aggiungere la funzione come sottoscrizione a un argomento.

  1. Per creare la sottoscrizione alla funzione mediante la console:
    1. Aprire il menu di navigazione e fare clic su Servizi per sviluppatori. In Integrazione applicazioni, fare clic su Notifiche. Fare clic sul nome dell'argomento al quale si desidera aggiungere la sottoscrizione.
    2. Nella pagina dei dettagli dell'argomento fare clic su Crea sottoscrizione.
    3. Nella finestra di dialogo Crea sottoscrizione configurare la sottoscrizione alla funzione. La conferma non è obbligatoria per le sottoscrizioni alle funzioni.
      • Per il protocollo Sottoscrizione, fare clic su Funzione.
      • Per il compartimento funzione, fare clic sul compartimento contenente la funzione.
      • per Applicazione funzione, fare clic sull'applicazione che contiene la funzione.
      • Per Funzione, fare clic sulla funzione.
    4. Fare clic su Crea.
  2. Per creare una sottoscrizione di posta elettronica facoltativa utilizzando la console:
    1. Aprire il menu di navigazione e fare clic su Servizi per sviluppatori. In Integrazione applicazioni, fare clic su Notifiche. Fare clic sul nome dell'argomento al quale si desidera aggiungere la sottoscrizione.
    2. Nella pagina dei dettagli dell'argomento fare clic su Crea sottoscrizione.
    3. Configurare la sottoscrizione di posta elettronica nella finestra di dialogo Crea sottoscrizione.
      • Per il protocollo di sottoscrizione, fare clic su E-mail.
      • Per E-mail, specificare un indirizzo e-mail.
    4. Fare clic su Crea.
      La sottoscrizione e-mail viene creata e un URL di conferma sottoscrizione viene inviato all'indirizzo e-mail specificato. La sottoscrizione rimane in stato In sospeso finché non viene confermata. Per confermare la nuova sottoscrizione e-mail, aprire l'e-mail e fare clic sull'URL di conferma.
  3. Per creare una sottoscrizione mediante l'interfaccia CLI, procedere come segue.
    1. Per creare un abbonamento a una funzione, aprire un prompt dei comandi e immettere un comando simile al seguente:
      oci ons subscription create
      --compartment-id "<compartment-ocid>"
      --topic-id "<topic-ocid>" 
      --protocol "ORACLE_FUNCTIONS"
      --subscription-endpoint "<function-ocid>"
    2. Per creare una sottoscrizione di posta elettronica, aprire un prompt dei comandi e immettere un comando simile al seguente:
      oci ons subscription create
      --compartment-id "<compartment-ocid>"
      --topic-id "<topic-ocid>" 
      --protocol "EMAIL"
      --subscription-endpoint "team@example.com"
  4. Per creare una sottoscrizione mediante l'API, procedere come segue.
    1. Per creare una sottoscrizione a una funzione utilizzando l'API, utilizzare operazioni simili alle seguenti:
      POST /20181201/subscriptions
      Host: notification.us-phoenix-1.oraclecloud.com
      <authorization and other headers>
      {
        "topicId": "<topic_OCID>",
        "compartmentId": "<compartment_OCID>",
        "protocol": "ORACLE_FUNCTIONS",
        "endpoint": "<function_OCID>"
      } 
    2. Per creare una sottoscrizione e-mail utilizzando l'API, utilizzare operazioni simili alle seguenti:
      POST /20181201/subscriptions
      Host: notification.us-phoenix-1.oraclecloud.com
      <authorization and other headers>
      {
        "topicId": "<topic_OCID>",
        "compartmentId": "<compartment_OCID>",  
        "protocol": "EMAIL",
        "endpoint": "team@example.com"
      
      } 

Crea l'allarme

Creare l'allarme che invia un messaggio all'argomento quando viene superata la soglia di allarme. Le notifiche trasmettono quindi il messaggio alle sottoscrizioni attive in tale topic.

  1. Per creare l'allarme utilizzando la console:
    1. Aprire il menu di navigazione e fare clic su Osservabilità e gestione. In Monitoraggio, fare clic su Definizioni avvisi.
    2. Fare clic su Crea allarme.
    3. Nella pagina Crea allarme, in Definisci allarme, impostare la soglia:
      Sotto la descrizione della metrica:
      • Compartimento: selezionare il compartimento che contiene istanze di computazione di interesse.
      • Spazio di nomi metrica: oci_computeagent
      • Nome metrica: CpuUtilization
      • Intervallo: 1m
      • Statistiche: Conteggio
      In Regola trigger:
      • Operatore: maggiore di
      • Valore: 90
      • Minuti di ritardo del trigger: 1
    4. Per definire le notifiche di allarme, aggiungere l'argomento creato in precedenza come destinazione.
      Sotto la destinazione:
      • Servizio di destinazione: Notifiche
      • Compartimento: (selezionare il compartimento che contiene l'argomento)
      • Argomento: (selezionare l'argomento)
    5. Fare clic su Salva allarme.
  2. Per creare l'allarme utilizzando l'interfaccia CLI, aprire un prompt dei comandi e immettere un comando simile al seguente:
    oci monitoring alarm create
    --display-name "My Alarm"
    --compartment-id "<compartment-ocid>" 
    --metric-compartment-id "<compartment-ocid>" 
    --namespace "oci_computeagent" 
    --query-text "CPUUtilization[1m].count() > 90"
    --severity "CRITICAL"
    --destinations "<topic-ocid>"
    --is-enabled true
  3. Per creare l'allarme utilizzando l'API, utilizzare operazioni simili alle seguenti:
    POST /20180401/alarms
    Host: telemetry.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "displayName": "My Alarm",
      "compartmentId": "<compartment_OCID>",
      "metricCompartmentId": "<compartment_OCID>",
      "namespace": "oci_computeagent",
      "query": "MemoryUtilization[1m].max() > 90",
      "severity": "CRITICAL",
      "destinations":
        [
          "<topic_OCID>"
        ],
      "isEnabled": true
    }