diff --git a/utils/stats_utils.py b/utils/stats_utils.py
index 503baf7..fd0f3b8 100644
--- a/utils/stats_utils.py
+++ b/utils/stats_utils.py
@@ -13,18 +13,62 @@ def fetch_haproxy_stats():
def parse_haproxy_stats(stats_data):
data = []
- header_row = stats_data.splitlines()[0].replace('# ', '')
- reader = csv.DictReader(stats_data.splitlines(), fieldnames=header_row.split(','))
- next(reader)
+
+ # 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:
- if row['svname'] != 'BACKEND':
- data.append({
- 'frontend_name': row['pxname'],
- 'server_name': row['svname'],
- '4xx_errors': row['hrsp_4xx'],
- '5xx_errors': row['hrsp_5xx'],
- 'bytes_in_mb': f'{float(row["bin"]) / (1024 * 1024):.2f}',
- 'bytes_out_mb': f'{float(row["bout"]) / (1024 * 1024):.2f}',
- 'conn_tot': row['conn_tot'],
- })
- return data
\ No newline at end of file
+ # 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 = f'{bin_bytes / (1024 * 1024):.2f}'
+ except (ValueError, TypeError):
+ bytes_in_mb = '0.00'
+
+ try:
+ bout_bytes = float(row.get('bout', 0) or 0)
+ bytes_out_mb = f'{bout_bytes / (1024 * 1024):.2f}'
+ except (ValueError, TypeError):
+ bytes_out_mb = '0.00'
+
+ 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,
+ 'bytes_out_mb': bytes_out_mb,
+ 'conn_tot': conn_tot, # ✅ Teraz INT
+ })
+
+ return data