Gerenciar Alarmes com ServiceNow
Este tópico explica como registrar tickets ServiceNow automáticos sempre que os alarmes forem disparados.
Neste cenário, sempre que o uso da CPU exceder o limite especificado por seu alarme, um ticket ServiceNow é criado para seu engenheiro de chamada.
Não digite informações confidenciais ao designar descrições, tags ou nomes simples aos seus recursos na nuvem por meio da Console, API ou CLI do Oracle Cloud Infrastructure.
Esse cenário envolve gravar uma função para registrar tickets ServiceNow (e criar um segredo para armazenar suas credenciais ServiceNow), adicionar essa função e um e-mail opcional como assinaturas a um tópico e criar um alarme que envia mensagens a esse tópico quando o limite de alarme é excedido. Os fãs da mensagem para fora das assinaturas do tópico, que inclui um endereço de e-mail de grupo além da função. A função é chamada no recebimento da mensagem.
Tudo, exceto a função, pode ser configurado na Console. Como alternativa, você pode usar a CLI ou a API do Oracle Cloud Infrastructure, que permite que você mesmo execute as operações individuais.
O seguinte diagrama ilustra o fluxo geral do processo:
Armazene suas Credenciais ServiceNow em um Segredo
Crie um segredo que você fará referência posteriormente ao criar a função.
Crie um segredo usando a console (você também pode criar um segredo usando a CLI (interface de linha de comando) ou a API (interface de programação de aplicativos).
Criar a Função
Comece com o código de amostra abaixo para criar uma função para arquivar tíquetes ServiceNow e, em seguida, autorizar a função a acessar suas credenciais ServiceNow no segredo criado usando o serviço Oracle Cloud Infrastructure Vault.
A amostra de código inclui as variáveis SNOW_URL, SNOW_USER_ID_SEC e SNOW_USER_PWD_SEC que são usadas na função hipotética. Você pode optar por ler esses valores diretamente da função ou informar os valores como parâmetros de configuração personalizados.
#####################################################
# 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
Use um grupo dinâmico para conceder à sua função a capacidade de ler segredos. Sua função deve ter essa autorização para acessar suas credenciais ServiceNow, que são armazenadas nos segredos que você criou anteriormente.
Criar o Tópico
Crie o tópico que você usará para as inscrições e o alarme.
Um tópico é um canal de comunicação para enviar mensagens a inscrições. Cada nome de tópico é exclusivo na tenancy. Você pode criar o tópico usando a console, a CLI (interface de linha de comando) ou a API (interface de programação de aplicativos).
Implante a função para usá-la com um tópico.
Criar as Assinaturas
Crie a assinatura para o tópico.
Uma assinatura é um ponto final para um tópico. As mensagens publicadas são enviadas a cada inscrição de um tópico.
Você deve implantar a função antes de usá-la com uma assinatura e deve ter a permissão FN_INVOCATION
para que a função possa adicionar a função como uma inscrição em um tópico.
- Para criar a assinatura de função usando a console:
- Para criar uma assinatura de e-mail opcional usando a console:
- Para criar uma assinatura usando a CLI:
- Para criar uma assinatura usando a API: