使用Python SDK获取Azure数据库CPU利用率并判断空闲状态
Azure数据库空闲检测与自动停止实现方案
核心逻辑
和你提供的Azure VM监控逻辑一致,我们通过Azure Monitor获取数据库关键运行指标判断是否空闲,再调用Azure管理API执行停止操作。以下是针对Azure SQL数据库(最常见场景)的实现步骤与代码:
步骤1:调整资源ID格式
Azure数据库的资源ID结构和VM不同,以Azure SQL数据库为例,格式如下:
resource_id = ( "subscriptions/{}/" "resourceGroups/{}/" "providers/Microsoft.Sql/servers/{}/" "databases/{}" ).format(subscription_id, resource_group_name, sql_server_name, db_name)
如果是其他类型数据库(如Azure Database for MySQL/PostgreSQL),替换对应的providers路径即可,比如MySQL的是Microsoft.DBforMySQL/servers/{}/databases/{}。
步骤2:选择空闲判断指标
不同数据库类型的监控指标略有差异,推荐以下核心指标判断空闲:
- Azure SQL数据库:
cpu_percent(CPU使用率)、connection_successful(成功连接数)、dtu_consumption_percent(DTU使用率,仅DTU模式)、log_write_bytes(日志写入量) - Azure MySQL/PostgreSQL:
cpu_percent、connections、storage_read/storage_write
你可以先通过以下代码列出当前数据库的所有可用指标,确认需要的指标名称:
# 列出数据库的所有监控指标 for metric in client.metric_definitions.list(resource_id): print("{}: id={}, unit={}".format( metric.name.localized_value, metric.name.value, metric.unit ))
步骤3:获取监控数据并判断空闲
以下代码实现获取最近24小时的CPU使用率和连接数,判断是否连续6小时处于低负载(CPU<5%且无连接):
import datetime from azure.mgmt.monitor import MonitorManagementClient from azure.mgmt.sql import SqlManagementClient from azure.identity import DefaultAzureCredential # 配置参数 subscription_id = "your-sub-id" resource_group_name = "your-rg-name" sql_server_name = "your-sql-server" db_name = "your-db-name" # 初始化客户端 credential = DefaultAzureCredential() monitor_client = MonitorManagementClient(credential, subscription_id) sql_client = SqlManagementClient(credential, subscription_id) # 构建数据库资源ID resource_id = ( "subscriptions/{}/" "resourceGroups/{}/" "providers/Microsoft.Sql/servers/{}/" "databases/{}" ).format(subscription_id, resource_group_name, sql_server_name, db_name) # 设置时间范围:最近24小时 end_time = datetime.datetime.now(datetime.timezone.utc) start_time = end_time - datetime.timedelta(hours=24) timespan = f"{start_time.isoformat()}/{end_time.isoformat()}" # 获取CPU使用率(每小时聚合) cpu_metrics = monitor_client.metrics.list( resource_id, timespan=timespan, interval='PT1H', metric='cpu_percent', aggregation='Average' ) # 获取成功连接数(每小时聚合) conn_metrics = monitor_client.metrics.list( resource_id, timespan=timespan, interval='PT1H', metric='connection_successful', aggregation='Total' ) # 整理指标数据 cpu_data = [] for item in cpu_metrics.value: for timeserie in item.timeseries: for data in timeserie.data: cpu_data.append(data.average or 0) conn_data = [] for item in conn_metrics.value: for timeserie in item.timeseries: for data in timeserie.data: conn_data.append(data.total or 0) # 判断空闲:连续6小时CPU<5%且连接数为0 is_idle = False if len(cpu_data) >=6 and len(conn_data)>=6: recent_cpu = cpu_data[-6:] recent_conn = conn_data[-6:] if all(cpu <5 for cpu in recent_cpu) and all(conn ==0 for conn in recent_conn): is_idle = True # 如果空闲,停止数据库 if is_idle: print("数据库处于空闲状态,执行停止操作...") sql_client.databases.begin_pause( resource_group_name=resource_group_name, server_name=sql_server_name, database_name=db_name ).result() print("数据库已成功停止") else: print("数据库未处于空闲状态")
关键注意事项
- 权限配置:执行代码的身份需要具备
SQL DB Contributor或更高权限,才能读取监控指标和停止数据库。 - 数据库类型差异:如果是MySQL/PostgreSQL,需要替换对应的管理客户端(如
azure.mgmt.rdbms.mysql)和停止方法(如begin_stop)。 - 停止限制:并非所有Azure数据库都支持停止操作,比如弹性池中的SQL数据库无法单独停止,需停止整个弹性池;部分数据库类型(如Azure Cosmos DB)没有停止功能,只能通过调整吞吐量节省成本。
- 阈值调整:根据你的业务场景调整空闲判断的阈值(如CPU阈值、连续低负载时长),避免误停止正在运行的数据库。
内容的提问来源于stack exchange,提问作者Rohit Mishra
相关产品推荐
相关产品推荐

