#!/usr/bin/env node
const { spawn } = require('child_process');
async function getCloudWatch30DayCost() {
console.log('π° CLOUDWATCH 30-DAY AMORTIZED COST ANALYSIS');
console.log('=' .repeat(50));
console.log('π
Period: Last 30 days (July 27 - August 26, 2025)');
console.log('π³ Cost Type: Amortized');
console.log('π§ Service: Amazon CloudWatch');
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) {}
}
});
await new Promise(resolve => setTimeout(resolve, 2000));
// Auth
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...');
await new Promise(resolve => setTimeout(resolve, 5000));
// CloudWatch cost request - last 30 days
const startDate = new Date();
startDate.setDate(startDate.getDate() - 30);
const endDate = new Date();
const startDateStr = startDate.toISOString().split('T')[0];
const endDateStr = endDate.toISOString().split('T')[0];
server.stdin.write(JSON.stringify({
jsonrpc: "2.0",
id: 2,
method: "tools/call",
params: {
name: 'api___cost_and_usage',
arguments: {
startDate: startDateStr,
endDate: endDateStr,
filters: {
service: "Amazon CloudWatch"
},
granularity: "MONTHLY",
metrics: "AmortizedCost"
}
}
}) + '\n');
console.log(`π Requesting CloudWatch costs from ${startDateStr} to ${endDateStr}...`);
let found = false;
for (let i = 0; i < 30 && !found; i++) {
await new Promise(resolve => setTimeout(resolve, 1000));
const response = responses.find(r => r.id === 2);
if (response && response.result?.content?.[0]?.text) {
found = true;
const text = response.result.content[0].text;
console.log(`β
Response received (${text.length} chars)`);
// Look for JSON data
const jsonMatch = text.match(/```json\n([\s\S]*?)\n```/);
if (jsonMatch) {
try {
const data = JSON.parse(jsonMatch[1]);
console.log('\nπ° CLOUDWATCH 30-DAY COST BREAKDOWN');
console.log('=' .repeat(45));
if (data.ResultsByTime && data.ResultsByTime.length > 0) {
let totalCost = 0;
data.ResultsByTime.forEach((period, i) => {
const periodStart = period.TimePeriod.Start;
const periodEnd = period.TimePeriod.End;
const cost = parseFloat(period.Total.AmortizedCost?.Amount || 0);
totalCost += cost;
console.log(`π
Period ${i+1}: ${periodStart} to ${periodEnd}`);
console.log(` π° Amortized Cost: $${cost.toFixed(4)}`);
if (period.Total.AmortizedCost?.Unit) {
console.log(` π± Currency: ${period.Total.AmortizedCost.Unit}`);
}
});
console.log(`\nπ TOTAL CLOUDWATCH COST (30 days): $${totalCost.toFixed(4)}`);
console.log(`π Cost Type: Amortized`);
console.log(`π§ Service: Amazon CloudWatch`);
console.log(`π
Period: ${startDateStr} to ${endDateStr}`);
// Daily average
const dailyAvg = totalCost / 30;
console.log(`π Daily Average: $${dailyAvg.toFixed(4)}`);
} else {
console.log('β No cost data found for CloudWatch in the last 30 days');
console.log('Data structure:', Object.keys(data));
}
} catch (e) {
console.log('β JSON parsing error:', e.message);
console.log('Response preview:', text.substring(0, 500));
}
} else {
console.log('β No JSON block found');
console.log('Response preview:', text.substring(0, 300));
}
break;
}
if (i % 10 === 0 && i > 0) {
console.log(`β³ Waiting ${i}s... (${responses.length} responses)`);
}
}
if (!found) {
console.log('β No response received within 30 seconds');
}
server.kill();
}
getCloudWatch30DayCost().catch(console.error);