前两天看到博客有监控web的,之前也写过pycurl的监控状态;后面想想web监控咱们何不直接通过zabbix的方式监控;zabbix确实是个万花筒,这个也是我喜欢zabbix的一个原因之一吧;pycurl可以参考我之前写过的:http://xiaoluoge.blog.51cto.com/9141967/1616922。



1、监控脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[root@monitor scripts] # cat web_monitor.py 
#!/usr/bin/env python
# -*- coding: utf-8 -*-  
import  os,sys  
import  time  
import  sys  
import  pycurl 
import  json
urllist = [ 'www.baidu.com' , 'www.hao123.com'
class  Test:
     def  __init__( self ):
         self .contents  =  ''
     def  callback( self ,curl):
         self .contents  =  self .contents  +  curl
def  test_gzip(url):
     data  =  {} 
     =  Test() 
     =  pycurl.Curl()  
     c.setopt(pycurl.WRITEFUNCTION,t.callback)
     c.setopt(pycurl.ENCODING,  'gzip' )
     c.setopt(pycurl.URL,url) 
     c.perform()    
     data[ 'HTTP_CODE' ] = c.getinfo(c.HTTP_CODE)
     data[ 'NAMELOOKUP_TIME' ] = (c.getinfo(c.NAMELOOKUP_TIME)) * 1000
     data[ 'CONNECT_TIME' ] = (c.getinfo(c.CONNECT_TIME)) * 1000
     data[ 'PRETRANSFER_TIME' ] = (c.getinfo(c.PRETRANSFER_TIME)) * 1000
     data[ 'SPEED_DOWNLOAD' ] = c.getinfo(c.SPEED_DOWNLOAD)
     return  data
def  web_name_discovery():
     web_list = []
     web_dict = { "data" : None }
     for  url  in  urllist:
         url_dict = {}
         url_dict[ "{#NAME}" ] = url
         web_list.append(url_dict)
     web_dict[ "data" ] = web_list
     jsonStr  =  json.dumps(web_dict, sort_keys = True , indent = 4 )
     return  jsonStr
def  get_web_status():
     data = test_gzip(sys.argv[ 2 ])
     return  data[sys.argv[ 3 ]]
if  __name__  = =  '__main__' :
     if  sys.argv[ 1 = =  "web_name_discovery" :
         print  web_name_discovery()
     elif  sys.argv[ 1 = =  "get_web_status" :
         print  get_web_status()

2、web_name_discovery函数负责以json格式的形式返回我们要监控的网站域名(修改urllist把域名变成你们自己的域名即可):执行结果:

1
2
3
4
5
6
7
8
9
10
11
[root@monitor scripts] # python web_monitor.py web_name_discovery
{
     "data" : [
         {
             "{#NAME}" "www.baidu.com"
         }, 
         {
             "{#NAME}" "www.hao123.com"
         }
     ]
}

**这个{#NAME}就是我们要返回的宏变量;


3、web在anent定义这个key和在web UI定义:

1
2
3
[root@monitor scripts] # cat /usr/local/zabbix/etc/zabbix_agentd.conf.d/web_status.conf 
UserParameter = get_web_name, / usr / local / zabbix / scripts / web_monitor.py web_name_discovery
UserParameter = get_web_status[ * ], / usr / local / zabbix / scripts / web_monitor.py get_web_status $ 1  $ 2


测试结果:


1
2
3
4
5
6
7
8
9
10
11
[root@monitor  bin ] # ./zabbix_get -s 192.168.10.100 -k get_web_name
{
     "data" : [
         {
             "{#NAME}" "www.baidu.com"
         }, 
         {
             "{#NAME}" "www.hao123.com"
         }
     ]
}


定义web UI的key(配置---》模板---创建自动发现规则---》定义第一个获取域名名称的key):


wKioL1eTkmDwJGJKAAAumJNDU8o976.png-wh_50



4、函数get_web_status获取网站各个服务质量的值:查看key设置效果:

# ./zabbix_get -s 192.168.10.100 -k get_web_status[www.hao123.com,HTTP_CODE]       

200


5、这样的话获取key的返回值状态也找到了,剩下的就是在模板里定义监控原先和出图告警监控就好:


wKiom1eTk_jxm13fAACc1V4JtiQ756.png-wh_50


6、监控图形原型设置:


wKiom1eTlNfQDeNRAABaBNn4VW4748.png-wh_50


7、网站各状态响应时间:


wKiom1eTmLqCttdMAAC69-65dzM449.png-wh_50


网站平均下载速度:


wKioL1eTlTeCPHmLAACnQzSYjjI612.png-wh_50


网站的状态码:


wKiom1eTlVLxndZSAABjMa7Woeg717.png-wh_50


到此已经完成,后期大家可以做些优化,或者想不到的地方大家可以修改:我用的是zabbix 3.0的,3.0的话直接下载模板导入,定义angent key即可:


zabbix视频请移步:http://www.roncoo.com/details/fb3050a5b34b42f39ccad83ebebc89c1


zabbix自动化课程目录(需求更新中):


1、zabbix生产环境如何使用

2、saltstack批量部署zabbix_agent

3、zabbix API简单使用讲解

4、web UI讲解

5、开始监控之添加一个简单的linux监控

6、zabbix 强大的内置key讲解

7、内置key的使用、 端口、用户数、磁盘读取状态出图

8、trigger表达式学习,实现用户登录数,端口检查告警

9、zabbix邮件告警设置与维护周期

10、zabbix自定义Key添加,tcp状态模板编写

11、自定义监控之、监控nginx解析与实现

12、自定义监控之php-fpm监控

13、自定义监控之mysql状态监控

14、自定义监控之缓存服务器memcached,redis监控

15、自动化之saltstack管理zabbix,批量推送key生效

16、zabbix自动发现绑定删除模板,自动注册

17、zabbix lld发现讲解以及端口发现监控告警出图

18、zabbix lld 发现web站点以及批量获取状态码

19、zabbix lld复习和监控磁盘的运行状况

20、zabbix生成环境规范和按月生成报表资源统计

21、微信公众号告警

附件:http://down.51cto.com/data/2367965