Files
haproxy-dashboard/utils/stats_utils.py
Mateusz Gruszczyński acef7eb610 new options
2025-11-03 09:53:30 +01:00

75 lines
2.3 KiB
Python

import requests
import csv
HAPROXY_STATS_URL = 'http://127.0.0.1:8404/stats;csv'
def fetch_haproxy_stats():
try:
response = requests.get(HAPROXY_STATS_URL)
response.raise_for_status()
return response.text
except requests.exceptions.RequestException as e:
return str(e)
def parse_haproxy_stats(stats_data):
data = []
# Skip empty lines and get header
lines = [line for line in stats_data.splitlines() if line.strip()]
if not lines:
return data
header_row = lines[0].replace('# ', '')
# Parse CSV
reader = csv.DictReader(lines, fieldnames=header_row.split(','))
next(reader) # Skip header
for row in reader:
# Only process servers, skip BACKEND summary rows
if row.get('svname') == 'BACKEND':
continue
# Strip whitespace from values
row = {k: v.strip() if isinstance(v, str) else v for k, v in row.items()}
# Safe conversion to int/float
try:
conn_tot = int(row.get('conn_tot', 0) or 0)
except (ValueError, TypeError):
conn_tot = 0
try:
hrsp_4xx = int(row.get('hrsp_4xx', 0) or 0)
except (ValueError, TypeError):
hrsp_4xx = 0
try:
hrsp_5xx = int(row.get('hrsp_5xx', 0) or 0)
except (ValueError, TypeError):
hrsp_5xx = 0
try:
bin_bytes = float(row.get('bin', 0) or 0)
bytes_in_mb = bin_bytes / (1024 * 1024) # ✅ FLOAT, nie string!
except (ValueError, TypeError):
bytes_in_mb = 0.0
try:
bout_bytes = float(row.get('bout', 0) or 0)
bytes_out_mb = bout_bytes / (1024 * 1024) # ✅ FLOAT, nie string!
except (ValueError, TypeError):
bytes_out_mb = 0.0
data.append({
'frontend_name': row.get('pxname', 'Unknown'),
'server_name': row.get('svname', 'Unknown'),
'4xx_errors': hrsp_4xx,
'5xx_errors': hrsp_5xx,
'bytes_in_mb': bytes_in_mb, # ✅ Float
'bytes_out_mb': bytes_out_mb, # ✅ Float
'conn_tot': conn_tot, # ✅ Int
})
return data