Update app.py
Browse files
app.py
CHANGED
|
@@ -6,7 +6,6 @@ import json
|
|
| 6 |
app = Flask(__name__)
|
| 7 |
|
| 8 |
lightModeStyle = """
|
| 9 |
-
/* ... (Your CSS styles, unchanged) ... */
|
| 10 |
* {
|
| 11 |
margin: 0;
|
| 12 |
padding: 0;
|
|
@@ -240,6 +239,7 @@ htmlTemplate = f"""
|
|
| 240 |
class MetricsManager {{
|
| 241 |
constructor() {{
|
| 242 |
this.eventSources = new Map();
|
|
|
|
| 243 |
this.instanceOwners = new Map();
|
| 244 |
this.spaceIds = new Map();
|
| 245 |
this.lastData = new Map(); // Store last received data
|
|
@@ -287,25 +287,24 @@ htmlTemplate = f"""
|
|
| 287 |
}}
|
| 288 |
|
| 289 |
const metricsManager = new MetricsManager();
|
| 290 |
-
const servers = new Map();
|
| 291 |
|
| 292 |
async function initialize() {{
|
| 293 |
const instances = await fetchInstances();
|
| 294 |
instances.forEach(instance => {{
|
| 295 |
metricsManager.connect(instance.id, instance.owner);
|
| 296 |
-
servers.set(instance.id, 0); // Initialize lastSeen to 0
|
| 297 |
}});
|
| 298 |
}}
|
| 299 |
|
| 300 |
|
| 301 |
function updateServerCard(data, spaceId) {{
|
| 302 |
-
const serverId = data.replica;
|
| 303 |
-
const serverElement = document.getElementById(`server-${serverId}`);
|
| 304 |
const owner = metricsManager.instanceOwners.get(spaceId);
|
| 305 |
|
| 306 |
if (!serverElement) {{
|
| 307 |
const card = document.createElement('div');
|
| 308 |
-
card.id = `server-${serverId}`;
|
| 309 |
card.className = 'server-card';
|
| 310 |
card.innerHTML = `
|
| 311 |
<div class="server-header">
|
|
@@ -314,7 +313,7 @@ htmlTemplate = f"""
|
|
| 314 |
<svg class="server-flag" width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
| 315 |
<path d="M21 3H3C1.9 3 1 3.9 1 5v3c0 1.1.9 2 2 10h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 5H4V6h16v2zm1 4H3c-1.1 0-2 .9-2 2v3c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-3c0-1.1-.9-2-2-2zm-1 5H4v-2h16v2zm1 4H3c-1.1 0-2 .9-2 2v3c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-3c0-1.1-.9-2-2-2zm-1 5H4v-2h16v2z"/>
|
| 316 |
</svg>
|
| 317 |
-
<div>${owner}/${spaceId}</div>
|
| 318 |
</div>
|
| 319 |
</div>
|
| 320 |
<div class="metric-grid">
|
|
@@ -345,22 +344,22 @@ htmlTemplate = f"""
|
|
| 345 |
document.getElementById('servers').appendChild(card);
|
| 346 |
}}
|
| 347 |
|
| 348 |
-
const card = document.getElementById(`server-${serverId}`);
|
| 349 |
const cpuUsage = data.cpu_usage_pct;
|
| 350 |
const memoryUsage = (data.memory_used_bytes / data.memory_total_bytes) * 100;
|
| 351 |
const uploadBps = data.tx_bps;
|
| 352 |
const downloadBps = data.rx_bps;
|
| 353 |
|
| 354 |
-
card.querySelector('.cpu-usage').textContent = `${cpuUsage.toFixed(2)}%`;
|
| 355 |
-
card.querySelector('.cpu-progress-bar').style.width = `${cpuUsage}%`;
|
| 356 |
|
| 357 |
-
card.querySelector('.memory-usage').textContent = `${memoryUsage.toFixed(2)}%`;
|
| 358 |
-
card.querySelector('.memory-progress-bar').style.width = `${memoryUsage}%`;
|
| 359 |
|
| 360 |
-
card.querySelector('.upload').textContent = `${formatBytes(uploadBps)}/s`;
|
| 361 |
-
card.querySelector('.download').textContent = `${formatBytes(downloadBps)}/s`;
|
| 362 |
|
| 363 |
-
servers.set(
|
| 364 |
updateSummary();
|
| 365 |
}}
|
| 366 |
|
|
@@ -371,16 +370,16 @@ htmlTemplate = f"""
|
|
| 371 |
let totalUpload = 0;
|
| 372 |
let totalDownload = 0;
|
| 373 |
|
| 374 |
-
servers.forEach((lastSeen,
|
| 375 |
const isOnline = (now - lastSeen) < 10000;
|
| 376 |
-
const serverCard = document.getElementById(`server-${
|
| 377 |
|
| 378 |
if (serverCard) {
|
| 379 |
const statusDot = serverCard.querySelector('.status-dot');
|
| 380 |
statusDot.className = `status-dot status-${isOnline ? 'online' : 'offline'}`;
|
| 381 |
|
| 382 |
if (isOnline) {
|
| 383 |
-
const lastData = metricsManager.getLastData(
|
| 384 |
if(lastData) {
|
| 385 |
totalUpload += lastData.tx_bps;
|
| 386 |
totalDownload += lastData.rx_bps;
|
|
@@ -465,7 +464,7 @@ def stream_metrics(username, instance_id):
|
|
| 465 |
event_type = line.split(":", 1)[1].strip()
|
| 466 |
elif line.startswith("data:"):
|
| 467 |
data_lines.append(line.split(":", 1)[1].strip())
|
| 468 |
-
|
| 469 |
if event_type == "metric":
|
| 470 |
yield f"event: {event_type}\ndata: {''.join(data_lines)}\n\n"
|
| 471 |
|
|
@@ -480,3 +479,4 @@ def stream_metrics(username, instance_id):
|
|
| 480 |
|
| 481 |
if __name__ == '__main__':
|
| 482 |
app.run(debug=True, host='0.0.0.0', port=7860)
|
|
|
|
|
|
| 6 |
app = Flask(__name__)
|
| 7 |
|
| 8 |
lightModeStyle = """
|
|
|
|
| 9 |
* {
|
| 10 |
margin: 0;
|
| 11 |
padding: 0;
|
|
|
|
| 239 |
class MetricsManager {{
|
| 240 |
constructor() {{
|
| 241 |
this.eventSources = new Map();
|
| 242 |
+
this.servers = new Map();
|
| 243 |
this.instanceOwners = new Map();
|
| 244 |
this.spaceIds = new Map();
|
| 245 |
this.lastData = new Map(); // Store last received data
|
|
|
|
| 287 |
}}
|
| 288 |
|
| 289 |
const metricsManager = new MetricsManager();
|
| 290 |
+
const servers = new Map();
|
| 291 |
|
| 292 |
async function initialize() {{
|
| 293 |
const instances = await fetchInstances();
|
| 294 |
instances.forEach(instance => {{
|
| 295 |
metricsManager.connect(instance.id, instance.owner);
|
|
|
|
| 296 |
}});
|
| 297 |
}}
|
| 298 |
|
| 299 |
|
| 300 |
function updateServerCard(data, spaceId) {{
|
| 301 |
+
const serverId = data.replica;
|
| 302 |
+
const serverElement = document.getElementById(`server-${{serverId}}`);
|
| 303 |
const owner = metricsManager.instanceOwners.get(spaceId);
|
| 304 |
|
| 305 |
if (!serverElement) {{
|
| 306 |
const card = document.createElement('div');
|
| 307 |
+
card.id = `server-${{serverId}}`;
|
| 308 |
card.className = 'server-card';
|
| 309 |
card.innerHTML = `
|
| 310 |
<div class="server-header">
|
|
|
|
| 313 |
<svg class="server-flag" width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
| 314 |
<path d="M21 3H3C1.9 3 1 3.9 1 5v3c0 1.1.9 2 2 10h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 5H4V6h16v2zm1 4H3c-1.1 0-2 .9-2 2v3c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-3c0-1.1-.9-2-2-2zm-1 5H4v-2h16v2zm1 4H3c-1.1 0-2 .9-2 2v3c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-3c0-1.1-.9-2-2-2zm-1 5H4v-2h16v2z"/>
|
| 315 |
</svg>
|
| 316 |
+
<div>${{serverId}} (${{owner}}/${{spaceId}})</div>
|
| 317 |
</div>
|
| 318 |
</div>
|
| 319 |
<div class="metric-grid">
|
|
|
|
| 344 |
document.getElementById('servers').appendChild(card);
|
| 345 |
}}
|
| 346 |
|
| 347 |
+
const card = document.getElementById(`server-${{serverId}}`);
|
| 348 |
const cpuUsage = data.cpu_usage_pct;
|
| 349 |
const memoryUsage = (data.memory_used_bytes / data.memory_total_bytes) * 100;
|
| 350 |
const uploadBps = data.tx_bps;
|
| 351 |
const downloadBps = data.rx_bps;
|
| 352 |
|
| 353 |
+
card.querySelector('.cpu-usage').textContent = `${{cpuUsage.toFixed(2)}}%`;
|
| 354 |
+
card.querySelector('.cpu-progress-bar').style.width = `${{cpuUsage}}%`;
|
| 355 |
|
| 356 |
+
card.querySelector('.memory-usage').textContent = `${{memoryUsage.toFixed(2)}}%`;
|
| 357 |
+
card.querySelector('.memory-progress-bar').style.width = `${{memoryUsage}}%`;
|
| 358 |
|
| 359 |
+
card.querySelector('.upload').textContent = `${{formatBytes(uploadBps)}}/s`;
|
| 360 |
+
card.querySelector('.download').textContent = `${{formatBytes(downloadBps)}}/s`;
|
| 361 |
|
| 362 |
+
servers.set(serverId, Date.now());
|
| 363 |
updateSummary();
|
| 364 |
}}
|
| 365 |
|
|
|
|
| 370 |
let totalUpload = 0;
|
| 371 |
let totalDownload = 0;
|
| 372 |
|
| 373 |
+
servers.forEach((lastSeen, serverId) => {
|
| 374 |
const isOnline = (now - lastSeen) < 10000;
|
| 375 |
+
const serverCard = document.getElementById(`server-${serverId}`);
|
| 376 |
|
| 377 |
if (serverCard) {
|
| 378 |
const statusDot = serverCard.querySelector('.status-dot');
|
| 379 |
statusDot.className = `status-dot status-${isOnline ? 'online' : 'offline'}`;
|
| 380 |
|
| 381 |
if (isOnline) {
|
| 382 |
+
const lastData = metricsManager.getLastData(serverId.split(" ")[0]); // Use the correct instanceId
|
| 383 |
if(lastData) {
|
| 384 |
totalUpload += lastData.tx_bps;
|
| 385 |
totalDownload += lastData.rx_bps;
|
|
|
|
| 464 |
event_type = line.split(":", 1)[1].strip()
|
| 465 |
elif line.startswith("data:"):
|
| 466 |
data_lines.append(line.split(":", 1)[1].strip())
|
| 467 |
+
|
| 468 |
if event_type == "metric":
|
| 469 |
yield f"event: {event_type}\ndata: {''.join(data_lines)}\n\n"
|
| 470 |
|
|
|
|
| 479 |
|
| 480 |
if __name__ == '__main__':
|
| 481 |
app.run(debug=True, host='0.0.0.0', port=7860)
|
| 482 |
+
|