@cloud-carbon-footprint/aws
Version:
The core logic to get cloud usage data and estimate energy and carbon emissions from Amazon Web Services.
62 lines • 3.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@cloud-carbon-footprint/core");
const domain_1 = require("../domain");
const AWSInstanceTypes_1 = require("./AWSInstanceTypes");
class AWSMemoryEstimatesBuilder extends core_1.FootprintEstimatesDataBuilder {
constructor(rowData, memoryEstimator, emissionsFactors) {
super(rowData);
this.vCpuHours = rowData.vCpuHours;
this.instanceType = rowData.instanceType;
this.usageAmount = rowData.usageAmount;
this.region = rowData.region;
this.powerUsageEffectiveness = domain_1.AWS_CLOUD_CONSTANTS.getPUE(this.region);
this.computeProcessors = rowData.getComputeProcessors();
this.memoryUsage = this.getMemoryUsage();
this.memoryConstants = this.getMemoryConstants();
this.memoryFootprint = this.getMemoryFootprint(memoryEstimator, this.memoryUsage, this.memoryConstants, this.region, emissionsFactors);
}
getGigabytesFromInstanceTypeAndProcessors() {
if (!this.instanceType)
return 0;
const [instanceFamily, instanceSize] = this.instanceType.split('.');
const { isValidInstanceType, isBurstableInstance } = this.checkInstanceTypes(instanceFamily);
if (!isValidInstanceType || isBurstableInstance)
return 0;
const processors = AWSInstanceTypes_1.INSTANCE_TYPE_COMPUTE_PROCESSOR_MAPPING[this.instanceType] || [core_1.COMPUTE_PROCESSOR_TYPES.UNKNOWN];
const processorMemoryGigabytesPerPhysicalChip = domain_1.AWS_CLOUD_CONSTANTS.getMemory(processors);
const instanceTypeMemory = AWSInstanceTypes_1.EC2_INSTANCE_TYPES[instanceFamily]?.[instanceSize]?.[1] ||
AWSInstanceTypes_1.REDSHIFT_INSTANCE_TYPES[instanceFamily]?.[instanceSize]?.[1];
const familyInstanceTypes = Object.values(AWSInstanceTypes_1.EC2_INSTANCE_TYPES[instanceFamily] ||
AWSInstanceTypes_1.REDSHIFT_INSTANCE_TYPES[instanceFamily]);
const [largestInstanceTypevCpus, largestInstanceTypeMemory] = familyInstanceTypes[familyInstanceTypes.length - 1];
const physicalChips = ['m5zn', 'z1d'].includes(instanceFamily)
? 2
: (0, core_1.getPhysicalChips)(largestInstanceTypevCpus);
return (0, core_1.calculateGigabyteHours)(physicalChips, largestInstanceTypeMemory, processorMemoryGigabytesPerPhysicalChip, instanceTypeMemory, this.usageAmount);
}
checkInstanceTypes(instanceFamily) {
const isValidInstanceType = Object.keys(AWSInstanceTypes_1.EC2_INSTANCE_TYPES).includes(instanceFamily) ||
Object.keys(AWSInstanceTypes_1.REDSHIFT_INSTANCE_TYPES).includes(instanceFamily);
const isBurstableInstance = Object.keys(AWSInstanceTypes_1.BURSTABLE_INSTANCE_BASELINE_UTILIZATION).includes(this.instanceType);
return { isValidInstanceType, isBurstableInstance };
}
getMemoryUsage() {
return {
gigabyteHours: this.getGigabytesFromInstanceTypeAndProcessors(),
};
}
getMemoryConstants() {
return {
minWatts: domain_1.AWS_CLOUD_CONSTANTS.getMinWatts(this.computeProcessors),
maxWatts: domain_1.AWS_CLOUD_CONSTANTS.getMaxWatts(this.computeProcessors),
powerUsageEffectiveness: this.powerUsageEffectiveness,
replicationFactor: this.replicationFactor,
};
}
getMemoryFootprint(memoryEstimator, memoryUsage, memoryConstants, region, emissionsFactors) {
return memoryEstimator.estimate([memoryUsage], region, emissionsFactors, memoryConstants)[0];
}
}
exports.default = AWSMemoryEstimatesBuilder;
//# sourceMappingURL=AWSMemoryEstimatesBuilder.js.map