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.
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).
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.
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.
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.
- Per creare la sottoscrizione alla funzione mediante la console:
- Per creare una sottoscrizione di posta elettronica facoltativa utilizzando la console:
- Per creare una sottoscrizione mediante l'interfaccia CLI, procedere come segue.
- Per creare una sottoscrizione mediante l'API, procedere come segue.