Dashboard update.

This commit is contained in:
2025-11-29 15:53:05 +00:00
parent b1045b8bc2
commit d07ee4090c
2 changed files with 76 additions and 20 deletions
+56 -17
View File
@@ -1277,15 +1277,34 @@
stateEl.classList.remove('loading'); stateEl.classList.remove('loading');
let badgeClass = 'badge-info'; let badgeClass = 'badge-info';
let stateText = data.state || 'unknown';
// For cluster mode, determine state from instance counts
if (data.instances_open !== undefined) {
// Cluster mode data
if (data.instances_open > 0) {
stateText = `${data.instances_open} open`;
badgeClass = 'badge-danger';
} else if (data.instances_halfopen > 0) {
stateText = `${data.instances_halfopen} half-open`;
badgeClass = 'badge-warning';
} else if (data.instances_closed > 0) {
stateText = `${data.instances_closed} closed`;
badgeClass = 'badge-success';
}
} else {
// Single instance mode
if (data.state === 'closed') badgeClass = 'badge-success'; if (data.state === 'closed') badgeClass = 'badge-success';
else if (data.state === 'open') badgeClass = 'badge-danger'; else if (data.state === 'open') badgeClass = 'badge-danger';
else if (data.state === 'half-open') badgeClass = 'badge-warning'; else if (data.state === 'half-open') badgeClass = 'badge-warning';
}
stateEl.innerHTML = `<span class="badge ${badgeClass}">${data.state || 'Unknown'}</span>`; stateEl.innerHTML = `<span class="badge ${badgeClass}">${stateText}</span>`;
document.getElementById('cb-enabled').textContent = data.enabled ? 'Yes' : 'No'; document.getElementById('cb-enabled').textContent = data.enabled ? 'Yes' : 'No';
if (data.counts) { if (data.counts) {
// Single instance mode with detailed counts
document.getElementById('cb-total-requests').textContent = document.getElementById('cb-total-requests').textContent =
(data.counts.requests || 0).toLocaleString(); (data.counts.requests || 0).toLocaleString();
document.getElementById('cb-total-successes').textContent = document.getElementById('cb-total-successes').textContent =
@@ -1296,6 +1315,14 @@
(data.counts.consecutive_successes || 0).toLocaleString(); (data.counts.consecutive_successes || 0).toLocaleString();
document.getElementById('cb-consecutive-failures').textContent = document.getElementById('cb-consecutive-failures').textContent =
(data.counts.consecutive_failures || 0).toLocaleString(); (data.counts.consecutive_failures || 0).toLocaleString();
} else if (data.instances_open !== undefined) {
// Cluster mode - show instance distribution instead
const total = (data.instances_open || 0) + (data.instances_closed || 0) + (data.instances_halfopen || 0);
document.getElementById('cb-total-requests').textContent = total + ' instances';
document.getElementById('cb-total-successes').textContent = (data.instances_closed || 0).toLocaleString();
document.getElementById('cb-total-failures').textContent = (data.instances_open || 0).toLocaleString();
document.getElementById('cb-consecutive-successes').textContent = '--';
document.getElementById('cb-consecutive-failures').textContent = '--';
} }
if (data.config) { if (data.config) {
@@ -1307,23 +1334,31 @@
function updateCoalescing(data) { function updateCoalescing(data) {
document.getElementById('coalescing-rate').textContent = document.getElementById('coalescing-rate').textContent =
(data.backend_savings_pct || 0).toFixed(1) + '%'; (data.backend_savings_pct || 0).toFixed(1) + '%';
document.getElementById('coalescing-total').textContent =
(data.total_requests || 0).toLocaleString(); // Handle both single instance (total_requests) and cluster mode (total_coalesced + total_primary)
document.getElementById('coalescing-primary').textContent = const totalRequests = data.total_requests ||
(data.primary_requests || 0).toLocaleString(); ((data.total_coalesced_requests || 0) + (data.total_primary_requests || 0));
document.getElementById('coalescing-coalesced').textContent = document.getElementById('coalescing-total').textContent = totalRequests.toLocaleString();
(data.coalesced_requests || 0).toLocaleString();
// Handle both single instance and cluster mode field names
const primaryRequests = data.primary_requests || data.total_primary_requests || 0;
document.getElementById('coalescing-primary').textContent = primaryRequests.toLocaleString();
const coalescedRequests = data.coalesced_requests || data.total_coalesced_requests || 0;
document.getElementById('coalescing-coalesced').textContent = coalescedRequests.toLocaleString();
document.getElementById('coalescing-savings').textContent = document.getElementById('coalescing-savings').textContent =
(data.backend_savings_pct || 0).toFixed(1) + '%'; (data.backend_savings_pct || 0).toFixed(1) + '%';
} }
function updateRetryBudget(data) { function updateRetryBudget(data) {
document.getElementById('retry-tokens').textContent = // Use explicit undefined check to handle 0 values correctly
data.current_tokens || '--'; const currentTokens = data.current_tokens !== undefined ? data.current_tokens : '--';
document.getElementById('retry-current-tokens').textContent = const maxTokens = data.max_tokens !== undefined ? data.max_tokens : '--';
data.current_tokens || '--';
document.getElementById('retry-max-tokens').textContent = document.getElementById('retry-tokens').textContent = currentTokens;
data.max_tokens || '--'; document.getElementById('retry-current-tokens').textContent = currentTokens;
document.getElementById('retry-max-tokens').textContent = maxTokens;
document.getElementById('retry-total').textContent = document.getElementById('retry-total').textContent =
(data.total_attempts || 0).toLocaleString(); (data.total_attempts || 0).toLocaleString();
document.getElementById('retry-denied').textContent = document.getElementById('retry-denied').textContent =
@@ -1333,13 +1368,17 @@
} }
function updateWebSocket(data) { function updateWebSocket(data) {
document.getElementById('ws-connections').textContent = // Handle both single instance (active_connections) and cluster mode (total_connections)
data.active_connections || 0; const connections = data.active_connections !== undefined ? data.active_connections :
(data.total_connections !== undefined ? data.total_connections : 0);
document.getElementById('ws-connections').textContent = connections;
} }
function updateConnections(data) { function updateConnections(data) {
document.getElementById('pool-connections').textContent = // Handle both single instance (active_connections) and cluster mode (total_active)
data.active_connections || 0; const connections = data.active_connections !== undefined ? data.active_connections :
(data.total_active !== undefined ? data.total_active : 0);
document.getElementById('pool-connections').textContent = connections;
} }
async function resetCoalescing() { async function resetCoalescing() {
+17
View File
@@ -519,7 +519,10 @@ func (ma *MetricsAggregator) aggregateStats(instances []InstanceMetrics) map[str
totalRetryAllowed int64 totalRetryAllowed int64
totalRetryDenied int64 totalRetryDenied int64
totalRetryAttempts int64 totalRetryAttempts int64
totalCurrentTokens int64
totalMaxTokens int64
retryBudgetEnabled = false retryBudgetEnabled = false
retryTokensPerSec float64 // Use max tokens_per_sec from any instance
// Circuit breaker stats // Circuit breaker stats
cbOpenCount int cbOpenCount int
@@ -645,6 +648,17 @@ func (ma *MetricsAggregator) aggregateStats(instances []InstanceMetrics) map[str
if attempts, ok := instance.RetryBudget["total_attempts"].(float64); ok { if attempts, ok := instance.RetryBudget["total_attempts"].(float64); ok {
totalRetryAttempts += int64(attempts) totalRetryAttempts += int64(attempts)
} }
if currentTokens, ok := instance.RetryBudget["current_tokens"].(float64); ok {
totalCurrentTokens += int64(currentTokens)
}
if maxTokens, ok := instance.RetryBudget["max_tokens"].(float64); ok {
totalMaxTokens += int64(maxTokens)
}
if tokensPerSec, ok := instance.RetryBudget["tokens_per_sec"].(float64); ok {
if tokensPerSec > retryTokensPerSec {
retryTokensPerSec = tokensPerSec
}
}
} }
// Aggregate circuit breaker stats // Aggregate circuit breaker stats
@@ -748,6 +762,9 @@ func (ma *MetricsAggregator) aggregateStats(instances []InstanceMetrics) map[str
"denied_retries": totalRetryDenied, "denied_retries": totalRetryDenied,
"total_attempts": totalRetryAttempts, "total_attempts": totalRetryAttempts,
"denial_rate_pct": retryDenialRate, "denial_rate_pct": retryDenialRate,
"current_tokens": totalCurrentTokens,
"max_tokens": totalMaxTokens,
"tokens_per_sec": retryTokensPerSec,
}, },
"circuit_breaker": map[string]interface{}{ "circuit_breaker": map[string]interface{}{
"enabled": circuitBreakerEnabled, "enabled": circuitBreakerEnabled,