转载请注明出处:http://blog.csdn.net/dysj4099

前面的文章《利用Linux守护进程机制完成一个简单系统监控demo》中提到在Linux中如何利用Python读取procfs中的信息,并构建基于守护进程的系统运行状况监控程序。但目前云平台中Windows虚拟机的数量还是占大多数,虽然可以利用libvirt提供的API获取虚拟机的运行信息,不过对于Windows虚拟机来说,获取到的大部分系统信息都不准确,甚至是错误的。因此,一种解决方法是在Windows虚拟机中定制一个监控agent,通过agent实时获取系统信息并发布。

在Linux下,操作系统提供了procfs这样一种文件系统方便获取系统的各项运行信息。但Windows并没有提供类似procfs的机制,就必须另想办法了。好在微软提供了WMI(Windows Management Instrumentation)这样一种管理技术,它允许通过一个公共接口访问多种操作系统的构成单元,实现对操作系统的信息获取及管理操作。本文正是利用WMI进行数据获取。

要利用Python调用WMI获取信息,必须安装相关的软件包:

根据你的操作系统版本,下载相应版本安装。安装完后,就可以开始了:

CPU信息获取

我们首先以CPU为例,演示Python调用WMI的过程。在此我们调用了Win32_Processor这个类来获取cpu的信息,可以看到这个类的对象包含了与处理器相关的大部分有用信息,对于多核的处理器而言,将输出多个对象。其中LoadPercentage这个参数是指上一秒此处理器的工作负载,这就是我们需要的cpu_usage。

详细的Win32_Processor class说明,请参阅开发文档:

import wmi

import os

import sys

import platform

import time

import win32com.client as client

class DataPollster(object):

def get_cpu(self):

# Initilization

c = wmi.WMI()

data_dict = {}

for cpu in c.Win32_Processor():

device = cpu.DeviceID.lower()

# Get cpu_usage

data_dict[device] = {'volume':float(cpu.LoadPercentage), 'unit':'%'}

return data_dict

Memory信息获取

通过Win32_ComputerSystem可以获取机器内存总大小TotalPhysicalMemory,通过Win32_OperatingSystem获取可用内存大小,而Win32_PageFileUsage可以帮助我们获取虚拟内存及交换内存的相关信息。

def get_mem(self):

c = wmi.WMI ()

cs = c.Win32_ComputerSystem()

os = c.Win32_OperatingSystem()

pfu = c.Win32_PageFileUsage()

data_dict = {}

data_dict["MemTotal"] = {'volume':float(cs[0].TotalPhysicalMemory) / (1024*1024), 'unit':'MB'}

data_dict["MemFree"] = {'volume':float(os[0].FreePhysicalMemory)/1024, 'unit':'MB'}

data_dict["SwapTotal"] = {'volume':float(pfu[0].AllocatedBaseSize), 'unit':'MB'}

data_dict["SwapFree"] = {'volume':float(pfu[0].AllocatedBaseSize - pfu[0].CurrentUsage), 'unit':'MB'}

return {'data':data_dict, 'timestamp':time.asctime(time.localtime())}

Disk信息获取

跟CPU和mem类似,我们可以通过Win32_LogicalDisk获取磁盘信息,包括驱动器号、总容量、空闲容量、文件系统类型等。不同的是通过以下代码我们将看到磁盘实时I/O的获取方式。在这里我们通过Win32_PerfFormattedData_PerfDisk_LogicalDisk对象获取到逻辑磁盘的性能数,这个对象不能直接获取,必须通过WbemScripting.SWbemRefresher加入,并通过Refresh方法来刷新获取数据。这也适用于网络实时流量等数据的获取。

def get_disk(self):

c = wmi.WMI ()

data_dict = {}

data_dict['total_available'] = 0

data_dict['total_capacity'] = 0

data_dict['total_free'] = 0

# DriveType=3 : "Local Disk",

for disk in c.Win32_LogicalDisk (DriveType=3):

data_dict['total_available'] += round(float(disk.FreeSpace) / (1024*1024*1024), 2)

data_dict['total_capacity'] += round(float(disk.Size) / (1024*1024*1024), 2)

data_dict['total_free'] += round(float(disk.FreeSpace) / (1024*1024*1024), 2)

dev_tmp = {}

dev_tmp['dev'] = disk.DeviceID

dev_tmp['available'] = {'volume':round(float(disk.FreeSpace) / (1024*1024*1024), 2), 'unit':'GB'}

dev_tmp['capacity'] = {'volume':round(float(disk.Size) / (1024*1024*1024), 2), 'unit':'GB'}

dev_tmp['free'] = {'volume':round(float(disk.FreeSpace) / (1024*1024*1024), 2), 'unit':'GB'}

dev_tmp['fstype'] = disk.FileSystem

dev_tmp['mnt'] = ''

dev_tmp['used'] = round(long(disk.FreeSpace) / long(disk.Size), 2)

data_dict[disk.DeviceID] = dev_tmp

com = client.Dispatch("WbemScripting.SWbemRefresher")

obj = client.GetObject("winmgmts:\\root\cimv2")

diskitems = com.AddEnum(obj, "Win32_PerfFormattedData_PerfDisk_LogicalDisk").objectSet

com.Refresh()

for item in diskitems:

if item.Name in data_dict:

data_dict[item.Name]['io_stat'] = {}

data_dict[item.Name]['io_stat']['r/s'] = {'volume':float(item.DiskReadsPerSec), 'unit':''}

data_dict[item.Name]['io_stat']['w/s'] = {'volume':float(item.DiskWritesPerSec), 'unit':''}

data_dict[item.Name]['io_stat']['rkB/s'] = {'volume':(float(item.DiskReadBytesPerSec) / 1024), 'unit':'KB/s'}

data_dict[item.Name]['io_stat']['wkB/s'] = {'volume':(float(item.DiskWriteBytesPerSec) / 1024), 'unit':'KB/s'}

return {'data':data_dict, 'timestamp':time.asctime(time.localtime())}

Net信息获取

照葫芦画瓢,Net可以通过以下方式获取:

def get_net(self):

c = wmi.WMI ()

com = client.Dispatch("WbemScripting.SWbemRefresher")

obj = client.GetObject("winmgmts:\\root\cimv2")

items = com.AddEnum(obj, "Win32_PerfRawData_Tcpip_NetworkInterface").objectSet

data_dict = {}

interfaces = []

for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1):

print interface.IPAddress[0]

interfaces.append(interface.Description)

net_bytes_in = 0

net_bytes_out = 0

net_pkts_in = 0

net_pkts_out = 0

com.Refresh()

for item in items:

if item.Name in interfaces:

#print 'Name:%s -> B_in:%s, B_out:%s, P_in:%s, P_out:%s' %(item.Name, item.BytesReceivedPerSec, item.BytesSentPerSec, item.PacketsReceivedPerSec, item.PacketsSentPerSec)

net_bytes_in += long(item.BytesReceivedPerSec)

net_bytes_out += long(item.BytesSentPerSec)

net_pkts_in += long(item.PacketsReceivedPerSec)

net_pkts_out += long(item.PacketsSentPerSec)

time.sleep(1)

net_bytes_in_cur = 0

net_bytes_out_cur = 0

com.Refresh()

for item in items:

if item.Name in interfaces:

net_bytes_in = long(item.BytesReceivedPerSec) - net_bytes_in

net_bytes_in_cur += long(item.BytesReceivedPerSec)

net_bytes_out = long(item.BytesSentPerSec) - net_bytes_out

net_bytes_out_cur += long(item.BytesSentPerSec)

net_pkts_in = long(item.PacketsReceivedPerSec) - net_pkts_in

net_pkts_out = long(item.PacketsSentPerSec) - net_pkts_out

data_dict['net_bytes_in'] = {'volume':net_bytes_in, 'unit':'B/s'}

data_dict['net_bytes_in_sum'] = {'volume':net_bytes_in_cur, 'unit':'B'}

data_dict['net_bytes_out'] = {'volume':net_bytes_out, 'unit':'B/s'}

data_dict['net_bytes_out_sum'] = {'volume':net_bytes_out_cur, 'unit':'B'}

data_dict['net_pkts_in'] = {'volume':net_pkts_in, 'unit':'p/s'}

data_dict['net_pkts_out'] = {'volume':net_pkts_out, 'unit':'p/s'}

return {'data':data_dict, 'timestamp':time.asctime(time.localtime())}

需要注意的是,虽然在

Win32_PerfRawData_Tcpip_NetworkInterface

的文档中,

BytesReceivedPerSec

被解释为“Rate at which bytes are received on the interface, including framing characters.”,但是我仍然发现这类以

PerSec

结尾的参数都是累积值而不是真正的速率,因此我使用休眠1秒后取delta的方式求网卡的瞬时速率。

小结:

本文通过几个例子说明如何使用Python通过WMI获取Windows系统信息。其中涉及到的Win32类定义请参阅微软官方开发文档。下篇将演示如何用Windows服务框架包装监控轮询任务。 相关

代码下载

Github

python server agent_Python实现Windows监控agent(上)相关推荐

  1. 通过Python在Windows或Linux上快速搭建HTTP服务器

    在Windows 7/10或Ubuntu上可以通过python2.x或python3.x来快速搭建一个简单的HTTP服务器. 如果python为2.x,则可执行:$ python -m SimpleH ...

  2. python如何连接自己电脑服务器_Python远程连接windows服务器并上传数据

    [芝麻IP代理]大数据时代下,我们对于Python的应用真的是淋漓尽致,第一次玩服务器,电脑端远程连接能连上,可SSH却始终不行,后来才发现,这根本不是一种东西,SSH得在服务器上搭建SSH seve ...

  3. python linux编程与window编程_Python3如何在Windows和Linux上打包

    1.唠唠叨叨 最近项目中需要Python的打包,看到网上也没有很详细的资料,于是做了一些示例程序.小小的研究了一下,Python如何在Windows和Linux上打包,并把程序源码以及各个记录上传到G ...

  4. JProfiler远程监控Linux上Tomcat的安装过程细讲(步骤非常详细!!!)

    JProfiler远程监控Linux上Tomcat的安装过程细讲(步骤非常详细!!!) 1.文件准备: 服务器:CentOS Linux release 7.3.1611 (Core)     Apa ...

  5. SQL Server添加MDW性能监控报表(转载)

    SQL Server添加MDW性能监控报表(转载) 10.2 Data Collector与MDW Data Collection功能是SQL SERVER 2005版本提供的数据库监控报表的功能,通 ...

  6. Python免费的家庭视频监控系统(1)

    Python免费家庭视频监控系统(1) 文章目录 基本原理: 环境搭建 FFmpeg 安装及使用 如何安装? ffmpeg 推rtmp视频流: nginx网络服务器 如何获取安装包 如何安装 如何开启 ...

  7. zabbix php日志,监控日志 - 2.Zabbix 监控(上)

    百度百科介绍: zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理 ...

  8. nagios用NsClient自定义windows监控

    Nagios用NsClient自定义windows监控 NsClient++来监控windows主机有三种方式:check_nt,check_nrpe,nsca. 相对而言,check_nrpe已经可 ...

  9. xp支持python最高版本是多少_哪些版本的Python可以在Windows XP中运行?(What versions of Python will work in Windows XP?)...

    哪些版本的Python可以在Windows XP中运行?(What versions of Python will work in Windows XP?) 什么版本的Python可以在Windows ...

  10. 全面了解Windows Server 2003 和 Windows XP 附带的系统服务

    简介   系统服务的处理不同于其他设置,因为所有服务的漏洞.对策及潜在影响在本质上都一样.第一次安装 Microsoft Windows Server 2003 时,系统将在启动时创建并配置默认服务. ...

最新文章

  1. python turtle库画图案-python之绘制图形库turtle(转)
  2. Spring Cloud开发实践 - 04 - Docker部署
  3. for循环的执行顺序
  4. Altium designer中高亮元器件或网络时对比度调节
  5. 使用Bootstrap插件datapicker获取时间
  6. TeXworks 0.4.5 发布,TeX 编辑器
  7. 安卓开发工程师面试题!春招我借这份PDF的复习思路,不吃透都对不起自己
  8. 缺陷调研报告_工厂的缺陷的分析报告及产生原因
  9. 自动化学matlab,自动化Matlab而无需用户登录
  10. Android ADB命令?这一次我再也不死记了!【简单说】
  11. 乒乓球单循环赛_乒乓球淘汰赛制和单循环赛制的比赛方法是什么?
  12. 【机器人学:运动规划】快速搜索随机树(RRT---Rapidly-exploring Random Trees)入门及在Matlab中演示
  13. 性能优化:空间换时间
  14. 聊聊微服务架构的优缺点
  15. java后台数据传到前台的流程_java serlve后台数据传到前台
  16. Key(Windows Android),申请 android google 地图 API key(转)
  17. 企业微信有什么用,介绍企业微信6个强大的功能
  18. HTML5中的SVG是什么?
  19. Neural Networks and Deep Learning
  20. hyperf 热重启

热门文章

  1. 常用响应式web UI框架搜集整理
  2. 为IT部门画一个“饼”
  3. Linux下的Nginx安装(开机自启动)
  4. Linux进程线程学习笔记
  5. linux malloc 内存不足,linux中 对malloc/free分配及释放内存空间时发生的泄漏问题
  6. 反射:集合泛型的本质
  7. CF984C Finite or not?
  8. Centos给/根分区扩容(图文讲解)
  9. android恶意软件流量,基于流量分析的安卓恶意软件检测
  10. 利用matlab编程实现主成分分析,利用Matlab编程进行主成分分析