Zabbix 监控IIS站点

新来的小伙伴需要监控IIS站点信息,所以就有了这篇文章
内容很简单基于ZABBIX的LLD功能,本文所有最新内容请点击zabbix-w3wp

1. 什么是LLD

LLD ( 低级发现)可以帮助我们批量在不同的host中创建item、graph、trigger等,例如:下图两个规则,分别是自动发现磁盘及网卡,这个是zabbix默认模板中的自动发现规则,使用默认的模板可以帮助监测系统的基本指标

《Zabbix 监控IIS站点》

2. LLD发现规则

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

《Zabbix 监控IIS站点》

3. 获取当前IIS工作的站点

这里可以使用WMI也可以直接使用appcmd(Windows 2008以上)以下内容基于Win 2008 r2 进行

《Zabbix 监控IIS站点》

#!/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、内存等信息

《Zabbix 监控IIS站点》

这段信息并没有把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 查看或者代码中有写。

《Zabbix 监控IIS站点》

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

    原文作者:Yxnt
    原文地址: https://www.jianshu.com/p/f6e52f69658e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞