UNPKG

@cloud-carbon-footprint/aws

Version:

The core logic to get cloud usage data and estimate energy and carbon emissions from Amazon Web Services.

71 lines (63 loc) 2 kB
/* * © 2021 Thoughtworks, Inc. */ import { CloudWatch, CostExplorer } from 'aws-sdk' import { MetricDataResult } from 'aws-sdk/clients/cloudwatch' import { ComputeUsage, buildComputeUsages, extractRawComputeUsages, RawComputeUsage, CloudConstants, } from '@cloud-carbon-footprint/core' import { AWS_CLOUD_CONSTANTS } from '../domain' function getNumberVcpusByDate( getCostAndUsageResponses: CostExplorer.GetCostAndUsageResponse[], NODE_TYPES: { [p: string]: number }, ): RawComputeUsage[] { const vcpusByDate: RawComputeUsage[] = [] getCostAndUsageResponses.forEach((response) => { response.ResultsByTime.forEach((result) => { if (result.Groups.length > 0) { vcpusByDate.push({ timestamp: result.TimePeriod.Start, id: 'vCPUs', value: result.Groups.reduce((sum, group) => { return ( sum + Number.parseInt(group.Metrics.UsageQuantity.Amount) * NODE_TYPES[group.Keys[0].split(':')[1]] ) }, 0), }) } }) }) return vcpusByDate } export function getComputeUsage( metricDataResponses: CloudWatch.GetMetricDataOutput[], getCostAndUsageResponses: CostExplorer.GetCostAndUsageResponse[], NODE_TYPES: { [p: string]: number }, ): ComputeUsage[] { const metricDataResults: MetricDataResult[] = metricDataResponses.flatMap( (response) => response.MetricDataResults, ) const rawCpuUtilizations: RawComputeUsage[] = metricDataResults .flatMap(extractRawComputeUsages) .map((rawComputeUsage) => ({ ...rawComputeUsage, timestamp: rawComputeUsage.timestamp.substr(0, 10), })) const rawvCpuHours: RawComputeUsage[] = getNumberVcpusByDate( getCostAndUsageResponses, NODE_TYPES, ) const cloudConstants: CloudConstants = { avgCpuUtilization: AWS_CLOUD_CONSTANTS.AVG_CPU_UTILIZATION_2020, } return buildComputeUsages( rawCpuUtilizations.concat(rawvCpuHours), cloudConstants, ) }