from aws_cdk import (
    core,
    aws_sns as sns,
    aws_cloudwatch as cloudwatch,
    aws_cloudwatch_actions as cw_actions
)


class SquidMonitoringConstruct(core.Construct):
    def __init__(self, scope: core.Construct, id: str, squid_asgs: list) -> None:
        super().__init__(scope, id)
        
        # SNS Topic for alarm
        self.squid_alarm_topic = sns.Topic(self,"squid-asg-alarm-topic", display_name='Squid ASG Alarm topic')

        # Create metric to use for triggering alarm when there is no CPU usage from the squid process
        for count, asg in enumerate(squid_asgs, start=1):
            squid_metric = cloudwatch.Metric(metric_name="procstat_cpu_usage",
                namespace='CWAgent',
                dimensions=dict(AutoScalingGroupName=asg.auto_scaling_group_name,
                    pidfile="/var/run/squid.pid",
                    process_name="squid")
            )

            # CloudWatch alarms to alert on Squid ASG issue
            squid_alarm = cloudwatch.Alarm(self,f"squid-alarm-{count}",
                alarm_description=f"Heart beat for Squid instance {count}",
                alarm_name=f"squid-alarm_{asg.auto_scaling_group_name}",
                comparison_operator=cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
                metric=squid_metric,
                period=core.Duration.seconds(10),
                evaluation_periods=1,
                threshold=0.0,
                statistic='Average',
                treat_missing_data=cloudwatch.TreatMissingData.BREACHING
            )
            squid_alarm.add_alarm_action(cw_actions.SnsAction(self.squid_alarm_topic))
            squid_alarm.add_ok_action(cw_actions.SnsAction(self.squid_alarm_topic))