一、需求背景

最近在开发博客网站后台时,想添加主机性能查看功能,以便登录网站后台管理即可随查看服务器的CPU、内存、系统负载、磁盘使用率的情况,解决思路主要有两种:

  1. 使用os模块,通过调用shell脚本,实现信息的收集与处理
  2. 使用阿里云SDK,传入相应参数,获取指标信息

由于python项目使用docker容器运行,在容器中执行shell脚本,获取宿主机资源信息还是比较麻烦的,因此采用阿里云SDK方式获取主机资源指标信息。

二、参考链接

1. ECS主机监控项参数

https://help.aliyun.com/document_detail/162844.html?spm=a2c4g.11186623.2.9.48337d97ecgWtM#concept-2482301

2. python SDK参考文档

https://help.aliyun.com/document_detail/28622.html?spm=a2c4g.11186623.6.838.595c12d0YrMGqc

三、前期准备

1. 查询实例名称InstanceId

在控制台——云服务器ECS——概览 image.png

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访问控制——用户——创建编程访问角色用户 image.png 参考文档: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类

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>

五、结果查看

  1. 主机性能模块信息查看

image.png

  1. 后台管理首页

image.png

image.png

0 子项 · 2 次浏览 · 2026-09-24