124 lines
4.2 KiB
Python
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
|