agent: |
muwkw9vPhOYo6qgLyRfiAggregate and Visualize Comprehensive RDS CPU Utilization
Aggregate and Visualize Comprehensive RDS 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 RDS 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
region_name=None # None when you want to run the script for all regions
#last_n_days = 30
# AWS Credentials - replace with your method to retrieve AWS credentials
creds = _get_creds(cred_label)['creds'] # Placeholder function
access_key = creds['username']
secret_key = creds['password']
def get_aws_regions():
"""Get a list of all AWS regions."""
ec2 = boto3.client('ec2',aws_access_key_id=access_key,aws_secret_access_key=secret_key,region_name='us-east-1')
regions = ec2.describe_regions()
return [region['RegionName'] for region in regions['Regions']]
def fetch_rds_instances(region):
"""Fetch all RDS instances in a specific region."""
rds = boto3.client('rds',aws_access_key_id=access_key,aws_secret_access_key=secret_key, region_name=region)
paginator = rds.get_paginator('describe_db_instances')
page_iterator = paginator.paginate()
rds_instances = []
for page in page_iterator:
for instance in page['DBInstances']:
rds_instances.append({
'DBInstanceIdentifier': instance['DBInstanceIdentifier'],
'Region': region,
})
return rds_instances
def fetch_cpu_utilization(db_instance_identifier, region, start_time, end_time):
"""Fetch the average CPU utilization for an RDS instance."""
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/RDS',
MetricName='CPUUtilization',
Dimensions=[{'Name': 'DBInstanceIdentifier', 'Value': db_instance_identifier}],
StartTime=start_time,
EndTime=end_time,
Period=3600,
Statistics=['Average']
)
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(region_name=None, last_n_days=7):
"""Plot CPU utilization for RDS instances."""
start_time = datetime.utcnow() - timedelta(days=last_n_days)
end_time = datetime.utcnow()
regions = [region_name] if region_name else get_aws_regions()
for region in regions:
rds_instances = fetch_rds_instances(region)
avg_utilizations = []
for instance in rds_instances:
avg_cpu = fetch_cpu_utilization(instance['DBInstanceIdentifier'], region, start_time, end_time)
avg_utilizations.append((instance['DBInstanceIdentifier'], avg_cpu))
avg_utilizations.sort(key=lambda x: x[1], reverse=True)
top_instances = avg_utilizations[:3]
bottom_instances = avg_utilizations[-3:]
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 RDS Instances by CPU Utilization (Last {last_n_days} Days)'
# Example usage
plot_cpu_utilization(region_name, last_n_days) # For all regions
# plot_cpu_utilization(region_name='us-east-1', last_n_days=30) # For a specific region
copied