Fix Cluster Overcommit Summary display

- Add overcommit data processing in /cluster/status endpoint
- Extract CPU/Memory capacity and requests from Prometheus
- Calculate overcommit percentages and resource quota coverage
- Update frontend to use new overcommit data structure
- Fix issue where Cluster Overcommit Summary was showing all zeros
This commit is contained in:
2025-10-01 15:13:04 -03:00
parent fae1d6fb18
commit b83c55bf08
2 changed files with 62 additions and 5 deletions

View File

@@ -136,6 +136,50 @@ async def get_cluster_status(
total_errors = sum(ns['severity_breakdown']['error'] for ns in namespaces_list) total_errors = sum(ns['severity_breakdown']['error'] for ns in namespaces_list)
total_warnings = sum(ns['severity_breakdown']['warning'] for ns in namespaces_list) total_warnings = sum(ns['severity_breakdown']['warning'] for ns in namespaces_list)
# Process overcommit information
cpu_overcommit_percent = 0
memory_overcommit_percent = 0
namespaces_in_overcommit = 0
resource_quota_coverage = 0
if overcommit_info and overcommit_info.get("cpu") and overcommit_info.get("memory"):
cpu_capacity = 0
cpu_requests = 0
memory_capacity = 0
memory_requests = 0
# Extract CPU data
if overcommit_info["cpu"].get("capacity", {}).get("status") == "success":
for result in overcommit_info["cpu"]["capacity"].get("data", {}).get("result", []):
cpu_capacity += float(result["value"][1])
if overcommit_info["cpu"].get("requests", {}).get("status") == "success":
for result in overcommit_info["cpu"]["requests"].get("data", {}).get("result", []):
cpu_requests += float(result["value"][1])
# Extract Memory data
if overcommit_info["memory"].get("capacity", {}).get("status") == "success":
for result in overcommit_info["memory"]["capacity"].get("data", {}).get("result", []):
memory_capacity += float(result["value"][1])
if overcommit_info["memory"].get("requests", {}).get("status") == "success":
for result in overcommit_info["memory"]["requests"].get("data", {}).get("result", []):
memory_requests += float(result["value"][1])
# Calculate overcommit percentages
if cpu_capacity > 0:
cpu_overcommit_percent = round((cpu_requests / cpu_capacity) * 100, 1)
if memory_capacity > 0:
memory_overcommit_percent = round((memory_requests / memory_capacity) * 100, 1)
# Count namespaces in overcommit (simplified - any namespace with requests > 0)
namespaces_in_overcommit = len([ns for ns in namespaces_list if ns['total_validations'] > 0])
# Calculate resource quota coverage (simplified)
if cpu_capacity > 0 and memory_capacity > 0:
resource_quota_coverage = round(((cpu_requests + memory_requests) / (cpu_capacity + memory_capacity)) * 100, 1)
return { return {
"timestamp": datetime.now().isoformat(), "timestamp": datetime.now().isoformat(),
"total_pods": len(pods), "total_pods": len(pods),
@@ -143,7 +187,13 @@ async def get_cluster_status(
"total_nodes": len(nodes_info) if nodes_info else 0, "total_nodes": len(nodes_info) if nodes_info else 0,
"total_errors": total_errors, "total_errors": total_errors,
"total_warnings": total_warnings, "total_warnings": total_warnings,
"namespaces": namespaces_list "namespaces": namespaces_list,
"overcommit": {
"cpu_overcommit_percent": cpu_overcommit_percent,
"memory_overcommit_percent": memory_overcommit_percent,
"namespaces_in_overcommit": namespaces_in_overcommit,
"resource_quota_coverage": resource_quota_coverage
}
} }
except Exception as e: except Exception as e:

View File

@@ -1052,10 +1052,17 @@
document.getElementById('criticalIssues').textContent = data.critical_issues || 0; document.getElementById('criticalIssues').textContent = data.critical_issues || 0;
// Update overcommit metrics // Update overcommit metrics
document.getElementById('cpuOvercommit').textContent = data.cpu_overcommit ? `${data.cpu_overcommit}%` : '0%'; if (data.overcommit) {
document.getElementById('memoryOvercommit').textContent = data.memory_overcommit ? `${data.memory_overcommit}%` : '0%'; document.getElementById('cpuOvercommit').textContent = `${data.overcommit.cpu_overcommit_percent}%`;
document.getElementById('namespacesInOvercommit').textContent = data.namespaces_in_overcommit || 0; document.getElementById('memoryOvercommit').textContent = `${data.overcommit.memory_overcommit_percent}%`;
document.getElementById('resourceQuotaCoverage').textContent = data.resource_quota_coverage ? `${data.resource_quota_coverage}%` : '0%'; document.getElementById('namespacesInOvercommit').textContent = data.overcommit.namespaces_in_overcommit || 0;
document.getElementById('resourceQuotaCoverage').textContent = `${data.overcommit.resource_quota_coverage}%`;
} else {
document.getElementById('cpuOvercommit').textContent = '0%';
document.getElementById('memoryOvercommit').textContent = '0%';
document.getElementById('namespacesInOvercommit').textContent = '0';
document.getElementById('resourceQuotaCoverage').textContent = '0%';
}
// Update status // Update status
const statusIcon = document.getElementById('clusterStatusIcon'); const statusIcon = document.getElementById('clusterStatusIcon');