def parse_metric_data(metric): try: dimensions_ = metric.get('dimensions', {}) dimensions = utils.extract_member_dict(dimensions_) except KeyError: err = "Unsuitable Dimensions Value - %s" % str(dimensions_) raise InvalidParameterValue(err) self.check_dimensions(dimensions) metric_name = metric.get('metric_name') unit = metric.get('unit', 'None') value = metric.get('value') req_timestamp = metric.get('timestamp') timestamp = req_timestamp if req_timestamp \ else utils.strtime(utils.utcnow()) timebound = (datetime.datetime.utcnow() - datetime.timedelta( seconds=FLAGS.get('statistics_ttl'))) if utils.parse_strtime(timestamp) < timebound: err = "Stale metric data - %s" % timestamp raise InvalidParameterValue(err) self.check_metric_name(metric_name) self.check_unit(unit) return metric_name, dimensions, value, unit, timestamp
def describe_alarms_for_metric(self, context, namespace, metric_name, dimensions=None, period=None, statistic=None, unit=None, project_id=None): if not (project_id and context.is_admin): project_id = context.project_id ret_dict = {} ret_alarms = [] dimensions = utils.extract_member_dict(dimensions) self.check_dimensions(dimensions) self.check_metric_name(metric_name) self.check_namespace(namespace) self.check_statistic(statistic) self.check_unit(unit) alarms = self.monitor_api.describe_alarms_for_metric( project_id=project_id, namespace=namespace, metric_name=metric_name, dimensions=dimensions, period=period, statistic=statistic, unit=unit ) for k, v in alarms: ret_alarms.append(to_alarm(v)) ret_dict['describe_alarms_for_metric_result'] = {'metric_alarms': ret_alarms} return ret_dict
def list_metrics(self, context, next_token=None, dimensions=None, metric_name=None, namespace=None, project_id=None): """ Returns a list of valid metrics stored for the Synaps account owner. Returned metrics can be used with get_metric_statics to obtain statistical data for a given metric. """ def to_aws_metric(metric): k, v = metric return { 'dimensions': utils.dict_to_aws(v['dimensions']), 'metric_name': v['name'], 'namespace': v['namespace'] } if not (project_id and context.is_admin): project_id = context.project_id dimensions = utils.extract_member_dict(dimensions) self._check_dimension_filter(dimensions) self.check_metric_name(metric_name) self.check_namespace(namespace) self.check_next_token(next_token) metrics, next_token = self.monitor_api.list_metrics(project_id, next_token, dimensions, metric_name, namespace) metrics = map(to_aws_metric, metrics) list_metrics_result = {'Metrics': metrics} if next_token: list_metrics_result['NextToken'] = next_token return {'ListMetricsResult': list_metrics_result}
def put_metric_alarm(self, context, alarm_name, comparison_operator, evaluation_periods, metric_name, namespace, period, statistic, threshold, alarm_actions=[], insufficient_data_actions=[], ok_actions=[], actions_enabled=True, alarm_description="", dimensions={}, unit="", project_id=None): """ Create or updates an alarm and associates it with the specified SPCS Synaps metric. When this operation creates an alarm, the alarm state is immediately set to INSUFFICIENT_DATA. The alarm is evaluated and its StateVale is set appropriately. """ if not (project_id and context.is_admin): project_id = context.project_id d = utils.extract_member_dict(dimensions) alarm_actions = utils.extract_member_list(alarm_actions) insufficient_data_actions = \ utils.extract_member_list(insufficient_data_actions) ok_actions = utils.extract_member_list(ok_actions) self.check_alarm_description(alarm_description) self.check_alarm_name(alarm_name) self.check_comparison_operator(comparison_operator) self.check_dimensions(dimensions) self.check_metric_name(metric_name) self.check_namespace(namespace) self.check_statistic(statistic) self.check_unit(unit) self._validate_period(period) self._validate_evaluation_periods(evaluation_periods) self.validate_put_metric_alarm(period, evaluation_periods) metricalarm = monitor.MetricAlarm( alarm_name=alarm_name, comparison_operator=comparison_operator, evaluation_periods=evaluation_periods, metric_name=metric_name, namespace=namespace, period=period, statistic=statistic, threshold=threshold, actions_enabled=actions_enabled, alarm_actions=alarm_actions, alarm_description=alarm_description, dimensions=d, insufficient_data_actions=insufficient_data_actions, ok_actions=ok_actions, unit=unit ) self.monitor_api.put_metric_alarm(project_id, metricalarm) return {}
def get_metric_statistics(self, context, end_time, metric_name, namespace, period, start_time, statistics, unit=None, dimensions=None, project_id=None): """ Gets statistics for the specified metric. """ def stat_to_datapoint(stat): """ 단위 변경 및 형식 변경 """ timestamp, values = stat ret = {} ret['Timestamp'] = timestamp for statistic, value in values.iteritems(): if statistic == "SampleCount": ret['Unit'] = "Count" ret[statistic] = value else: ret['Unit'] = (unit if unit != 'None' else None) ret[statistic] = utils.to_unit(value, unit) return ret if not (project_id and context.is_admin): project_id = context.project_id end_time = utils.parse_strtime(end_time) start_time = utils.parse_strtime(start_time) dimensions = utils.extract_member_dict(dimensions) statistics = utils.extract_member_list(statistics) self.check_dimensions(dimensions) self.check_metric_name(metric_name) self.check_namespace(namespace) self.check_statistics(statistics) self.check_unit(unit) self._validate_period(period) self.validate_get_metric_statistics(start_time, end_time, period) stats, unit = self.monitor_api.get_metric_statistics( project_id, end_time, metric_name, namespace, period, start_time, statistics, unit, dimensions) datapoints = map(stat_to_datapoint, stats) label = metric_name return {'GetMetricStatisticsResult': {'Datapoints': datapoints, 'Label': label}}
def parse_metric_data(metric): try: dimensions_ = metric.get('dimensions', {}) dimensions = utils.extract_member_dict(dimensions_) except KeyError: err = "Unsuitable Dimensions Value - %s" % str(dimensions_) raise InvalidParameterValue(err) metric_name = metric.get('metric_name') unit = metric.get('unit', 'None') value = metric.get('value') req_timestamp = metric.get('timestamp') timestamp = req_timestamp if req_timestamp \ else utils.strtime(utils.utcnow()) self.check_metric_name(metric_name) self.check_unit(unit) return metric_name, dimensions, value, unit, timestamp
def list_metrics(self, context, next_token=None, dimensions=None, metric_name=None, namespace=None, project_id=None): """ Returns a list of valid metrics stored for the Synaps account owner. Returned metrics can be used with get_metric_statics to obtain statistical data for a given metric. """ def to_aws_metric(metric): k, v = metric return { 'dimensions': utils.dict_to_aws(v['dimensions']), 'metric_name': v['name'], 'namespace': v['namespace'] } if not (project_id and context.is_admin): project_id = context.project_id dimensions = utils.extract_member_dict(dimensions) self.check_dimensions(dimensions) self.check_metric_name(metric_name) self.check_namespace(namespace) self.check_next_token(next_token) metrics = self.monitor_api.list_metrics(project_id, next_token, dimensions, metric_name, namespace) ret_list = [] for i, (k, v) in enumerate(metrics): if i >= 500: ret_next_token = k break ret_list.append(to_aws_metric((k, v))) else: ret_next_token = None metrics = map(to_aws_metric, metrics) list_metrics_result = {'Metrics': ret_list} if ret_next_token: list_metrics_result['NextToken'] = str(ret_next_token) return {'ListMetricsResult': list_metrics_result}
def put_metric_alarm(self, context, alarm_name, comparison_operator, evaluation_periods, metric_name, namespace, period, statistic, threshold, alarm_actions=[], insufficient_data_actions=[], ok_actions=[], actions_enabled=True, alarm_description="", dimensions={}, unit="", project_id=None): """ Create or updates an alarm and associates it with the specified SPCS Synaps metric. When this operation creates an alarm, the alarm state is immediately set to INSUFFICIENT_DATA. The alarm is evaluated and its StateVale is set appropriately. """ if not (project_id and context.is_admin): project_id = context.project_id d = utils.extract_member_dict(dimensions) alarm_actions = utils.extract_member_list(alarm_actions) insufficient_data_actions = \ utils.extract_member_list(insufficient_data_actions) ok_actions = utils.extract_member_list(ok_actions) self.check_alarm_description(alarm_description) self.check_alarm_name(alarm_name) self._check_admin_alarm([alarm_name], context.is_admin) self.check_comparison_operator(comparison_operator) self.check_dimensions(dimensions) self.check_metric_name(metric_name) self.check_namespace(namespace) self.check_statistic(statistic) self.check_unit(unit) self._validate_period(period) self._validate_evaluation_periods(evaluation_periods) self.validate_put_metric_alarm(period, evaluation_periods) self._validate_instanceaction(ok_actions, project_id, context) self._validate_instanceaction(insufficient_data_actions, project_id, context) self._validate_instanceaction(alarm_actions, project_id, context) try: metricalarm = monitor.MetricAlarm( alarm_name=alarm_name, comparison_operator=comparison_operator, evaluation_periods=evaluation_periods, metric_name=metric_name, namespace=namespace, period=period, statistic=statistic, threshold=threshold, actions_enabled=actions_enabled, alarm_actions=alarm_actions, alarm_description=alarm_description, dimensions=d, insufficient_data_actions=insufficient_data_actions, ok_actions=ok_actions, unit=unit ) except AssertionError as e: LOG.exception(e) err = "Unsuitable MetricAlarm Value(%s)" % str(e) raise InvalidParameterValue(err) self.monitor_api.put_metric_alarm(context, project_id, metricalarm) return {}