一、需求背景
最近在开发博客网站后台时,想添加主机性能查看功能,以便登录网站后台管理即可随查看服务器的CPU、内存、系统负载、磁盘使用率的情况,解决思路主要有两种:
- 使用os模块,通过调用shell脚本,实现信息的收集与处理
- 使用阿里云SDK,传入相应参数,获取指标信息
由于python项目使用docker容器运行,在容器中执行shell脚本,获取宿主机资源信息还是比较麻烦的,因此采用阿里云SDK方式获取主机资源指标信息。
二、参考链接
1. ECS主机监控项参数
2. python SDK参考文档
https://help.aliyun.com/document_detail/28622.html?spm=a2c4g.11186623.6.838.595c12d0YrMGqc
三、前期准备
1. 查询实例名称InstanceId
在控制台——云服务器ECS——概览

2.所在地域RegionId
在控制台即可查看主机所在地域,参考文档 https://help.aliyun.com/document_detail/40654.html?spm=a2c4g.11186623.2.26.61014f55hxVpaH#concept-h4v-j5k-xdb,查询Region ID
3.AccessKey和AccessSecret
RAM访问控制——用户——创建编程访问角色用户
参考文档:https://help.aliyun.com/document_detail/53045.html?spm=a2c4g.11186623.2.34.61014f55BKnY5k#concept-53045-zh
四、开发流程
1. 调试官方demo程序
https://help.aliyun.com/document_detail/28622.html?spm=a2c4g.11186623.6.838.595c12d0YrMGqc
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcms.request.v20190101.DescribeMetricListRequest import DescribeMetricListRequest
client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-beijing')
# <accessKeyId>,<accessSecret>,cn-beijing:根据自己查询信息填写
request = DescribeMetricListRequest()
request.set_accept_format('json')
request.set_StartTime("2019-05-21 10:00:00")
# 时间修改为当前小时,响应以免数据过多
request.set_Dimensions("{\"instanceId\":\"i-2ze3*******\"}")
# "i-2ze3*******\":此处改为ECS服务器实例ID
request.set_Period("60")
request.set_Namespace("acs_ecs_dashboard")
request.set_MetricName("CPUUtilization")
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
如果信息填写无误,就可以获取到相应内容,内容包含 "Minimum\":3.44,\"Maximum\":3.44,\"Average\":3.44字段信息,这就是CPU当前时间段的指标
2.setting文件保存配置
尽量将所有配置信息都写到setting中,便于后期更换服务器时,修改变量值即可,避免修改代码工作
# 阿里云SDK
ALIYUN_KEYId = '****'
ALIYUN_SECRET = '****'
ALIYUN_LOCATION = '****'
ALIYUN_INSTANCE = '***'
3.tools文件定义SDK类
- MetricName参考文档:https://help.aliyun.com/document_detail/162844.html?spm=a2c4g.11186623.2.9.48337d97ecgWtM#concept-2482301(刚开始在官方文档ECS主机SDK参考文档和云监控监控项说明试了半天,最后才发现监控项名称是这个)
- 由于我只需要获取CPU、内存、磁盘使用率、系统负载四项,在上一分钟的状态即可,需要在返回的一串json内容中提取主要信息,返回数据结构完全一致,所有就定义到一个方法里面。
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcms.request.v20190101.DescribeMetricListRequest import DescribeMetricListRequest
from myblog.settings import ALIYUN_INSTANCE, ALIYUN_KEYId, ALIYUN_LOCATION, ALIYUN_SECRET
# 阿里云sdk
class AliyunSDK:
def __init__(self, metric):
self.accessKeyId = ALIYUN_KEYId
self.accessSecret = ALIYUN_SECRET
self.location = ALIYUN_LOCATION
self.instanceId = ALIYUN_INSTANCE
self.metric = metric
def metricInfo(self):
startTime = (datetime.datetime.now() - datetime.timedelta(minutes=10)).strftime("%Y-%m-%d %H:%M:%S")
client = AcsClient(self.accessKeyId, self.accessSecret, self.location)
request = DescribeMetricListRequest()
request.set_accept_format('json')
request.set_StartTime(startTime)
instance = "{\"instanceId\":\"" + self.instanceId + "\"}"
request.set_Dimensions(instance)
request.set_Period("60")
request.set_Namespace("acs_ecs_dashboard")
request.set_MetricName(self.metric)
response = client.do_action_with_exception(request)
result = str(response, encoding='utf-8')
result_dict = json.loads(result)
if result_dict['Code'] == '200':
data = eval(result_dict['Datapoints'][1:-1])
return data[0]["Average"]
else:
return 0
4.views视图函数逻辑处理
from management.tools import AliyunSDK
def dashboard(request):
# 主机性能
cpu = AliyunSDK("CPUUtilization")
cpu_rate = round(cpu.metricInfo(), 2)
memory = AliyunSDK("memory_usedutilization")
memory_rate = round(memory.metricInfo(), 2)
disk = AliyunSDK("diskusage_utilization")
disk_rate = round(disk.metricInfo(), 2)
load = AliyunSDK("load_15m")
load_rate = round(load.metricInfo() * 100, 2)
return render(request, 'management/index.html', locals())
5.前端模板文件显示
<div class="layui-card">
<div class="layui-card-header">主机性能</div>
<div class="layui-card-body" id="system-info">
<div class="layuiadmin-card-list">
<p class="layuiadmin-normal-font">CPU使用率</p>
<div class="layui-progress layui-progress-big" lay-showpercent="yes">
<div class="layui-progress-bar"
lay-percent={{ cpu_rate }}% style="width:{{ cpu_rate }}%"><span
class="layui-progress-text">{{ cpu_rate }}%</span></div>
</div>
</div>
<div class="layuiadmin-card-list">
<p class="layuiadmin-normal-font">系统负载</p>
<div class="layui-progress layui-progress-big" lay-showpercent="yes">
<div class="layui-progress-bar"
lay-percent={{ load_rate }}% style="width:{{ load_rate }}%"><span
class="layui-progress-text">{{ load_rate }}%</span></div>
</div>
</div>
<div class="layuiadmin-card-list">
<p class="layuiadmin-normal-font">内存使用率</p>
<div class="layui-progress layui-progress-big" lay-showpercent="yes">
<div class="layui-progress-bar"
lay-percent={{ memory_rate }}% style="width:{{ memory_rate }}%"><span
class="layui-progress-text">{{ memory_rate }}%</span></div>
</div>
</div>
<div class="layuiadmin-card-list">
<p class="layuiadmin-normal-font">磁盘使用率</p>
<div class="layui-progress layui-progress-big" lay-showpercent="yes">
<div class="layui-progress-bar"
lay-percent={{ disk_rate }}% style="width:{{ disk_rate }}%"><span
class="layui-progress-text">{{ disk_rate }}%</span></div>
</div>
</div>
</div>
</div>
五、结果查看
- 主机性能模块信息查看

- 后台管理首页

