UNPKG

@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
"use strict"; 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