+
+ def collect_metrics(self, metric_list: List[Dict]) -> List[Dict]:
+ log.debug("collect_metrics")
+ self._reload_connection()
+
+ metric_results = []
+ # VMs RAM cache for calculating "average_memory_utilization" metric
+ cache = {}
+ for metric in metric_list:
+ server = metric["vm_id"]
+ metric_name = metric["metric"]
+ metric_mapping = METRIC_MAPPINGS.get(metric_name)
+ if not metric_mapping:
+ continue
+ if metric_name == "average_memory_utilization" and len(cache) == 0:
+ # storing VMs RAM sizes in cache
+ self._get_region_vm_sizes()
+ try:
+ for vm in self.conn_compute.virtual_machines.list(
+ self.resource_group
+ ):
+ id = vm.id
+ size_name = vm.hardware_profile.vm_size
+ vm_size = self.vm_sizes.get(size_name)
+ if vm_size:
+ ram = vm_size.memory_in_mb
+ cache[id] = ram
+ except Exception as e:
+ log.error(e)
+ azure_metric_name = metric_mapping["metricname"]
+ azure_aggregation = metric_mapping["aggregation"]
+ end = datetime.datetime.now()
+ init = end - datetime.timedelta(minutes=5)
+ try:
+ metrics_data = self.conn_monitor.metrics.list(
+ server,
+ timespan="{}/{}".format(init, end),
+ interval="PT1M",
+ metricnames=azure_metric_name,
+ aggregation=azure_aggregation,
+ )
+ except Exception as e:
+ log.error(e)
+ continue
+ total = 0
+ n_metrics = 0
+ for item in metrics_data.value:
+ log.info("{} ({})".format(item.name.localized_value, item.unit))
+ for timeserie in item.timeseries:
+ for data in timeserie.data:
+ if azure_aggregation == "Average":
+ val = data.average
+ elif azure_aggregation == "Total":
+ val = data.total
+ else:
+ val = None
+ log.info("{}: {}".format(data.time_stamp, val))
+ if val is not None:
+ total += val
+ n_metrics += 1
+ if n_metrics > 0:
+ value = total / n_metrics
+ if metric_name == "average_memory_utilization":
+ ram = cache.get(server)
+ if ram:
+ log.info(f"VM RAM = {ram}")
+ value = ram - (value / 1048576)
+ else:
+ log.error(f"Not found RAM value for server {server}")
+ value = None
+ if value is not None:
+ log.info(f"value = {value}")
+ metric["value"] = value
+ metric_results.append(metric)
+ else:
+ log.info("No metric available")
+
+ return metric_results