예제 #1
0
 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 
예제 #2
0
    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
예제 #3
0
    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}
예제 #4
0
    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
예제 #5
0
파일: monitor.py 프로젝트: gochist/synaps
    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 {}
예제 #6
0
    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}}
예제 #7
0
        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 
예제 #8
0
    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}
예제 #9
0
    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 {}