#!/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);