No artigo anterior postei um script que obtém o status da function que pertence a determinada function app onde exibe se a mesma está habilitada ou desabilitada Acesse Aqui.
No artigo atual iremos obter os status http code das function apps do Azure, assim podemos saber de uma forma facilitada uma lista de functions apps e seus status.
Bom vamos lá!
Pré-requisitosPython 3.6 ou superiorZabbix Sender (necessário para envio das informações ao zabbix usando agendamento de execução pelo sistema operacional)Pré-requisitos Python 3.6 ou superior Zabbix Sender (necessário para envio das informações ao zabbix usando agendamento de execução pelo sistema operacional)Pré-requisitos Python 3.6 ou superior Zabbix Sender (necessário para envio das informações ao zabbix usando agendamento de execução pelo sistema operacional)
Enter fullscreen mode Exit fullscreen mode
1 – Criar no diretório home do seu usuário o diretório statusUrlfuncapp e dentro dele os diretórios logstatus e loghistorico:
mkdir -p statusUrlfuncapp/{logstatus,loghistorico}
O diretório logstatus apenas irá gravar um arquivo texto de log do status atual de cada function verificada.
O diretório loghistorico irá receber o log diário dos status obtidos e adicionar mais informações de log em execuções posteriores no mesmo dia.
2 – Criar no diretório statusUrlfuncapp o arquivo listfunctionapp.json que conterá as informações sobre as functions apps a serem monitoradas. Digite no terminal conforme abaixo:
nano listfunctionapp.json
Observações:
Abaixo uma explicação sobre cada um dos campos do arquivo json a seguir:
functionapp — Nome da Function App
urlfunctionapp – Url da Function App
zabbixkeyurl — Nome único para cada function a ser criado como chave no zabbix (zabbix key)
Abaixo o conteúdo do arquivo:
{"azurefunction": [{"functionapp": "namefunctionapp1","urlfunctionapp": "https://namefunctionapp1.azurewebsites.net","zabbixkeyurl": "key.url.namefunctionapp1.function"},{"functionapp": "namefunctionapp2","urlfunctionapp": "https://namefunctionapp2.azurewebsites.net","zabbixkeyurl": "key.url.namefunctionapp2.function"}]}{ "azurefunction": [ { "functionapp": "namefunctionapp1", "urlfunctionapp": "https://namefunctionapp1.azurewebsites.net", "zabbixkeyurl": "key.url.namefunctionapp1.function" }, { "functionapp": "namefunctionapp2", "urlfunctionapp": "https://namefunctionapp2.azurewebsites.net", "zabbixkeyurl": "key.url.namefunctionapp2.function" } ] }{ "azurefunction": [ { "functionapp": "namefunctionapp1", "urlfunctionapp": "https://namefunctionapp1.azurewebsites.net", "zabbixkeyurl": "key.url.namefunctionapp1.function" }, { "functionapp": "namefunctionapp2", "urlfunctionapp": "https://namefunctionapp2.azurewebsites.net", "zabbixkeyurl": "key.url.namefunctionapp2.function" } ] }
Enter fullscreen mode Exit fullscreen mode
Podem ser adicionadas várias functions apps a serem monitoradas, apenas seguir esse estrutura acima do json.
3 – Criar no diretório statusUrlfuncapp o arquivo vfuncapp_urlstatus.py que conterá o script python com a instruções para obter as informações das functions apps conforme existentes no arquivo listfunctionapp.json.
import jsonimport osimport io#import sysimport socketimport requestsfrom datetime import datetimedef limpaLog():pathLog = r"/home/user/statusUrlfuncapp/logfunctionapp_urlstatus.log"### cria/escreve arquivo de logwith io.open(pathLog, 'w', encoding='utf-8') as f:f.write(str(''))def gravaLog(msglog):pathLog = r"/home/user/statusUrlfuncapp/logfunctionapp_urlstatus.log"datahora = datetime.now().strftime('%Y-%m-%d %H:%M:%S')### cria/escreve arquivo de log MongoDBwith io.open(pathLog, 'a', encoding='utf-8') as f:f.write(str('\n=====================================\n'))f.write(str(datahora + '\n' + msglog))def gravaLogHistorico(msgloghist):dataloghist = datetime.now().strftime('%Y-%m-%d')pathLog = r"/home/user/statusUrlfuncapp/loghistorico/logfunctionapp_urlstatusHist_" + dataloghist + ".log"datahora = datetime.now().strftime('%Y-%m-%d %H:%M:%S')### cria/escreve arquivo de log MongoDBwith io.open(pathLog, 'a', encoding='utf-8') as f:f.write(str('\n=====================================\n'))f.write(str(datahora + '\n' + msgloghist))def removeLogHistorico():### variaveis dos logs antigos a serem removidospathLog = r"/home/user/statusUrlfuncapp/loghistorico"diasRemover = 4### remove os logs acima de XX dias## cmd = 'find ' + pathLog + ' -type f -mtime +' + str(diasRemover) + ' -exec rm -f -r {} +'cmd = 'find ' + pathLog + ' -name "*.log" -type f -mtime +' + str(diasRemover) + ' -delete'print(cmd)os.popen(cmd)#somente app services workerdef verificaStatusUrlWorker(varUrl):p_Url = varUrltry:x = requests.get(p_Url)#print(x.status_code)#print('\nUrl: '+ str(varUrl) + '\nStatus Code Http: ' + str(x.status_code))return x.status_codeexcept:#print('\nUrl: '+ str(varUrl) + '\nOcorreu erro ao obter status da url')return 0def readJson():### variaveismsg = ''pathJsonFunction = r'/home/user/statusUrlfuncapp/listfunctionapp.json'i = 0### chamada da funcao de limpeza do log filelimpaLog()### codigo de leitura do json com as functions### nesse trecho ocorre o processamento dos dadoswith open(pathJsonFunction) as file:data = json.load(file)for functions in data["azurefunction"]:v_functionappname = str(data["azurefunction"][i]["functionapp"])v_urlfunctionapp = str(data["azurefunction"][i]["urlfunctionapp"])v_keyzabbix = str(data["azurefunction"][i]["zabbixkeyurl"])statusAux = str(verificaStatusUrlWorker(v_urlfunctionapp))#msg = f'FunctionApp : {v_functionApp}, UrlFunctionApp : {v_urlfunctionapp} , Http Status Code: {statusAux}'#print(f'FunctionApp: {v_functionappname}, UrlFunctionApp: {v_urlfunctionapp} , Http Status Code: {statusAux}')strcsvAux = f'{v_functionappname},{v_urlfunctionapp},{statusAux},{v_keyzabbix}'#print(strcsvAux)msg = msg + '\n' + strcsvAux + '\n'### chamada das funcoes de gravacao status e envio ao zabbix servergravaStatusFunction(v_functionappname, statusAux)zabbixSenderStatus(v_keyzabbix, statusAux)#print(f"\n****{v_functionappname} - {v_urlfunctionapp} - {statusAux}\n")gravaLogHistorico(f"\n****{v_functionappname} - {v_urlfunctionapp} - {statusAux}\n")i = i + 1gravaLog(msg)def gravaStatusFunction(functionApp, fstatus):### variaveis do local de gravacao dos statusstrResult = r"/home/user/statusUrlfuncapp/logstatus"strResult = os.path.join(strResult, functionApp + '.txt')pathCsvResult = strResultwith open(pathCsvResult, 'w', encoding='utf-8') as csvf:csvf.write(fstatus)def zabbixSenderStatus(zbxChave, zbxStatus):### variaveis server e host monitoradoserver = '10.10.9.2' #ip do zabbix servermyhost = socket.gethostname()zbxsendercmd = f'zabbix_sender -z {server} -s {myhost} -k {zbxChave} -o {zbxStatus}'retornozbx = os.popen(zbxsendercmd).read()#gravaLog(zbxsendercmd + '\n' + retornozbx)print(zbxsendercmd)print(retornozbx)### INICIO DA APLICACAOif __name__ == "__main__":readJson()removeLogHistorico()import json import os import io #import sys import socket import requests from datetime import datetime def limpaLog(): pathLog = r"/home/user/statusUrlfuncapp/logfunctionapp_urlstatus.log" ### cria/escreve arquivo de log with io.open(pathLog, 'w', encoding='utf-8') as f: f.write(str('')) def gravaLog(msglog): pathLog = r"/home/user/statusUrlfuncapp/logfunctionapp_urlstatus.log" datahora = datetime.now().strftime('%Y-%m-%d %H:%M:%S') ### cria/escreve arquivo de log MongoDB with io.open(pathLog, 'a', encoding='utf-8') as f: f.write(str('\n=====================================\n')) f.write(str(datahora + '\n' + msglog)) def gravaLogHistorico(msgloghist): dataloghist = datetime.now().strftime('%Y-%m-%d') pathLog = r"/home/user/statusUrlfuncapp/loghistorico/logfunctionapp_urlstatusHist_" + dataloghist + ".log" datahora = datetime.now().strftime('%Y-%m-%d %H:%M:%S') ### cria/escreve arquivo de log MongoDB with io.open(pathLog, 'a', encoding='utf-8') as f: f.write(str('\n=====================================\n')) f.write(str(datahora + '\n' + msgloghist)) def removeLogHistorico(): ### variaveis dos logs antigos a serem removidos pathLog = r"/home/user/statusUrlfuncapp/loghistorico" diasRemover = 4 ### remove os logs acima de XX dias ## cmd = 'find ' + pathLog + ' -type f -mtime +' + str(diasRemover) + ' -exec rm -f -r {} +' cmd = 'find ' + pathLog + ' -name "*.log" -type f -mtime +' + str(diasRemover) + ' -delete' print(cmd) os.popen(cmd) #somente app services worker def verificaStatusUrlWorker(varUrl): p_Url = varUrl try: x = requests.get(p_Url) #print(x.status_code) #print('\nUrl: '+ str(varUrl) + '\nStatus Code Http: ' + str(x.status_code)) return x.status_code except: #print('\nUrl: '+ str(varUrl) + '\nOcorreu erro ao obter status da url') return 0 def readJson(): ### variaveis msg = '' pathJsonFunction = r'/home/user/statusUrlfuncapp/listfunctionapp.json' i = 0 ### chamada da funcao de limpeza do log file limpaLog() ### codigo de leitura do json com as functions ### nesse trecho ocorre o processamento dos dados with open(pathJsonFunction) as file: data = json.load(file) for functions in data["azurefunction"]: v_functionappname = str(data["azurefunction"][i]["functionapp"]) v_urlfunctionapp = str(data["azurefunction"][i]["urlfunctionapp"]) v_keyzabbix = str(data["azurefunction"][i]["zabbixkeyurl"]) statusAux = str(verificaStatusUrlWorker(v_urlfunctionapp)) #msg = f'FunctionApp : {v_functionApp}, UrlFunctionApp : {v_urlfunctionapp} , Http Status Code: {statusAux}' #print(f'FunctionApp: {v_functionappname}, UrlFunctionApp: {v_urlfunctionapp} , Http Status Code: {statusAux}') strcsvAux = f'{v_functionappname},{v_urlfunctionapp},{statusAux},{v_keyzabbix}' #print(strcsvAux) msg = msg + '\n' + strcsvAux + '\n' ### chamada das funcoes de gravacao status e envio ao zabbix server gravaStatusFunction(v_functionappname, statusAux) zabbixSenderStatus(v_keyzabbix, statusAux) #print(f"\n****{v_functionappname} - {v_urlfunctionapp} - {statusAux}\n") gravaLogHistorico(f"\n****{v_functionappname} - {v_urlfunctionapp} - {statusAux}\n") i = i + 1 gravaLog(msg) def gravaStatusFunction(functionApp, fstatus): ### variaveis do local de gravacao dos status strResult = r"/home/user/statusUrlfuncapp/logstatus" strResult = os.path.join(strResult, functionApp + '.txt') pathCsvResult = strResult with open(pathCsvResult, 'w', encoding='utf-8') as csvf: csvf.write(fstatus) def zabbixSenderStatus(zbxChave, zbxStatus): ### variaveis server e host monitorado server = '10.10.9.2' #ip do zabbix server myhost = socket.gethostname() zbxsendercmd = f'zabbix_sender -z {server} -s {myhost} -k {zbxChave} -o {zbxStatus}' retornozbx = os.popen(zbxsendercmd).read() #gravaLog(zbxsendercmd + '\n' + retornozbx) print(zbxsendercmd) print(retornozbx) ### INICIO DA APLICACAO if __name__ == "__main__": readJson() removeLogHistorico()import json import os import io #import sys import socket import requests from datetime import datetime def limpaLog(): pathLog = r"/home/user/statusUrlfuncapp/logfunctionapp_urlstatus.log" ### cria/escreve arquivo de log with io.open(pathLog, 'w', encoding='utf-8') as f: f.write(str('')) def gravaLog(msglog): pathLog = r"/home/user/statusUrlfuncapp/logfunctionapp_urlstatus.log" datahora = datetime.now().strftime('%Y-%m-%d %H:%M:%S') ### cria/escreve arquivo de log MongoDB with io.open(pathLog, 'a', encoding='utf-8') as f: f.write(str('\n=====================================\n')) f.write(str(datahora + '\n' + msglog)) def gravaLogHistorico(msgloghist): dataloghist = datetime.now().strftime('%Y-%m-%d') pathLog = r"/home/user/statusUrlfuncapp/loghistorico/logfunctionapp_urlstatusHist_" + dataloghist + ".log" datahora = datetime.now().strftime('%Y-%m-%d %H:%M:%S') ### cria/escreve arquivo de log MongoDB with io.open(pathLog, 'a', encoding='utf-8') as f: f.write(str('\n=====================================\n')) f.write(str(datahora + '\n' + msgloghist)) def removeLogHistorico(): ### variaveis dos logs antigos a serem removidos pathLog = r"/home/user/statusUrlfuncapp/loghistorico" diasRemover = 4 ### remove os logs acima de XX dias ## cmd = 'find ' + pathLog + ' -type f -mtime +' + str(diasRemover) + ' -exec rm -f -r {} +' cmd = 'find ' + pathLog + ' -name "*.log" -type f -mtime +' + str(diasRemover) + ' -delete' print(cmd) os.popen(cmd) #somente app services worker def verificaStatusUrlWorker(varUrl): p_Url = varUrl try: x = requests.get(p_Url) #print(x.status_code) #print('\nUrl: '+ str(varUrl) + '\nStatus Code Http: ' + str(x.status_code)) return x.status_code except: #print('\nUrl: '+ str(varUrl) + '\nOcorreu erro ao obter status da url') return 0 def readJson(): ### variaveis msg = '' pathJsonFunction = r'/home/user/statusUrlfuncapp/listfunctionapp.json' i = 0 ### chamada da funcao de limpeza do log file limpaLog() ### codigo de leitura do json com as functions ### nesse trecho ocorre o processamento dos dados with open(pathJsonFunction) as file: data = json.load(file) for functions in data["azurefunction"]: v_functionappname = str(data["azurefunction"][i]["functionapp"]) v_urlfunctionapp = str(data["azurefunction"][i]["urlfunctionapp"]) v_keyzabbix = str(data["azurefunction"][i]["zabbixkeyurl"]) statusAux = str(verificaStatusUrlWorker(v_urlfunctionapp)) #msg = f'FunctionApp : {v_functionApp}, UrlFunctionApp : {v_urlfunctionapp} , Http Status Code: {statusAux}' #print(f'FunctionApp: {v_functionappname}, UrlFunctionApp: {v_urlfunctionapp} , Http Status Code: {statusAux}') strcsvAux = f'{v_functionappname},{v_urlfunctionapp},{statusAux},{v_keyzabbix}' #print(strcsvAux) msg = msg + '\n' + strcsvAux + '\n' ### chamada das funcoes de gravacao status e envio ao zabbix server gravaStatusFunction(v_functionappname, statusAux) zabbixSenderStatus(v_keyzabbix, statusAux) #print(f"\n****{v_functionappname} - {v_urlfunctionapp} - {statusAux}\n") gravaLogHistorico(f"\n****{v_functionappname} - {v_urlfunctionapp} - {statusAux}\n") i = i + 1 gravaLog(msg) def gravaStatusFunction(functionApp, fstatus): ### variaveis do local de gravacao dos status strResult = r"/home/user/statusUrlfuncapp/logstatus" strResult = os.path.join(strResult, functionApp + '.txt') pathCsvResult = strResult with open(pathCsvResult, 'w', encoding='utf-8') as csvf: csvf.write(fstatus) def zabbixSenderStatus(zbxChave, zbxStatus): ### variaveis server e host monitorado server = '10.10.9.2' #ip do zabbix server myhost = socket.gethostname() zbxsendercmd = f'zabbix_sender -z {server} -s {myhost} -k {zbxChave} -o {zbxStatus}' retornozbx = os.popen(zbxsendercmd).read() #gravaLog(zbxsendercmd + '\n' + retornozbx) print(zbxsendercmd) print(retornozbx) ### INICIO DA APLICACAO if __name__ == "__main__": readJson() removeLogHistorico()
Enter fullscreen mode Exit fullscreen mode
Após a criação dos arquivos na estrutura acima é necessário criar um agendamento para execução do mesmo via cron no Linux.
Como é um script que não necessita de execução via root pode ser criado o agendamento no cron do usuário logado no Linux mesmo, abaixo um exemplo:
## verifica status da function na functionapp azure roda a cada 6 minutos*/6 * * * * /usr/bin/python3 /home/user/statusUrlfuncapp/vfuncapp_urlstatus.py## verifica status da function na functionapp azure roda a cada 6 minutos */6 * * * * /usr/bin/python3 /home/user/statusUrlfuncapp/vfuncapp_urlstatus.py## verifica status da function na functionapp azure roda a cada 6 minutos */6 * * * * /usr/bin/python3 /home/user/statusUrlfuncapp/vfuncapp_urlstatus.py
Enter fullscreen mode Exit fullscreen mode
Após o procedimento é necessário criar no zabbix os itens para cada uma das functions apps a serem monitoradas.
Exemplo item para a function app “namefunctionapp1” e function “namefunction1” .
Nome do item no zabbix: “key.namefunctionapp1.function”
Com isso no zabbix pode-se criar um Screen com o tipo de visualização de dados “Data Overview” que irá apresentar os dados em um formato de tabela e os retornos dos status url podem ser mapeados para os tipos http status code conforme esse link: Acesse aqui.
原文链接:Obter Http Status Code de uma lista de Function Apps do Azure e enviar para o Zabbix
暂无评论内容