@cloud-carbon-footprint/aws
Version:
The core logic to get cloud usage data and estimate energy and carbon emissions from Amazon Web Services.
69 lines • 3.08 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DiskType = exports.VolumeUsage = void 0;
exports.getUsageFromCostExplorer = getUsageFromCostExplorer;
exports.getEstimatesFromCostExplorer = getEstimatesFromCostExplorer;
const moment_1 = __importDefault(require("moment"));
const core_1 = require("@cloud-carbon-footprint/core");
const domain_1 = require("../domain");
class VolumeUsage {
terabyteHours;
timestamp;
diskType;
}
exports.VolumeUsage = VolumeUsage;
var DiskType;
(function (DiskType) {
DiskType["SSD"] = "SSD";
DiskType["HDD"] = "HDD";
DiskType["UNKNOWN"] = "UNKNOWN";
})(DiskType || (exports.DiskType = 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);
}
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;
}, {}));
}
//# sourceMappingURL=StorageUsageMapper.js.map