+
+ def collect_metrics(self, metric_list: List[Dict]) -> List[Dict]:
+ log.debug("collect_metrics")
+
+ metric_results = []
+ log.info(metric_list)
+ for metric in metric_list:
+ server = metric["vm_id"]
+ metric_name = metric["metric"]
+ metric_mapping = METRIC_MAPPINGS.get(metric_name)
+ if not metric_mapping:
+ # log.info(f"Metric {metric_name} not available in GCP")
+ continue
+ gcp_metric_type = metric_mapping["metrictype"]
+ metric_multiplier = metric_mapping.get("multiplier", 1)
+ log.info(f"server: {server}, gcp_metric_type: {gcp_metric_type}")
+
+ end = int(time.time())
+ start = end - 600
+ interval = monitoring_v3.TimeInterval(
+ {
+ "end_time": {"seconds": end},
+ "start_time": {"seconds": start},
+ }
+ )
+ aggregation = monitoring_v3.Aggregation(
+ {
+ "alignment_period": {"seconds": 600},
+ "per_series_aligner": monitoring_v3.Aggregation.Aligner.ALIGN_MEAN,
+ }
+ )
+ filter = f'metric.type = "{gcp_metric_type}" AND metric.labels.instance_name = "{server}"'
+ project = f"projects/{self.project}"
+ log.info(f"filter: {filter}")
+ results = self.metric_client.list_time_series(
+ request={
+ "name": project,
+ "filter": filter,
+ "interval": interval,
+ "view": monitoring_v3.ListTimeSeriesRequest.TimeSeriesView.FULL,
+ "aggregation": aggregation,
+ }
+ )
+ value = None
+ for result in results:
+ for point in result.points:
+ value = point.value.double_value
+ if value is not None:
+ metric["value"] = value * metric_multiplier
+ log.info(f'value: {metric["value"]}')
+ metric_results.append(metric)
+
+ return metric_results