|
| 1 | +import click |
| 2 | +import boto3 |
| 3 | +import sys |
| 4 | +from pathlib import Path |
| 5 | +from botocore.exceptions import NoCredentialsError, PartialCredentialsError |
| 6 | +from datetime import datetime, timedelta |
| 7 | + |
| 8 | +# Get current script directory |
| 9 | +currentdir = Path(__file__).resolve().parent |
| 10 | +# Get parent directory |
| 11 | +parentdir = currentdir.parent |
| 12 | +# Add parent directory to sys.path |
| 13 | +sys.path.insert(0, str(parentdir)) |
| 14 | + |
| 15 | +# import logger after specifying root/parent path |
| 16 | +import logger |
| 17 | + |
| 18 | +# ==================== |
| 19 | + |
| 20 | +import boto3 |
| 21 | +from datetime import datetime, timedelta, timezone |
| 22 | + |
| 23 | +# Initialize AWS clients |
| 24 | +ec2 = boto3.client("ec2") |
| 25 | +cloudwatch = boto3.client("cloudwatch") |
| 26 | + |
| 27 | +# Get all running EC2 instances |
| 28 | +response = ec2.describe_instances(Filters=[{"Name": "instance-state-name", "Values": ["terminated"]}]) |
| 29 | + |
| 30 | +# Extract instance IDs |
| 31 | +instances = [] |
| 32 | +for reservation in response["Reservations"]: |
| 33 | + for instance in reservation["Instances"]: |
| 34 | + instances.append(instance["InstanceId"]) |
| 35 | + |
| 36 | +# Function to get CloudWatch metrics |
| 37 | +def get_metric(instance_id, metric_name, namespace="AWS/EC2", statistic="Average"): |
| 38 | + response = cloudwatch.get_metric_statistics( |
| 39 | + Namespace=namespace, |
| 40 | + MetricName=metric_name, |
| 41 | + Dimensions=[{"Name": "InstanceId", "Value": instance_id}], |
| 42 | + StartTime=datetime.now(timezone.utc) - timedelta(minutes=30), # Increased time window |
| 43 | + EndTime=datetime.now(timezone.utc), |
| 44 | + Period=300, # 5-minute intervals |
| 45 | + Statistics=[statistic] |
| 46 | + ) |
| 47 | + datapoints = response.get("Datapoints", []) |
| 48 | + return datapoints[-1][statistic] if datapoints else "No Data" |
| 49 | + |
| 50 | +# Fetch and print metrics for each instance |
| 51 | +for instance_id in instances: |
| 52 | + cpu_utilization = get_metric(instance_id, "CPUUtilization") |
| 53 | + disk_read_bytes = get_metric(instance_id, "DiskReadBytes") |
| 54 | + disk_write_bytes = get_metric(instance_id, "DiskWriteBytes") |
| 55 | + network_in = get_metric(instance_id, "NetworkIn") |
| 56 | + network_out = get_metric(instance_id, "NetworkOut") |
| 57 | + status_check = get_metric(instance_id, "StatusCheckFailed") |
| 58 | + |
| 59 | + print(f"Instance: {instance_id}") |
| 60 | + print(f" CPU Utilization: {cpu_utilization}%") |
| 61 | + print(f" Disk Read (Bytes): {disk_read_bytes}") |
| 62 | + print(f" Disk Write (Bytes): {disk_write_bytes}") |
| 63 | + print(f" Network In (Bytes): {network_in}") |
| 64 | + print(f" Network Out (Bytes): {network_out}") |
| 65 | + print(f" Instance Status Check Failed: {status_check}") |
| 66 | + print("-" * 40) |
0 commit comments