campoleone-monitor.mjsβ’6.37 kB
// Script per monitoraggio continuo istanza Campoleone
// Monitora performance e stato dell'istanza attiva
import { ProjectInstanceManager } from './build/project-instance-manager.js';
console.log("π MONITORAGGIO ISTANZA CAMPOLEONE");
console.log("=" .repeat(42));
const projectManager = ProjectInstanceManager.getInstance();
// Funzione di monitoraggio singolo
async function singleMonitorCheck() {
const timestamp = new Date().toLocaleTimeString();
try {
// Test velocitΓ con comando semplice
const start = Date.now();
const result = await projectManager.executeProjectAnalysis('campoleone', `
import time
test_start = time.time()
node_count = visum.Net.Nodes.Count
link_count = visum.Net.Links.Count
test_end = time.time()
result = {
'timestamp': time.time(),
'nodes': node_count,
'links': link_count,
'visum_query_time_ms': (test_end - test_start) * 1000,
'check_type': 'speed_monitor'
}
`, "Speed Monitor Check");
const totalTime = Date.now() - start;
if (result.success) {
console.log(`[${timestamp}] β
Risposta in ${totalTime}ms (VisumPy: ${result.result.visum_query_time_ms.toFixed(1)}ms)`);
return { success: true, totalTime, visumTime: result.result.visum_query_time_ms };
} else {
console.log(`[${timestamp}] β Errore: ${result.error}`);
return { success: false, error: result.error };
}
} catch (error) {
console.log(`[${timestamp}] β Exception: ${error.message}`);
return { success: false, error: error.message };
}
}
// Monitoraggio continuo con intervalli
async function continuousMonitoring(intervalSeconds = 5, maxChecks = 10) {
console.log(`π Avvio monitoraggio continuo (ogni ${intervalSeconds}s, ${maxChecks} check)`);
console.log("");
const stats = {
totalChecks: 0,
successfulChecks: 0,
failedChecks: 0,
totalTimes: [],
visumTimes: []
};
for (let i = 0; i < maxChecks; i++) {
const result = await singleMonitorCheck();
stats.totalChecks++;
if (result.success) {
stats.successfulChecks++;
stats.totalTimes.push(result.totalTime);
stats.visumTimes.push(result.visumTime);
} else {
stats.failedChecks++;
}
// Attendi prima del prossimo check (tranne l'ultimo)
if (i < maxChecks - 1) {
await new Promise(resolve => setTimeout(resolve, intervalSeconds * 1000));
}
}
// Statistiche finali
console.log("\n" + "=" .repeat(42));
console.log("π STATISTICHE MONITORAGGIO:");
console.log(`β
Check riusciti: ${stats.successfulChecks}/${stats.totalChecks}`);
console.log(`β Check falliti: ${stats.failedChecks}`);
if (stats.totalTimes.length > 0) {
const avgTotal = stats.totalTimes.reduce((a, b) => a + b, 0) / stats.totalTimes.length;
const avgVisum = stats.visumTimes.reduce((a, b) => a + b, 0) / stats.visumTimes.length;
const minTotal = Math.min(...stats.totalTimes);
const maxTotal = Math.max(...stats.totalTimes);
const minVisum = Math.min(...stats.visumTimes);
const maxVisum = Math.max(...stats.visumTimes);
console.log(`β‘ Tempo totale medio: ${avgTotal.toFixed(1)}ms`);
console.log(`π₯ Tempo VisumPy medio: ${avgVisum.toFixed(1)}ms`);
console.log(`π Range totale: ${minTotal}ms - ${maxTotal}ms`);
console.log(`π Range VisumPy: ${minVisum.toFixed(1)}ms - ${maxVisum.toFixed(1)}ms`);
// Valutazione performance
if (avgVisum < 20) {
console.log("π PERFORMANCE: ECCELLENTE (< 20ms)");
} else if (avgVisum < 50) {
console.log("β‘ PERFORMANCE: OTTIMA (< 50ms)");
} else if (avgVisum < 100) {
console.log("β
PERFORMANCE: BUONA (< 100ms)");
} else {
console.log("β οΈ PERFORMANCE: ACCETTABILE (> 100ms)");
}
}
console.log("π Istanza continua a essere attiva...");
}
// Health check dettagliato
async function detailedHealthCheck() {
console.log("\nπ HEALTH CHECK DETTAGLIATO");
try {
const health = await projectManager.checkProjectHealth('campoleone');
if (health.success) {
const uptime = Math.floor((health.health.uptime || 0) / 1000);
const minutes = Math.floor(uptime / 60);
const seconds = uptime % 60;
console.log("β
Stato istanza: SALUTARE");
console.log(`β° Uptime: ${minutes}m ${seconds}s`);
console.log(`β‘ Response time: ${health.health.response_time_ms}ms`);
console.log(`πΎ Memoria: ${health.health.memory_mb}MB`);
console.log(`π Progetto: ${health.health.project_loaded ? 'β
Caricato' : 'β Non caricato'}`);
console.log(`π Network: ${health.health.network_ready ? 'β
Pronto' : 'β Non pronto'}`);
} else {
console.log(`β Health check fallito: ${health.error}`);
}
} catch (error) {
console.error("β Errore health check:", error.message);
}
}
// Status istanze
async function instancesStatus() {
console.log("\nπ STATUS ISTANZE ATTIVE");
try {
const status = projectManager.getInstancesStatus();
const count = Object.keys(status).length;
console.log(`π― Istanze attive: ${count}`);
for (const [projectId, info] of Object.entries(status)) {
const uptime = Math.floor((info.uptime || 0) / 1000);
const lastUsed = info.lastUsed ? Math.floor((Date.now() - info.lastUsed) / 1000) : 'Mai';
console.log(`\nπ§ ${info.name}:`);
console.log(` β’ ID: ${projectId}`);
console.log(` β’ Status: ${info.isActive ? 'β
Attiva' : 'β Inattiva'}`);
console.log(` β’ Uptime: ${uptime}s`);
console.log(` β’ Ultimo uso: ${lastUsed}s fa`);
console.log(` β’ Network: ${info.stats?.nodes} nodi, ${info.stats?.links} link`);
}
} catch (error) {
console.error("β Errore status:", error.message);
}
}
// Script principale
async function runMonitoring() {
console.log("π Avvio script monitoraggio Campoleone...\n");
// 1. Health check iniziale
await detailedHealthCheck();
// 2. Status istanze
await instancesStatus();
// 3. Monitoraggio continuo (5 check ogni 3 secondi)
await continuousMonitoring(3, 5);
console.log("\nπ― MONITORAGGIO COMPLETATO");
console.log("L'istanza Campoleone rimane attiva e pronta!");
}
// Esegui monitoraggio
runMonitoring().catch(console.error);