75 lines
2.3 KiB
Python
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
|