Skip to main content
Glama
get-7day-anomaly-analysis.cjsβ€’8.31 kB
#!/usr/bin/env node // Get 7-day anomaly analysis for faster processing const { spawn } = require('child_process'); async function get7DayAnomalyAnalysis() { console.log('πŸ’° 7-DAY AWS ANOMALY COST IMPACT ANALYSIS'); console.log('=' .repeat(55)); console.log('πŸ“… Period: August 20, 2025 - August 26, 2025'); 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 = []; let requestId = 1; 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) {} } }); // Suppress stderr for cleaner output server.stderr.on('data', () => {}); await new Promise(resolve => setTimeout(resolve, 2000)); // Auth const authRequest = { jsonrpc: "2.0", id: requestId++, method: "tools/call", params: { name: 'authenticate_user', arguments: { username: 'david+saola@umbrellacost.com', password: 'Dsamsung1!' } } }; server.stdin.write(JSON.stringify(authRequest) + '\n'); await new Promise(resolve => setTimeout(resolve, 5000)); // Request 7-day anomaly analysis console.log('πŸ” Requesting 7-day anomaly data...'); const anomaliesRequest = { jsonrpc: "2.0", id: requestId++, method: "tools/call", params: { name: 'api___anomaly_detection', arguments: { startDate: "2025-08-20", endDate: "2025-08-26", isPpApplied: "false" } } }; server.stdin.write(JSON.stringify(anomaliesRequest) + '\n'); // Wait for response with reasonable timeout let anomaliesResponse = null; for (let i = 0; i < 30 && !anomaliesResponse; i++) { await new Promise(resolve => setTimeout(resolve, 1000)); anomaliesResponse = responses.find(r => r.id === 2); if (i === 10) console.log('⏳ Processing...'); if (i === 20) console.log('⏳ Almost done...'); } if (anomaliesResponse && anomaliesResponse.result?.content?.[0]?.text) { const text = anomaliesResponse.result.content[0].text; console.log(`βœ… Response received (${text.length.toLocaleString()} characters)`); // Parse the JSON response const jsonMatch = text.match(/```json\n([\s\S]*?)\n```/); if (jsonMatch) { try { const data = JSON.parse(jsonMatch[1]); if (data.anomalies && Array.isArray(data.anomalies)) { const anomalies = data.anomalies; console.log('\nπŸ’° 7-DAY ANOMALY COST IMPACT ANALYSIS RESULTS'); console.log('=' .repeat(50)); if (anomalies.length === 0) { console.log('πŸ“Š No anomalies detected in the last 7 days'); console.log('βœ… This indicates stable AWS costs during this period'); console.log('\nπŸ’° COST IMPACT: $0.00'); console.log('βœ… No financial impact from anomalies'); } else { // Calculate total cost impact let totalCostImpact = 0; let totalCurrentCost = 0; let openAnomalies = 0; let closedAnomalies = 0; const serviceBreakdown = {}; const topAnomalies = []; anomalies.forEach(anomaly => { const impact = parseFloat(anomaly.totalCostImpact || anomaly.impact || 0); const currentCost = parseFloat(anomaly.currentCost || 0); const service = anomaly.serviceName || 'Unknown Service'; const isOpen = !(anomaly.isClosed || anomaly.is_closed); totalCostImpact += impact; totalCurrentCost += currentCost; if (isOpen) openAnomalies++; else closedAnomalies++; // Service breakdown if (!serviceBreakdown[service]) { serviceBreakdown[service] = { count: 0, totalImpact: 0, totalCurrentCost: 0 }; } serviceBreakdown[service].count++; serviceBreakdown[service].totalImpact += impact; serviceBreakdown[service].totalCurrentCost += currentCost; // Top anomalies by impact if (impact > 0 || currentCost > 0) { topAnomalies.push({ service, impact, currentCost, percentChange: anomaly.percentChange || 0, accountId: anomaly.accountId || anomaly.linkedAccountId, status: isOpen ? 'Open' : 'Closed', startDate: new Date((anomaly.startTime || 0) * 1000).toISOString().split('T')[0], endDate: anomaly.endDate || 'Ongoing' }); } }); // Sort top anomalies by impact topAnomalies.sort((a, b) => b.impact - a.impact); // Display results console.log(`πŸ“Š SUMMARY:`); console.log(` Total Anomalies: ${anomalies.length.toLocaleString()}`); console.log(` πŸ”“ Open: ${openAnomalies.toLocaleString()}`); console.log(` πŸ”’ Closed: ${closedAnomalies.toLocaleString()}`); console.log(`\nπŸ’° FINANCIAL IMPACT:`); console.log(` Total Cost Impact: $${totalCostImpact.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})}`); console.log(` Total Current Cost: $${totalCurrentCost.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})}`); // Top services by cost impact const topServices = Object.entries(serviceBreakdown) .map(([service, data]) => ({ service, ...data })) .sort((a, b) => b.totalImpact - a.totalImpact) .slice(0, 3); if (topServices.length > 0) { console.log(`\nπŸ† TOP SERVICES BY COST IMPACT:`); topServices.forEach((item, i) => { console.log(` ${i+1}. ${item.service}`); console.log(` Impact: $${item.totalImpact.toLocaleString('en-US', {minimumFractionDigits: 2})} | Anomalies: ${item.count}`); }); } // Top individual anomalies if (topAnomalies.length > 0) { console.log(`\nπŸ”₯ TOP ANOMALIES:`); topAnomalies.slice(0, 3).forEach((anomaly, i) => { console.log(` ${i+1}. ${anomaly.service} (${anomaly.status})`); console.log(` πŸ’° Impact: $${anomaly.impact.toLocaleString('en-US', {minimumFractionDigits: 2})}`); console.log(` πŸ“ˆ Change: ${anomaly.percentChange.toFixed(1)}%`); console.log(` 🏒 Account: ${anomaly.accountId}`); console.log(` πŸ“… Date: ${anomaly.startDate}`); }); } } console.log(`\nβœ… FINAL ANSWER FOR Q14 (7-day sample):`); if (anomalies.length > 0) { const totalImpact = anomalies.reduce((sum, a) => sum + parseFloat(a.totalCostImpact || a.impact || 0), 0); console.log(`πŸ’° Cost impact in last 7 days: $${totalImpact.toLocaleString('en-US', {minimumFractionDigits: 2})}`); } else { console.log(`πŸ’° Cost impact in last 7 days: $0.00`); console.log(`βœ… No anomalies = stable costs`); } } else { console.log('❌ No anomalies array found in response'); } } catch (e) { console.log('❌ JSON parsing error:', e.message); console.log('First 200 chars of response:'); console.log(text.substring(0, 200)); } } else { console.log('❌ No JSON block found in response'); } } else { console.log('❌ No response received'); console.log(`Total responses: ${responses.length}`); } server.kill(); } get7DayAnomalyAnalysis().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