FNMZWFoMC9d9KCxXZKjuPlot Average CPU Utilization for all running AWS EC2 Instances
Plot Average CPU Utilization for all running AWS EC2 Instances
There was a problem that the LLM was not able to address. Please rephrase your prompt and try again.
This task entails collecting CPU usage metrics from Amazon CloudWatch, calculating the average utilization, and visualizing this data. This task aids in identifying underutilized or overutilized instances, facilitating efficient resource management and cost optimization in AWS.
inputs
outputs
import boto3
from datetime import datetime, timedelta
from botocore.exceptions import NoCredentialsError, PartialCredentialsError, BotoCoreError, ClientError, EndpointConnectionError, DataNotFoundError
last_n_days=30
# AWS credentials
creds = _get_creds(cred_label)['creds']
access_key = creds['username']
secret_key = creds['password']
if locals().get('instances_list') is None:
instances_list = []
# Function to fetch CPU utilization for a given instance
def fetch_cpu_utilization(instance_id, region, start_time, end_time):
try:
cloudwatch = boto3.client('cloudwatch', aws_access_key_id=access_key, aws_secret_access_key=secret_key, region_name=region)
response = cloudwatch.get_metric_data(
MetricDataQueries=[
{
'Id': 'cpuUtilization',
'MetricStat': {
'Metric': {
'Namespace': 'AWS/EC2',
'MetricName': 'CPUUtilization',
'Dimensions': [{'Name': 'InstanceId', 'Value': instance_id}]
},
'Period': 3600, # one hour
'Stat': 'Average',
},
'ReturnData': True,
},
],
StartTime=start_time,
EndTime=end_time
)
return response['MetricDataResults'][0]['Timestamps'], response['MetricDataResults'][0]['Values']
except Exception as e:
print(f"Error getting CPU utilization for instance {instance_id}: {e}")
return [], []
# Main plotting logic
def plot_cpu_utilization(instances_list, lookback_days=last_n_days):
end_time = datetime.utcnow()
start_time = end_time - timedelta(days=lookback_days)
# Filter running EC2 instances
for instance in instances_list:
if instance['State'] != 'running':
continue
timestamps, cpu_values = fetch_cpu_utilization(instance['InstanceId'], instance['Region'], start_time, end_time)
# Check if data is available
if timestamps:
context.plot.add_trace(
name=f"Instance {instance['InstanceId']}",
xpts=timestamps, # x-axis points
ypts=cpu_values, # y-axis points
tracetype="line"
)
# Set plot properties
context.plot.xlabel = 'Date'
context.plot.ylabel = 'Average CPU Utilization (%)'
context.plot.title = f'CPU Utilization per EC2 Instance (Last {last_n_days} Days)'
# Execute the plotting function
plot_cpu_utilization(instances_list)
copied