Obter Http Status Code de uma lista de Function Apps do Azure e enviar para o Zabbix

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é-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)
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 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()
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

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
No matter how complicated your life is, you have to maintain your elegance.
不论生活如何复杂,总要保持自己的那一份优雅
评论 抢沙发

请登录后发表评论

    暂无评论内容