| ## |
| # Copyright 2017 xFlow Research Pvt. Ltd |
| # This file is part of MON module |
| # All Rights Reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| # not use this file except in compliance with the License. You may obtain |
| # a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations |
| # under the License. |
| # |
| # For those usages not covered by the Apache License, Version 2.0 please |
| # contact with: wajeeha.hamid@xflowresearch.com |
| ## |
| |
| ''' |
| AWS-Plugin implements all the methods of MON to interact with AWS using the BOTO client |
| ''' |
| |
| __author__ = "Wajeeha Hamid" |
| __date__ = "18-Sept-2017" |
| |
| import sys |
| import datetime |
| import json |
| import logging as log |
| |
| try: |
| import boto |
| import boto.ec2 |
| import boto.vpc |
| import boto.ec2.cloudwatch |
| import boto.ec2.connection |
| except: |
| exit("Boto not avialable. Try activating your virtualenv OR `pip install boto`") |
| |
| |
| |
| class Metrics(): |
| |
| def createMetrics(self,cloudwatch_conn,metric_info): |
| try: |
| |
| '''createMetrics will be returning the metric_uuid=0 and |
| status=True when the metric is supported by AWS''' |
| |
| supported=self.check_metric(metric_info['metric_name']) |
| metric_resp = dict() |
| metric_resp['resource_uuid'] = metric_info['resource_uuid'] |
| |
| if supported['status'] == True: |
| metric_resp['status'] = True |
| metric_resp['metric_uuid'] = 0 |
| log.debug("Metrics Configured Succesfully : %s" , metric_resp) |
| else: |
| metric_resp['status'] = False |
| metric_resp['metric_uuid'] = None |
| log.error("Metric name is not supported") |
| |
| return metric_resp |
| |
| except Exception as e: |
| log.error("Metric Configuration Failed: " + str(e)) |
| #----------------------------------------------------------------------------------------------------------------------------- |
| |
| def metricsData(self,cloudwatch_conn,data_info): |
| |
| """Getting Metrics Stats for an Hour.The datapoints are |
| received after every one minute. |
| Time interval can be modified using Timedelta value""" |
| |
| try: |
| metric_info = dict() |
| metric_info_dict = dict() |
| timestamp_arr = {} |
| value_arr = {} |
| |
| supported=self.check_metric(data_info['metric_name']) |
| |
| if supported['status'] == True: |
| if int(data_info['collection_period']) % 60 == 0: |
| metric_stats=cloudwatch_conn.get_metric_statistics(60, datetime.datetime.utcnow() - datetime.timedelta(seconds=int(data_info['collection_period'])), |
| datetime.datetime.utcnow(),supported['metric_name'],'AWS/EC2', 'Maximum', |
| dimensions={'InstanceId':data_info['resource_uuid']}, unit='Percent') |
| index = 0 |
| for itr in range (len(metric_stats)): |
| timestamp_arr[index] = str(metric_stats[itr]['Timestamp']) |
| value_arr[index] = metric_stats[itr]['Maximum'] |
| index +=1 |
| metric_info_dict['time_series'] = timestamp_arr |
| metric_info_dict['metrics_series'] = value_arr |
| log.debug("Metrics Data : %s", metric_info_dict) |
| return metric_info_dict |
| else: |
| log.error("Collection Period should be a multiple of 60") |
| return False |
| |
| else: |
| log.error("Metric name is not supported") |
| return False |
| |
| except Exception as e: |
| log.error("Error returning Metrics Data" + str(e)) |
| |
| #----------------------------------------------------------------------------------------------------------------------------- |
| def updateMetrics(self,cloudwatch_conn,metric_info): |
| |
| '''updateMetrics will be returning the metric_uuid=0 and |
| status=True when the metric is supported by AWS''' |
| try: |
| supported=self.check_metric(metric_info['metric_name']) |
| update_resp = dict() |
| update_resp['resource_uuid'] = metric_info['resource_uuid'] |
| if supported['status'] == True: |
| update_resp['status'] = True |
| update_resp['metric_uuid'] = 0 |
| log.debug("Metric Updated : %s", update_resp) |
| else: |
| update_resp['status'] = False |
| update_resp['metric_uuid'] = None |
| log.error("Metric name is not supported") |
| |
| return update_resp |
| |
| except Exception as e: |
| log.error("Error in Update Metrics" + str(e)) |
| #----------------------------------------------------------------------------------------------------------------------------- |
| def deleteMetrics(self,cloudwatch_conn,del_info): |
| |
| ''' " Not supported in AWS" |
| Returning the required parameters with status = False''' |
| try: |
| supported=self.check_metric(del_info['metric_name']) |
| metric_resp = dict() |
| del_resp = dict() |
| if supported['status'] == True: |
| del_resp['schema_version'] = del_info['schema_version'] |
| del_resp['schema_type'] = "delete_metric_response" |
| del_resp['metric_name'] = del_info['metric_name'] |
| del_resp['metric_uuid'] = del_info['metric_uuid'] |
| del_resp['resource_uuid'] = del_info['resource_uuid'] |
| # TODO : yet to finalize |
| del_resp['tenant_uuid'] = del_info['tenant_uuid'] |
| del_resp['correlation_id'] = del_info['correlation_uuid'] |
| del_resp['status'] = False |
| log.info("Metric Deletion Not supported in AWS : %s",del_resp) |
| return del_resp |
| else: |
| log.error("Metric name is not supported") |
| return False |
| |
| except Exception as e: |
| log.error(" Metric Deletion Not supported in AWS : " + str(e)) |
| #------------------------------------------------------------------------------------------------------------------------------------ |
| |
| def listMetrics(self,cloudwatch_conn ,list_info): |
| |
| '''Returns the list of available AWS/EC2 metrics on which |
| alarms have been configured and the metrics are being monitored''' |
| try: |
| supported = self.check_metric(list_info['metric_name']) |
| if supported['status'] == True: |
| metrics_list = [] |
| metrics_data = dict() |
| |
| #To get the list of associated metrics with the alarms |
| alarms = cloudwatch_conn.describe_alarms() |
| itr = 0 |
| if list_info['metric_name'] == "": |
| for alarm in alarms: |
| metrics_info = dict() |
| instance_id = str(alarm.dimensions['InstanceId']).split("'")[1] |
| metrics_info['metric_name'] = str(alarm.metric) |
| metrics_info['metric_uuid'] = 0 |
| metrics_info['metric_unit'] = str(alarm.unit) |
| metrics_info['resource_uuid'] = instance_id |
| metrics_list.insert(itr,metrics_info) |
| itr += 1 |
| print metrics_list |
| return metrics_list |
| else: |
| for alarm in alarms: |
| metrics_info = dict() |
| if alarm.metric == supported['metric_name']: |
| instance_id = str(alarm.dimensions['InstanceId']).split("'")[1] |
| metrics_info['metric_name'] = str(alarm.metric) |
| metrics_info['metric_uuid'] = 0 |
| metrics_info['metric_unit'] = str(alarm.unit) |
| metrics_info['resource_uuid'] = instance_id |
| metrics_list.insert(itr,metrics_info) |
| itr += 1 |
| return metrics_list |
| log.debug("Metrics List : %s",metrics_list) |
| else: |
| log.error("Metric name is not supported") |
| return False |
| |
| except Exception as e: |
| log.error("Error in Getting Metric List " + str(e)) |
| |
| #------------------------------------------------------------------------------------------------------------------------------------ |
| |
| def check_metric(self,metric_name): |
| |
| ''' Checking whether the metric is supported by AWS ''' |
| try: |
| check_resp = dict() |
| # metric_name |
| if metric_name == 'CPU_UTILIZATION': |
| metric_name = 'CPUUtilization' |
| metric_status = True |
| elif metric_name == 'DISK_READ_OPS': |
| metric_name = 'DiskReadOps' |
| metric_status = True |
| elif metric_name == 'DISK_WRITE_OPS': |
| metric_name = 'DiskWriteOps' |
| metric_status = True |
| elif metric_name == 'DISK_READ_BYTES': |
| metric_name = 'DiskReadBytes' |
| metric_status = True |
| elif metric_name == 'DISK_WRITE_BYTES': |
| metric_name = 'DiskWriteBytes' |
| metric_status = True |
| elif metric_name == 'PACKETS_RECEIVED': |
| metric_name = 'NetworkPacketsIn' |
| metric_status = True |
| elif metric_name == 'PACKETS_SENT': |
| metric_name = 'NetworkPacketsOut' |
| metric_status = True |
| elif metric_name == "": |
| metric_name = None |
| metric_status = True |
| log.info("Metric Not Supported by AWS plugin ") |
| else: |
| metric_name = None |
| metric_status = False |
| log.info("Metric Not Supported by AWS plugin ") |
| check_resp['metric_name'] = metric_name |
| #status |
| if metric_status == True: |
| check_resp['status'] = True |
| else: |
| check_resp['status'] = False |
| |
| return check_resp |
| |
| except Exception as e: |
| log.error("Error in Plugin Inputs %s",str(e)) |
| #-------------------------------------------------------------------------------------------------------------------------------------- |
| |
| |
| |
| |
| |
| |
| |
| |