Para funcionamento é necessário estar logado no Azure autorizando o dispositivo onde estão os arquivos de monitoramento com um usuário que tenha permissões para verificar status das functions no Azure.
az login --use-device-code
Abaixo instruções de realização do login pelo Azure CLI.
Pré-requisitos
Az cli
Python 3.6 ou superior
Zabbix Sender (necessário para envio das informações ao zabbix usando agendamento de execução pelo sistema operacional)
1 - Criar no diretório home do seu usuário o diretório statusfuncapp e dentro dele o diretório logstatus:
mkdir -p statusfuncapp/{logstatus}
O diretório logstatus apenas irá gravar um arquivo texto de log do status atual de cada function verificada.
2 - Criar no diretório statusfuncapp o arquivo listfunctionapp.json que conterá as informações sobre as functions app e function 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:
subscriptionId — Id da Subscription no azure que a function app pertence
resourcegroup — Nome do Resource Group no azure que a function app pertence
functionapp — Nome da Function App
function — Nome da Function
zabbixkey — Nome único para cada function a ser criado como chave no zabbix (zabbix key)
Abaixo o conteúdo do arquivo:
{
"azurefunction": [
{
"subscriptionId": "xxxxxxx-yyyy-zzzz-wwww-kkkkkkkkkkkk",
"resourcegroup": "RGTesteFunc",
"functionapp": "namefunctionapp1",
"function": "namefunction1",
"zabbixkey": "key.nomefunctionapp1.function"
},
{
"subscriptionId": "xxxxxxx-yyyy-zzzz-wwww-kkkkkkkkkkkk",
"resourcegroup": "RGTesteFunc",
"functionapp": "namefunctionapp2",
"function": "namefunction2",
"zabbixkey": "key.nomefunctionapp2.function"
}
]
}
Podem ser adicionadas várias functions a serem monitoradas, apenas seguir esse estrutura acima do json.
3 - Criar no diretório statusfuncapp o arquivo vfuncapp.py que conterá o script python com a instruções de obter as informações das functions conforme existentes no arquivo listfunctionapp.json.
import json
import os
import io
import sys
import csv
import socket
from datetime import datetime
### Funcao de limpeza do log
def limpaLog():
pathLog = r"/home/user/statusfuncapp/logfunctionapp.log"
### cria/escreve arquivo de log MongoDB
with io.open(pathLog, 'w', encoding='utf-8') as f:
f.write(str(''))
### Funcao de gravacao do log
def gravaLog(msglog):
pathLog = r"/home/user/statusfuncapp/logfunctionapp.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))
### Funcao de leitura do arquivo json com as informacoes das functions
def readJson():
### variaveis
msg = ''
pathJsonFunction = r'/home/user/statusfuncapp/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_subscription = str(data["azurefunction"][i]["subscriptionId"])
v_resourcegroup = str(data["azurefunction"][i]["resourcegroup"])
v_functionappname = str(data["azurefunction"][i]["functionapp"])
v_functionname = str(data["azurefunction"][i]["function"])
v_keyzabbix = str(data["azurefunction"][i]["zabbixkey"])
#print(f"{v_functionappname} - {v_functionname}")
try:
## Monta o comando de execucao via az cli
cmd = 'az functionapp function show --subscription ' + v_subscription + ' -g ' + v_resourcegroup + ' -n ' + v_functionappname + ' --function-name ' + v_functionname
## Executa e pega o retorno em formato json
retorno = os.popen(cmd).read()
#print(retorno)
## Monta dicionario do json e exibe somente o valor requerido
data_dict = json.loads(retorno)
statusFunction = str(data_dict["isDisabled"])
#print(data_dict["isDisabled"])
### Verifica os status da function
### conforme o retorno do campo isDisabled
if(statusFunction == 'True'):
statusAux = 'Disable'
elif (statusFunction == 'False'):
statusAux = 'Enabled'
else:
statusAux = 'Desconhecido'
except:
msg = msg + f'Erro functionApp: {v_functionappname} - function name: {v_functionname}\n'
statusAux = 'Error'
#msg = f'FunctionApp : {v_functionApp}, FunctionName : {v_functionName} ,Status : {statusAux}'
strcsvAux = f'{v_functionappname},{v_functionname},{statusAux},{v_keyzabbix}'
#print(strcsvAux)
msg = msg + strcsvAux + '\n'
### chamada das funcoes de gravacao status e envio ao zabbix server
gravaStatusFunction(v_functionappname, statusAux)
zabbixSenderStatus(v_keyzabbix, statusAux)
i = i + 1
gravaLog(msg)
#print(msg)
### Funcao de gravacao do status das functions
def gravaStatusFunction(functionApp, fstatus):
### variaveis do local de gravacao dos status
strResult = r"/home/user/statusfuncapp/logstatus"
strResult = os.path.join(strResult, functionApp + '.txt')
pathCsvResult = strResult
with open(pathCsvResult, 'w', encoding='utf-8') as csvf:
csvf.write(fstatus)
### Funcao de envio das informacoes de status das functions via zabbix_sender
def zabbixSenderStatus(zbxChave, zbxStatus):
### variaveis server e host monitorado
server = 'ip_server_zabbix'
myhost = socket.gethostname() #nome da maquina local
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()
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/statusfuncapp/vfuncapp.py
Após o procedimento é necessário criar no zabbix os itens para cada uma das functions a serem monitoradas.
Exemplo item para a function app “namefunctionapp1” e function “namefunction1” .
Nome do item no zabbix: “key.namefunctionapp1.function”
Top comments (0)