예제 #1
0
    def describe_resource_monitors(self, resource: Resource):
        res = self.client.describe_alarms(
            AlarmNamePrefix=CloudWatch.NARUKO_ALARM_NAME_SPECIFY_INSTANCE.
            format(resource.get_service_name(), resource.resource_id))
        # metricごとにアラームをグルーピングする
        grouped_alarms = dict()
        for alarm in res["MetricAlarms"]:
            # metric = alarm["Metrics"][0]["MetricStat"]["Metric"]
            alarms_by_metric = grouped_alarms.get(alarm["MetricName"], [])
            if alarms_by_metric:
                alarms_by_metric.append(alarm)
            else:
                alarms_by_metric.append(alarm)
                grouped_alarms[alarm["MetricName"]] = alarms_by_metric

        # alarmをmonitorに
        monitors = []
        for metric in resource.get_metrics():
            # metricの全レベルのアラーム
            metric_alarms = grouped_alarms.get(metric, [{}])

            # 初期値:アラームが未設定の場合に使用する
            monitor_status = Monitor.MonitorStatus.UNSET
            monitor_values = {
                level.value: None
                for level in MonitorValue.MonitorLevel
            }

            # メトリクスにアラームが設定されている場合
            if metric_alarms[0]:
                alarms_state = {
                    state.name: []
                    for state in CloudWatch.AlarmState
                }
                for metric_alarm in metric_alarms:
                    # 監視レベルの値を振り分ける
                    level = metric_alarm["AlarmName"].rsplit('-', 1)[1]
                    monitor_values[level.lower()] = metric_alarm["Threshold"]

                    # アラームのステータスごとに監視レベルを振り分ける
                    alarms_state[metric_alarm["StateValue"]].append(level)

                # アラームが発生しているもので最も監視レベルが高いステータスを取得する
                # アラームが発生していない場合はOK
                monitor_status = Monitor.MonitorStatus.max([
                    Monitor.MonitorStatus[level.upper()]
                    for level in alarms_state[CloudWatch.AlarmState.ALARM.name]
                ])

            monitors.append(
                Monitor(metric_name=metric,
                        values=monitor_values,
                        enabled=metric_alarms[0].get("ActionsEnabled"),
                        period=metric_alarms[0].get("Period"),
                        evaluation_period=metric_alarms[0].get(
                            "EvaluationPeriods"),
                        statistic=metric_alarms[0].get("Statistic"),
                        status=monitor_status))

        return monitors
예제 #2
0
    def graph(self, request_user: UserModel, resource: Resource,
              aws: AwsEnvironmentModel, monitor_graph: MonitorGraph):
        self.logger.info("START: graph")

        # 使用できるAWSアカウントか
        if not request_user.has_aws_env(aws):
            raise PermissionDenied(
                "request user can't use aws account. user_id: {}, aws_id: {}".
                format(request_user.id, aws.id))

        if monitor_graph.metric_name not in resource.get_metrics():
            raise ObjectDoesNotExist(
                "service doesn't have metric service_type: {} metric: {}".
                format(resource.get_service_name(), monitor_graph.metric_name))

        monitor_graph = CloudWatch(aws, resource.region).get_chart(
            monitor_graph, resource)

        self.logger.info("END: graph")
        return monitor_graph