testes/app/routes/zabbix.py

124 lines
4.2 KiB
Python

from flask import Flask, jsonify, Blueprint
from pyzabbix import ZabbixAPI
from .auth import token_required
from flask_mysqldb import MySQL
from datetime import datetime
zabbix = Blueprint('zabbix', __name__)
mysql = MySQL()
# Função para formatar uptime (segundos → dias, horas, minutos, segundos)
def formatar_tempo(segundos):
try:
segundos = int(segundos)
dias = segundos // 86400
horas = (segundos % 86400) // 3600
minutos = (segundos % 3600) // 60
segundos = segundos % 60
return f"{dias}d {horas}h {minutos}m {segundos}s"
except (ValueError, TypeError):
return "N/A"
# Função para converter timestamp para data legível
def formatar_data(timestamp):
try:
timestamp = int(timestamp)
return datetime.utcfromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
except (ValueError, TypeError):
return "N/A"
# Função para conectar ao Zabbix e obter os dados tratados
def get_zabbix_data(group_name_filter=None):
data = []
try:
zabbix = ZabbixAPI("https://mimir.itguys.com.br/zabbix/api_jsonrpc.php")
zabbix.login('vitoria.oliveira', '123Mudar')
groups = zabbix.hostgroup.get(output="extend")
for group in groups:
if group_name_filter and group_name_filter.lower() not in group['name'].lower():
continue
group_data = {
'group_id': group['groupid'],
'group_name': group['name'],
'hosts': []
}
hosts = zabbix.host.get(groupids=group['groupid'], output="extend")
for host in hosts:
host_data = {
'host_name': host['name'],
'metrics': []
}
items = zabbix.item.get(
hostids=host['hostid'],
output=["itemid", "name", "key_", "lastvalue", "lastclock"]
)
for item in items:
key = item.get('key_', 'N/A')
value = item.get('lastvalue', 'N/A')
timestamp = item.get('lastclock', 'N/A')
if key == "system.uptime":
value = formatar_tempo(value)
metric = {
'key': key,
'value': value,
'last_update': formatar_data(timestamp)
}
host_data['metrics'].append(metric)
network_packet_loss = zabbix.item.get(
hostids=host['hostid'],
filter={"key_": "net.ping.loss"},
output=["lastvalue", "lastclock"]
)
for loss in network_packet_loss:
host_data['metrics'].append({
'key': 'net.ping.loss',
'value': loss.get('lastvalue', 'N/A'),
'last_update': formatar_data(loss.get('lastclock', 'N/A'))
})
group_data['hosts'].append(host_data)
data.append(group_data)
return data # Retorna os dados coletados
except Exception as e:
print(f"Erro ao obter dados do Zabbix: {str(e)}")
raise # Re-raise the exception
# Rota para obter dados do Zabbix
@zabbix.route('/metrics', methods=['POST'])
@token_required
def get_data(data):
try:
domain = data.get('domain')
cur = mysql.connection.cursor()
cur.execute("SELECT grupo_zabbix FROM empresa WHERE dominio = %s", (domain,))
result = cur.fetchone()
cur.close()
if result:
group_name_filter = result['grupo_zabbix']
print(f"Grupo Zabbix encontrado no banco: {group_name_filter}")
else:
return jsonify({"error": "Grupo Zabbix não encontrado para o domínio."}), 404
# Coletar os dados do Zabbix
zabbix_data = get_zabbix_data(group_name_filter=group_name_filter)
return jsonify({"message": "Dados obtidos com sucesso.", "data": zabbix_data})
except Exception as e:
print(f"Erro ao processar a solicitação: {str(e)}")
return jsonify({"error": str(e)}), 500