@cloud-carbon-footprint/gcp
Version:
The core logic to get cloud usage data and estimate energy and carbon emissions from Google Cloud Platform.
74 lines • 3.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const protos_1 = require("@google-cloud/monitoring/build/protos/protos");
var Aligner = protos_1.google.monitoring.v3.Aggregation.Aligner;
var Reducer = protos_1.google.monitoring.v3.Aggregation.Reducer;
var Full = protos_1.google.monitoring.v3.ListTimeSeriesRequest.TimeSeriesView.FULL;
const common_1 = require("@cloud-carbon-footprint/common");
const core_1 = require("@cloud-carbon-footprint/core");
const domain_1 = require("../domain");
class ComputeEngine extends core_1.ServiceWithCPUUtilization {
constructor(client) {
super();
this.client = client;
this.serviceName = 'ComputeEngine';
this.computeEngineLogger = new common_1.Logger('Compute Engine');
}
async getUsage(start, end, region) {
const projectId = (await this.client.getProjectId()).toString();
const name = this.client.projectPath(projectId);
const cpuMetricType = 'utilization';
const vCpuMetricType = 'reserved_cores';
const CPURequest = this.buildTimeSeriesRequest(start, end, name, cpuMetricType, Reducer.REDUCE_MEAN, region);
const vCPURequest = this.buildTimeSeriesRequest(start, end, name, vCpuMetricType, Reducer.REDUCE_SUM, region);
const [cpuUtilizationTimeSeries] = await this.client.listTimeSeries(CPURequest);
const [vCPUTimeSeries] = await this.client.listTimeSeries(vCPURequest);
const result = [];
if (cpuUtilizationTimeSeries.length == 0 || vCPUTimeSeries.length == 0) {
return result;
}
vCPUTimeSeries[0].points.forEach((point, index) => {
const measuredCpuUtilization = cpuUtilizationTimeSeries[0].points[index]?.value.doubleValue;
const cpuUtilizationAverage = this.getCpuUtilization(measuredCpuUtilization);
result.push({
cpuUtilizationAverage: cpuUtilizationAverage,
vCpuHours: point.value.doubleValue,
timestamp: new Date(+point.interval.startTime.seconds * 1000),
usesAverageCPUConstant: !measuredCpuUtilization,
});
});
return result;
}
getCpuUtilization(measuredCpuUtilization) {
return measuredCpuUtilization
? measuredCpuUtilization
: domain_1.GCP_CLOUD_CONSTANTS.AVG_CPU_UTILIZATION_2020 / 100;
}
buildTimeSeriesRequest(startDate, endDate, projectName, metricType, crossSeriesReducer, region) {
const filter = `resource.type = "gce_instance" AND metric.type="compute.googleapis.com/instance/cpu/${metricType}" AND metadata.system_labels.region=${region}`;
return {
name: projectName,
filter: filter,
aggregation: {
alignmentPeriod: { seconds: 3600 },
perSeriesAligner: Aligner.ALIGN_MEAN,
crossSeriesReducer: crossSeriesReducer,
},
view: Full,
interval: {
startTime: {
seconds: new Date(startDate).getTime() / 1000,
},
endTime: {
seconds: new Date(endDate).getTime() / 1000,
},
},
};
}
async getCosts(start, end, region) {
this.computeEngineLogger.warn(`getCosts not Implemented. Called with start: ${start}, end: ${end}, region: ${region}`);
return [];
}
}
exports.default = ComputeEngine;
//# sourceMappingURL=ComputeEngine.js.map