Skip to main content
Glama
answer-q12-anomalies.cjsβ€’8.7 kB
#!/usr/bin/env node const { spawn } = require('child_process'); async function answerQ12() { console.log('πŸ“Š Q12: WHAT IS THE COST IMPACT OF THE ANOMALIES IN THE LAST 10 DAYS FOR AWS?'); console.log('=' .repeat(80)); // Calculate last 10 days const endDate = '2025-08-27'; const startDate = '2025-08-17'; // 10 days back console.log(`πŸ“… Period: ${startDate} to ${endDate} (10 days)`); console.log('☁️ Cloud: AWS'); console.log('πŸ”₯ Focus: Anomaly Detection & Cost Impact'); console.log(''); const server = spawn('node', ['dist/index.js'], { stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, UMBRELLA_API_BASE_URL: 'https://api-front.umbrellacost.io/api/v1' } }); const responses = []; server.stdout.on('data', (data) => { const lines = data.toString().split('\n').filter(line => line.trim()); for (const line of lines) { try { const response = JSON.parse(line); responses.push(response); } catch (e) {} } }); server.stderr.on('data', () => {}); // Suppress server logs await new Promise(resolve => setTimeout(resolve, 2000)); // Authenticate server.stdin.write(JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: 'authenticate_user', arguments: { username: 'david+saola@umbrellacost.com', password: 'Dsamsung1!' } } }) + '\n'); console.log('πŸ” Authenticating...\n'); await new Promise(resolve => setTimeout(resolve, 5000)); // Q12: AWS anomaly detection for last 10 days console.log('πŸ“‘ Making API call for Q12...'); console.log('Parameters:'); console.log(` β€’ Start Date: ${startDate}`); console.log(` β€’ End Date: ${endDate}`); console.log(' β€’ Cloud Context: aws'); console.log(' β€’ Full Analysis: true'); console.log(' β€’ PP Applied: false'); console.log(''); server.stdin.write(JSON.stringify({ jsonrpc: "2.0", id: 2, method: "tools/call", params: { name: 'api___anomaly_detection', arguments: { startDate: startDate, endDate: endDate, cloud_context: 'aws', isFull: 'true', isPpApplied: 'false' } } }) + '\n'); console.log('⏳ Waiting for anomaly detection response...\n'); await new Promise(resolve => setTimeout(resolve, 20000)); // Longer wait for anomaly detection const response = responses.find(r => r.id === 2); if (!response) { console.log('❌ NO RESPONSE RECEIVED'); server.kill(); return; } if (response.error) { console.log('❌ ERROR:', response.error.message || 'Unknown error'); server.kill(); return; } if (response.result?.content?.[0]?.text) { const text = response.result.content[0].text; console.log('πŸ“„ COMPLETE ANOMALY DETECTION RESPONSE:'); console.log('=' .repeat(80)); console.log(text); console.log('=' .repeat(80)); // Parse JSON if present const jsonMatch = text.match(/```json\n([\s\S]*?)\n```/); if (jsonMatch) { try { const data = JSON.parse(jsonMatch[1]); console.log('\nπŸ“Š ANOMALY ANALYSIS RESULTS:'); console.log('=' .repeat(60)); if (data.anomalies && Array.isArray(data.anomalies)) { console.log(`πŸ”₯ Total Anomalies Found: ${data.anomalies.length}`); // Calculate total cost impact let totalCostImpact = 0; let openAnomalies = 0; let closedAnomalies = 0; data.anomalies.forEach(anomaly => { const impact = parseFloat(anomaly.totalCostImpact || 0); totalCostImpact += impact; if (anomaly.isClosed) { closedAnomalies++; } else { openAnomalies++; } }); console.log(`πŸ’° TOTAL COST IMPACT: $${totalCostImpact.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`); console.log(`πŸ“Š Status Breakdown:`); console.log(` β€’ Open Anomalies: ${openAnomalies}`); console.log(` β€’ Closed Anomalies: ${closedAnomalies}`); // Show top 10 anomalies by cost impact console.log('\nπŸ† TOP 10 ANOMALIES BY COST IMPACT:'); console.log('-'.repeat(70)); const sortedAnomalies = data.anomalies .sort((a, b) => parseFloat(b.totalCostImpact || 0) - parseFloat(a.totalCostImpact || 0)) .slice(0, 10); sortedAnomalies.forEach((anomaly, index) => { const impact = parseFloat(anomaly.totalCostImpact || 0); const percentChange = anomaly.percentChange || 'N/A'; const status = anomaly.isClosed ? '🟒 Closed' : 'πŸ”΄ Open'; const severity = anomaly.severity || 'Unknown'; console.log(`${index + 1}. ${anomaly.serviceName || 'Unknown Service'}`); console.log(` πŸ’° Impact: $${impact.toFixed(2)} | πŸ“Š Change: ${percentChange}% | ${status}`); console.log(` ⚠️ Severity: ${severity} | πŸ“… Date: ${anomaly.date || 'Unknown'}`); if (anomaly.resourceId) { console.log(` πŸ”§ Resource: ${anomaly.resourceId}`); } console.log(''); }); // Analyze by service console.log('πŸ“ˆ ANOMALIES BY SERVICE:'); console.log('-'.repeat(50)); const serviceStats = {}; data.anomalies.forEach(anomaly => { const service = anomaly.serviceName || 'Unknown'; if (!serviceStats[service]) { serviceStats[service] = { count: 0, totalImpact: 0, openCount: 0 }; } serviceStats[service].count++; serviceStats[service].totalImpact += parseFloat(anomaly.totalCostImpact || 0); if (!anomaly.isClosed) { serviceStats[service].openCount++; } }); Object.entries(serviceStats) .sort(([,a], [,b]) => b.totalImpact - a.totalImpact) .slice(0, 8) .forEach(([service, stats]) => { console.log(`πŸ”§ ${service}:`); console.log(` β€’ Anomalies: ${stats.count} (${stats.openCount} open)`); console.log(` β€’ Total Impact: $${stats.totalImpact.toFixed(2)}`); console.log(''); }); // Daily breakdown if dates available const dailyStats = {}; data.anomalies.forEach(anomaly => { const date = anomaly.date || 'Unknown'; if (!dailyStats[date]) { dailyStats[date] = { count: 0, impact: 0 }; } dailyStats[date].count++; dailyStats[date].impact += parseFloat(anomaly.totalCostImpact || 0); }); if (Object.keys(dailyStats).length > 1) { console.log('πŸ“… DAILY ANOMALY BREAKDOWN:'); console.log('-'.repeat(40)); Object.entries(dailyStats) .sort(([a], [b]) => a.localeCompare(b)) .forEach(([date, stats]) => { console.log(`${date}: ${stats.count} anomalies, $${stats.impact.toFixed(2)} impact`); }); console.log(''); } console.log('βœ… Q12 ANSWER COMPLETE - AWS ANOMALY COST IMPACT ANALYZED'); } else { console.log('⚠️ No anomalies array found in response'); console.log('Data structure:', Object.keys(data).join(', ')); } } catch (e) { console.log('❌ JSON parsing error:', e.message); console.log('Raw JSON snippet:', jsonMatch[1].substring(0, 500)); } } else { console.log('\n⚠️ No JSON data found in response'); // Try to extract key information from text if (text.includes('anomalies found') || text.includes('anomaly')) { const anomalyMatch = text.match(/(\d+)\s+anomalies?\s+found/i); if (anomalyMatch) { console.log(`πŸ”₯ Anomalies Found: ${anomalyMatch[1]}`); } const impactMatch = text.match(/total\s+(?:cost\s+)?impact[:\s]+\$?([\d,\.]+)/i); if (impactMatch) { console.log(`πŸ’° Total Impact: $${impactMatch[1]}`); } } } } else { console.log('❌ INVALID RESPONSE FORMAT'); } server.kill(); } answerQ12().catch(console.error);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/daviddraiumbrella/invoice-monitoring'

If you have feedback or need assistance with the MCP directory API, please join our Discord server