Alarme mit ServiceNow verwalten
In diesem Thema wird erläutert, wie Sie automatische ServiceNow-Tickets einreichen, wenn Alarme ausgelöst werden.
Wenn in diesem Szenario die CPU-Auslastung den von Ihrem Alarm angegebenen Schwellenwert überschreitet, wird ein ServiceNow-Ticket für Ihren Bereitstellungsanbieter erstellt.
Geben Sie keine privaten Informationen ein, wenn Sie Ihren Cloud-Ressourcen Beschreibungen, Tags oder benutzerdefinierte Namen über die Konsole, die API oder die CLI von Oracle Cloud Infrastructure zuweisen.
Dieses Szenario umfasst das Schreiben einer Funktion in die Datei ServiceNow-Tickets (und das Erstellen eines Secrets zum Speichern Ihrer ServiceNow-Zugangsdaten), das Hinzufügen dieser Funktion und einer optionalen E-Mail als Abonnements zu einem Thema und das Erstellen eines Alarms, der Nachrichten an dieses Thema sendet, wenn der Alarmschwellenwert überschritten wird. Die Nachricht nimmt die Abonnements des Themas auf, die neben der Funktion eine Gruppen-E-Mail-Adresse enthält. Die Funktion wird beim Empfang der Nachricht aufgerufen.
Alles außer der Funktion kann in der Konsole eingerichtet werden. Alternativ können Sie die Oracle Cloud Infrastructure-CLI oder -API verwenden, um die einzelnen Vorgänge selbst auszuführen.
Das folgende Diagramm zeigt den allgemeinen Prozessablauf:
Speichern Sie Ihre ServiceNow-Zugangsdaten in einem Secret
Erstellen Sie ein Secret, das Sie später referenzieren, wenn Sie die Funktion erstellen.
Erstellen Sie ein Secret mit der Konsole (Sie können ein Secret auch mit der Befehlszeilenschnittstelle (CLI) oder der Anwendungsprogrammierschnittstelle (API) erstellen).
Funktion erstellen
Beginnen Sie mit dem folgenden Beispielcode, um eine Funktion zur Datei von ServiceNow-Tickets zu erstellen, und autorisieren Sie die Funktion dann, auf Ihre ServiceNow-Zugangsdaten in dem Secret zuzugreifen, das mit dem Oracle Cloud Infrastructure Vault-Service erstellt wurde.
Das Codebeispiel enthält die Variablen SNOW_URL, SNOW_USER_ID_SEC und SNOW_USER_PWD_SEC, die in der hypothetischen Funktion verwendet werden. Sie können diese Werte direkt aus der Funktion lesen oder die Werte stattdessen als benutzerdefinierte Konfigurationsparameter übergeben.
#####################################################
# 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
Verwenden Sie eine dynamische Gruppe, um Ihrer Funktion das Lesen von Secrets zu ermöglichen. Ihre Funktion muss über diese Berechtigung verfügen, um auf Ihre ServiceNow-Zugangsdaten zuzugreifen, die in den zuvor erstellten Secrets gespeichert sind.
Thema erstellen
Erstellen Sie das Thema, das Sie für die Abonnements und den Alarm verwenden.
Ein Thema ist ein Kommunikationskanal zum Senden von Nachrichten an Abonnements. Jeder Themenname ist innerhalb des Mandanten eindeutig. Sie können das Thema mit der Konsole, der Befehlszeilenschnittstelle (CLI) oder der Anwendungsprogrammierschnittstelle (API) erstellen.
Sie müssen die Funktion bereitstellen, bevor Sie sie mit einem Thema verwenden können.
Abonnements erstellen
Erstellen Sie das Abonnement für das Thema.
Ein Abonnement ist ein Endpunkt für ein Thema. Veröffentlichte Nachrichten werden an jedes Abonnement für ein Thema gesendet.
Sie müssen die Funktion bereitstellen, bevor Sie sie mit einem Abonnement verwenden können. Sie benötigen die Berechtigung FN_INVOCATION
, damit die Funktion als Abonnement zu einem Thema hinzugefügt werden kann.
- So erstellen Sie das Funktionsabonnement mit der Konsole:
- So erstellen Sie ein optionales E-Mail-Abonnement mit der Konsole:
- So erstellen Sie ein Abonnement mit der CLI:
- So erstellen Sie ein Abonnement mit der API: