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