Example #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
Example #2
0
    def put_metric_alarms(self, resource: Resource, topic_arn: str):
        """
        アラームを設定する
        一つのメトリクスに対しNARUKOで取り扱う監視レベルの数だけアラームを設定する
        最も低いレベルのアラームには復旧時のトリガーを設定する

        :param resource:
        :param topic_arn:
        :return:
        """
        monitor = resource.monitors[0]
        for monitor_value in monitor.monitor_values:
            params = dict(
                AlarmName=CloudWatch.NARUKO_ALARM_NAME.format(
                    resource.get_service_name(), resource.resource_id,
                    monitor.metric.name, monitor_value.level.name),
                ActionsEnabled=monitor.enabled,
                AlarmActions=[topic_arn],
                MetricName=monitor.metric.name,
                Namespace=resource.get_namespace(),
                Statistic=monitor.statistic,
                Dimensions=[
                    dict(Name=resource.get_id_name(),
                         Value=resource.resource_id)
                ],
                Period=monitor.period,
                EvaluationPeriods=1,
                Threshold=monitor_value.value,
                ComparisonOperator=monitor.metric.comparison_operator)

            # 最も安全なレベルのアラームには復旧時の通知を設定する
            if monitor_value.level.is_lowest_level():
                params.update(dict(OKActions=[topic_arn]))

            self.client.put_metric_alarm(**params)
Example #3
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
Example #4
0
 def target_info(aws_env: AwsEnvironmentModel, resource: Resource):
     return "{}_{}_{}_{}_{}".format(aws_env.name, aws_env.aws_account_id,
                                    resource.region,
                                    resource.get_service_name(),
                                    resource.resource_id)
Example #5
0
 def target_info(resource: Resource, aws_env: AwsEnvironmentModel):
     return "{}_{}_{}_{}_{}_{}".format(aws_env.name, aws_env.aws_account_id,
                                       resource.region,
                                       resource.get_service_name(),
                                       resource.resource_id,
                                       resource.monitors[0].metric.name)