UNPKG

@cloud-carbon-footprint/aws

Version:

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

66 lines 3.11 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getEstimatesFromCostExplorer = exports.getUsageFromCostExplorer = exports.DiskType = exports.VolumeUsage = void 0; const moment_1 = __importDefault(require("moment")); const core_1 = require("@cloud-carbon-footprint/core"); const domain_1 = require("../domain"); class VolumeUsage { } exports.VolumeUsage = VolumeUsage; var DiskType; (function (DiskType) { DiskType["SSD"] = "SSD"; DiskType["HDD"] = "HDD"; DiskType["UNKNOWN"] = "UNKNOWN"; })(DiskType = exports.DiskType || (exports.DiskType = {})); async function getUsageFromCostExplorer(params, diskTypeCallBack, serviceWrapper) { const responses = await serviceWrapper.getCostAndUsageResponses(params); return responses .map((response) => { return response.ResultsByTime.map((result) => { const timestampString = result.TimePeriod.Start; return result.Groups.map((group) => { const gbMonth = Number.parseFloat(group.Metrics.UsageQuantity.Amount); const terabyteHours = estimateTerabyteHours(gbMonth, timestampString); const diskType = diskTypeCallBack(group.Keys[0]); return { terabyteHours: terabyteHours, timestamp: new Date(timestampString), diskType: diskType, }; }); }); }) .flat() .flat() .filter((storageUsage) => storageUsage.terabyteHours); } exports.getUsageFromCostExplorer = getUsageFromCostExplorer; function estimateTerabyteHours(sizeGbMonth, timestamp) { return (sizeGbMonth / 1000) * (0, moment_1.default)(timestamp).daysInMonth() * 24; } function getEstimatesFromCostExplorer(region, volumeUsages, emissionsFactors, constants) { const ssdEstimator = new core_1.StorageEstimator(domain_1.AWS_CLOUD_CONSTANTS.SSDCOEFFICIENT); const hddEstimator = new core_1.StorageEstimator(domain_1.AWS_CLOUD_CONSTANTS.HDDCOEFFICIENT); const ssdUsage = volumeUsages.filter(({ diskType: diskType }) => DiskType.SSD === diskType); const hddUsage = volumeUsages.filter(({ diskType: diskType }) => DiskType.HDD === diskType); const footprintEstimates = [ ...ssdEstimator.estimate(ssdUsage, region, emissionsFactors, constants), ...hddEstimator.estimate(hddUsage, region, emissionsFactors, constants), ]; return Object.values(footprintEstimates.reduce((acc, estimate) => { if (!acc[estimate.timestamp.toISOString()]) { acc[estimate.timestamp.toISOString()] = estimate; return acc; } acc[estimate.timestamp.toISOString()].co2e += estimate.co2e; acc[estimate.timestamp.toISOString()].kilowattHours += estimate.kilowattHours; return acc; }, {})); } exports.getEstimatesFromCostExplorer = getEstimatesFromCostExplorer; //# sourceMappingURL=StorageUsageMapper.js.map