agent: |
ez5YMQ9CcFXNzZMMfBE9Aggregate and Visualize Comprehensive EC2 CPU Utilization
Aggregate and Visualize Comprehensive EC2 CPU Utilization
There was a problem that the LLM was not able to address. Please rephrase your prompt and try again.
This task aggregates CPU utilization data for running EC2 instances across an AWS account, computes the average CPU usage over a specified period, and plots the average to help in assessing overall resource efficiency.
inputs
outputs
import boto3
from datetime import datetime, timedelta
last_n_days=30
# AWS Credentials
creds = _get_creds(cred_label)['creds'] # Placeholder function to get AWS credentials
access_key = creds['username']
secret_key = creds['password']
'''# Placeholder for instances_list
instances_list = [
{'InstanceId': 'instance1', 'Region': 'us-east-1', 'State': 'running'},
{'InstanceId': 'instance2', 'Region': 'us-east-1', 'State': 'running'},
# Add more instances as needed
]
'''
def fetch_cpu_utilization(instance_id, region, start_time, end_time):
cloudwatch = boto3.client('cloudwatch', aws_access_key_id=access_key, aws_secret_access_key=secret_key, region_name=region)
metrics = cloudwatch.get_metric_statistics(
Namespace='AWS/EC2',
MetricName='CPUUtilization',
Dimensions=[{'Name': 'InstanceId', 'Value': instance_id}],
StartTime=start_time,
EndTime=end_time,
Period=3600,
Statistics=['Average']
)
# Calculate average CPU utilization without NumPy
data_points = metrics.get('Datapoints', [])
if data_points:
avg_cpu = sum(dp['Average'] for dp in data_points) / len(data_points)
else:
avg_cpu = 0
return avg_cpu
def plot_cpu_utilization(instances_list, last_n_days=7):
start_time = datetime.utcnow() - timedelta(days=last_n_days)
end_time = datetime.utcnow()
avg_utilizations = []
for instance in instances_list:
if instance['State'] == 'running':
avg_cpu = fetch_cpu_utilization(instance['InstanceId'], instance['Region'], start_time, end_time)
avg_utilizations.append((instance['InstanceId'], avg_cpu))
# Sort instances by average CPU utilization and select top 3 and bottom 3
avg_utilizations.sort(key=lambda x: x[1], reverse=True)
top_instances = avg_utilizations[:3]
bottom_instances = avg_utilizations[-3:]
# Prepare data for plotting
instance_ids = [x[0] for x in top_instances + bottom_instances]
utilizations = [x[1] for x in top_instances + bottom_instances]
# Plotting
context.plot.add_trace(
name="CPU Utilization",
xpts=instance_ids,
ypts=utilizations,
tracetype='bar'
)
context.plot.xlabel = 'Instance ID'
context.plot.ylabel = 'Average CPU Utilization (%)'
context.plot.title = f'Top & Bottom 3 EC2 Instances by CPU Utilization (Last {last_n_days} Days)'
plot_cpu_utilization(instances_list, last_n_days=30)
copied