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
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)
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
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)
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)