新来的小伙伴需要监控IIS站点信息,所以就有了这篇文章
内容很简单基于ZABBIX的LLD功能,本文所有最新内容请点击zabbix-w3wp
1. 什么是LLD
LLD ( 低级发现)可以帮助我们批量在不同的host中创建item、graph、trigger等,例如:下图两个规则,分别是自动发现磁盘及网卡,这个是zabbix默认模板中的自动发现规则,使用默认的模板可以帮助监测系统的基本指标

2. LLD发现规则
{
"data": [
{
"{变量名}": "数据",
"{变量名}": "数据"
}
]
}
# 上面的内容为LLD的数据格式,需要JSON可以解析到,无论用什么方法获取数据只要最后返回给zabbix的结果是可以被JSON解析就成。

3. 获取当前IIS工作的站点
这里可以使用WMI也可以直接使用appcmd(Windows 2008以上)以下内容基于Win 2008 r2 进行

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
import subprocess
directory = 'C:/Windows/System32/inetsrv' # appcmd命令的目录
command = 'appcmd list wp' # 获取当前工作的IIS站点
os.chdir(directory)
result = subprocess.Popen(command,stdout=subprocess.PIPE)
resultlist = []
for i in result.stdout.readlines():
i = str(i)
resultlist.append(i)
n=1
number = len(resultlist) # 获取当前有多少站点正在工作
print('{"data":[')
for line in resultlist:
sitepid = line.split("\"")[1] # 获取站点的pid
sitename = line.split(":")[1].split(")")[0] # 获取站点名称
siteinfo = "%s_%s" % (sitepid, sitename) # 拼接pid和站点名称以便性能监视器获取数据
print('{"{%s}":"%s","{%s}":"%s"}' % ("#SITENAME",sitename,"#SITEINFO",siteinfo)) # 输出数据信息
if n != number: # json最后一段数据不需要逗号,其他行需要
print(',')
n+=1
print(']}')
这段代码通过调用IIS7 的管理命令来获取我们需要的信息然后交给python,过滤出来我们需要的站点名称及PID号,可以直接通过站点名称来获取当前站点的一些信息,然后通过PID号来获取CPU、内存等信息

这段信息并没有把PID号直接输出(虽然输出的数据不好看,但是能用啊-。-),因为zabbix在创建graph的时候会根据一个监控值来获取数据,如果这个值是可变的那么会出现断图的情况所以这里并没有输出pid号
4. 获取站点CPU、内存等信息
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import psutil
import argparse
import subprocess
from os import chdir
parser = argparse.ArgumentParser(description="通过进程PID来获取进程的一些信息")
def getpidbysitename(iisname):
'''通过提供站点名称返回pid号
'''
chdir('C:/Windows/System32/inetsrv')
command = "appcmd list wp"
result = subprocess.Popen(command,stdout=subprocess.PIPE)
resultlist = []
for i in result.stdout.readlines():
i = str(i)
resultlist.append(i)
for line in resultlist:
sitepid = line.split("\"")[1]
sitename = line.split(":")[1].split(")")[0]
if iisname == sitename:
return sitepid
class process():
def __init__(self,pid):
self.__pid = pid
def processinfo(self):
return psutil.Process(int(self.__pid))
def getmemory(self):
'''获取站点内存
'''
try:
return self.processinfo().memory_info().rss
except:
return None
def getcpucounter(self):
'''获取站点CPU占用率
'''
try:
return self.processinfo().cpu_percent(1)
except:
return None
def getthread(self):
'''获取站点打开的线程数
'''
try:
return len(self.processinfo().threads())
except:
return None
parser.add_argument('-m',help="获取进程内存使用 -m sitename")
parser.add_argument('-c',help="获取进程CPU使用 -c sitename")
parser.add_argument('-t',help="获取进程Thread -t sitename")
args = parser.parse_args()
if args.m != None:
print(process(getpidbysitename(args.m)).getmemory())
elif args.c != None:
print(process(getpidbysitename(args.c)).getcpucounter())
elif args.t !=None:
print(process(getpidbysitename(args.t)).getthread())
代码有点LOW,很简单的功能写的有点长,使用帮助使用-h 查看或者代码中有写。

5. 配置zabbix客户端
既然使用的是自定义LLD规则那么必须要修改一下客户端配置,并且把程序放置与zabbix的安装目录下面的script目录即可
UserParameter=iis.discovery,"C:\Program Files\zabbix\script\getiissitename.exe"
UserParameter=iisinfo[*],"C:\Program Files\zabbix\script\getsiteinfo.exe" $1 $2
6. 导入模板
这个操作就不用多说了,在zabbix的用户界面中导入模板就好
模板下载在这里
写在结尾的话
代码很low(勿喷,毕竟我也知道很low),前面代码里面拼接的站点名称及PID后面会更改掉,毕竟zabbix获取值需要一个固定的key
网友评论