@cloud-carbon-footprint/core
Version:
The core logic to get cloud usage data and estimate energy and carbon emissions.
59 lines • 2.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildComputeUsages = exports.extractRawComputeUsages = exports.ComputeUsageBuilder = void 0;
class ComputeUsageBuilder {
constructor(timestamp, constants) {
this.timestamp = timestamp;
this.cpuUtilizations = [];
this.vCpuHours = 0;
this.constants = constants;
}
addCpuUtilization(cpuUtilization) {
if (cpuUtilization) {
this.cpuUtilizations.push(cpuUtilization);
}
return this;
}
setVCpuHours(vCpuHours) {
this.vCpuHours = vCpuHours;
return this;
}
build() {
const hasMeasurements = this.cpuUtilizations.length > 0;
const cpuUtilizationAverage = hasMeasurements
? this.cpuUtilizations.reduce((sum, x) => sum + x) /
this.cpuUtilizations.length
: this.constants.avgCpuUtilization;
return {
timestamp: new Date(this.timestamp),
cpuUtilizationAverage,
vCpuHours: this.vCpuHours,
usesAverageCPUConstant: !hasMeasurements,
};
}
}
exports.ComputeUsageBuilder = ComputeUsageBuilder;
const extractRawComputeUsages = (metricData) => metricData.Timestamps.map((timestamp, i) => ({
timestamp: new Date(timestamp).toISOString(),
id: metricData.Id,
value: metricData.Values[i],
}));
exports.extractRawComputeUsages = extractRawComputeUsages;
const mergeUsageByTimestamp = (acc, data, constants) => {
const usageToUpdate = acc[data.timestamp] || new ComputeUsageBuilder(data.timestamp, constants);
if (data.id === 'cpuUtilization') {
acc[data.timestamp] = usageToUpdate.addCpuUtilization(data.value);
}
else if (data.id === 'vCPUs') {
acc[data.timestamp] = usageToUpdate.setVCpuHours(data.value);
}
return acc;
};
function buildComputeUsages(rawComputeUsages, constants) {
const groupedComputeUsages = rawComputeUsages.reduce((acc, data) => mergeUsageByTimestamp(acc, data, constants), {});
return Object.values(groupedComputeUsages)
.map((builder) => builder.build())
.filter((usage) => usage.vCpuHours > 0);
}
exports.buildComputeUsages = buildComputeUsages;
//# sourceMappingURL=ComputeUsage.js.map