diff --git a/src/logging/mod.rs b/src/logging/mod.rs
index 7eeb0895..0b20f5f8 100644
--- a/src/logging/mod.rs
+++ b/src/logging/mod.rs
@@ -2,7 +2,7 @@ use chrono::{DateTime, Utc};
use serde::Serialize;
use sqlx::SqlitePool;
use tokio::sync::broadcast;
-use tracing::warn;
+use tracing::{info, warn};
use crate::errors::AppError;
@@ -42,14 +42,19 @@ impl RequestLogger {
// Spawn async task to log without blocking response
tokio::spawn(async move {
// Broadcast to dashboard
- let _ = tx.send(serde_json::json!({
+ let broadcast_result = tx.send(serde_json::json!({
"type": "request",
"channel": "requests",
"payload": log
}));
+ match broadcast_result {
+ Ok(receivers) => info!("Broadcast request log to {} dashboard listeners", receivers),
+ Err(_) => {} // No active WebSocket clients — expected when dashboard isn't open
+ }
- if let Err(e) = Self::insert_log(&pool, log).await {
- warn!("Failed to log request to database: {}", e);
+ match Self::insert_log(&pool, log).await {
+ Ok(()) => info!("Request logged to database successfully"),
+ Err(e) => warn!("Failed to log request to database: {}", e),
}
});
}
diff --git a/static/js/pages/monitoring.js b/static/js/pages/monitoring.js
index 24a0b184..6077b2c9 100644
--- a/static/js/pages/monitoring.js
+++ b/static/js/pages/monitoring.js
@@ -403,7 +403,7 @@ class MonitoringPage {
${request.client_id || 'Unknown'} →
${request.provider || 'Unknown'} (${request.model || 'Unknown'})
- ${request.tokens || 0} tokens • ${request.duration || 0}ms
+ ${request.total_tokens || request.tokens || 0} tokens • ${request.duration_ms || request.duration || 0}ms
`;
@@ -493,28 +493,7 @@ class MonitoringPage {
}
startDemoUpdates() {
- // Simulate incoming requests for demo purposes
- if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') {
- setInterval(() => {
- if (!this.isPaused && Math.random() > 0.3) { // 70% chance
- this.simulateRequest();
- }
- }, 2000);
-
- // Simulate logs
- setInterval(() => {
- if (!this.isPaused && Math.random() > 0.5) { // 50% chance
- this.simulateLog();
- }
- }, 3000);
-
- // Simulate metrics
- setInterval(() => {
- if (!this.isPaused) {
- this.simulateMetric();
- }
- }, 5000);
- }
+ // Demo updates disabled — real data comes via WebSocket subscriptions
}
simulateRequest() {
diff --git a/static/js/pages/overview.js b/static/js/pages/overview.js
index 42be02a1..4fce32ce 100644
--- a/static/js/pages/overview.js
+++ b/static/js/pages/overview.js
@@ -129,13 +129,14 @@ class OverviewPage {
async loadRequestsChart() {
try {
const data = await window.api.get('/usage/time-series');
+ const series = data.series || [];
const chartData = {
- labels: data.map(item => item.hour),
+ labels: series.map(item => item.time),
datasets: [
{
label: 'Requests',
- data: data.map(item => item.requests),
+ data: series.map(item => item.requests),
color: '#3b82f6',
fill: true
}
diff --git a/static/js/websocket.js b/static/js/websocket.js
index 5130acc6..36c58774 100644
--- a/static/js/websocket.js
+++ b/static/js/websocket.js
@@ -88,8 +88,8 @@ class WebSocketManager {
}
handleMessage(data) {
- // Handle global events
- if (data.type === 'request' || data.type === 'request') {
+ // Handle request events
+ if (data.type === 'request') {
this.notify('requests', data.payload);
}
@@ -286,9 +286,9 @@ class WebSocketManager {
// Update token counters
const tokenCountElement = document.querySelector('[data-stat="total-tokens"]');
- if (tokenCountElement && request.tokens) {
+ if (tokenCountElement && (request.total_tokens || request.tokens)) {
const currentTokens = parseInt(tokenCountElement.textContent) || 0;
- tokenCountElement.textContent = currentTokens + request.tokens;
+ tokenCountElement.textContent = currentTokens + (request.total_tokens || request.tokens);
}
}
@@ -312,7 +312,7 @@ class WebSocketManager {
${request.client_id || 'Unknown'} |
${request.provider || 'Unknown'} |
${request.model || 'Unknown'} |
- ${request.tokens || 0} |
+ ${(request.total_tokens || request.tokens || 0)} |
@@ -362,7 +362,7 @@ class WebSocketManager {
${request.client_id || 'Unknown'} →
${request.provider || 'Unknown'} (${request.model || 'Unknown'})
- ${request.tokens || 0} tokens • ${request.duration || 0}ms
+ ${(request.total_tokens || request.tokens || 0)} tokens • ${(request.duration_ms || request.duration || 0)}ms
`;
|