分布式监控系统之Zabbix基础使用

  前文我们了解了分布式监控系统zabbix的相关组件的作用和zabbix的部署,回顾请参考//www.cnblogs.com/qiuhom-1874/p/13997582.html;今天我们来了解下zabbix的基础使用;

  在开始使用zabbix之前,我们先来了解下zabbix的一些术语

  1、监控项(item):什么是监控项?

  在zabbix中监控项(item)是一个核心的东西,所有监控都是围绕监控项展开的,可以说没有监控项就没有我们想要的指标数据;所以简单讲监控项就是被监控对象的指标数据,通常这个被监控的对象我们称为主机(host),它可以是一个网络设备或一台服务器,用ip地址或dns域名指定;一台主机可以是属于一个或多个主机组(host group),所谓主机组就是多台主机的相同集合,用来逻辑的将主机分组,方便统一标识和管理;比如一台server它可以是tomcat主机组,也可以是nginx主机组,不同主机组可能有不同的监控项;同时对于监控项来讲也有类似组的概念,在zabbix中多个监控项逻辑的划分在一起就是监控项组,但通常我们不叫监控项组,而是叫application;所以application就是多个监控项的逻辑组,一个监控项通常属于一个或多个application,这个和主机组的逻辑是一样的;

  2、触发器(trigger):什么是触发器?

  所谓触发器就是一个表达式,这个表达式主要用来评判我们采集的数据是否处于合理范围内?如果我们采集的数据是一个非合理范围,则该表达式就返回true;所以在zabbix中触发器就是用来定义我们采集到的数据的非合理区间,用于评估某监控对象的某些特定item内所接收到的数据是否在合理范围内(即阈值),如果接收到的数据大于指定的阈值,此时触发状态就会从OK状态转变为problem状态;当数据量再次回归到合理范围时,此时触发器又会从problem状态回归ok状态;简单讲触发器就是用来评估某些监控项采集到数据是否合理,如果不合理,就生成一个触发器事件(event),而这个事件会被其他组件监听,一旦监听到对应的事件产生,其他组件随之就会采取一定的措施;比如发短信、发邮件或者重启服务等等操作;

  3、动作(action):什么是action?

  action指当特定的事件产生时,对应该采取的措施,比如当我们监控到nginx服务宕机了,此时我们应该采取什么措施?重启服务,发送短信通知管理员等等;所以action就是指对于特定事件事先定义的处理方法,通过包含操作(如发送通知)和条件(何时执行操作);

  4、图像(graphs):什么是graph?

  graph就是指把对应一个或多个监控项的历史数据通过图像的方式展示出来,主要方便我们来查看过去一段时间对应监控项的数据变化情况;我们把一个或多个监控项组合在一起显示就叫做一个graph;多个graph组成一个屏幕(screen),多个screen组成一个slide show;

  了解了以上术语,接下来我们来添加一个主机到zabbix上

  复制zabbix yum仓库文件到被监控主机之上

[root@node03 ~]# scp /etc/yum.repos.d/zabbix.repo  node04:/etc/yum.repos.d/
zabbix.repo                                                                   100%  242    98.5KB/s   00:00    
[root@node03 ~]# 

  在被监控主机之上安装zabbix-agent

[root@node04 ~]# yum install -y zabbix-agent 

  配置zabbix-agent 

[root@node04 ~]# grep -Ei ^[^#] /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=192.168.0.43
ListenPort=10050
ListenIP=0.0.0.0
StartAgents=3
ServerActive=192.168.0.43
HostnameItem=system.hostname
Include=/etc/zabbix/zabbix_agentd.d/*.conf
[root@node04 ~]# 

  启动zabbix-agent

[root@node04 ~]# systemctl start zabbix-agent.service 
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  提示:请确保10050正常监听并能够和zabbix正常通信;

  创建主机组

  提示:登录zabbix web,找到configuration菜单—->Host groups —-> create host group;

  提示:填写对应要创建的主机组名称,点击add即可;

  添加主机

  提示:找到configuration菜单—->Hosts—->create host;默认zabbix把zabbixserver是添加了的,这个也是我们为什么要在zabbixserver上装zabbix agent的原因;

  提示:填写要添加主机的主机名,选择要归属地主机组,以及使用哪种信道去采集数据;在zabbix支持4中信道去采集数据,第一种是agent,就是用zabbix agen采集数据;第二种是snmp,这种常用于那些不能安装agent的场景中,比如监控网络设备;第三种是jmx,这种专用于监控java虚拟机的专有信道;第四种是ipmi,这个必须得硬件支持ipmi协议;选择对应的信道填写对应的信息即可;当然一个主机也可以通过多个信道去采集数据;同一种类型的信道也可以添加多个;填写好以上内容点击add就把node04添加到zabbix监控系统中了;

  提示:添加好主机以后,在hosts列表中就能看到我们刚才添加到主机,但是它上面的4个信道没有显示为绿色;这是因为在我们添加到主机上没有任何的监控项,所以没有数据采集,对应的信道也不会变绿,只有添加了监控项,有数据采集了,对应信道就会变绿;

  添加item

  提示:在configuration—>Hosts找到对应主机的items,然后点击进去,找到create item;

  提示:在zabbix中内置了很多item,每个item对应有一个key,这个key就是用来标识监控项的,不同的监控项对应使用的采集方式不同,所以监控项就是定义如何去采集数据,怎么采集数据的一个函数,我们在应用时,只需要指定key名,以及传递必要的参数即可;内置监控项的使用说明请查看官方文档//www.zabbix.com/documentation/4.0/manual/config/items/itemtypes/zabbix_agent;填写了对应的信息以后,这里需要注意对应监控项采集到数据到底是一个什么数据,是一个不断累加的值?还是变化值?我们要怎么显示它?对于cpu上下文切换次数这个监控项采集到的是一个不断累加的值,相比我们不是想了解这个监控项采集到数据是多少,而是想要它显示和上一次数据的变化值,所以我们还可设置监控项预处理方案;

  点击左上角的preprocessing

  提示:选择好对应预处理方式以后,点击最下面的add就可以成功将对应监控项添加到对应主机上;

  查看对应监控项是否采集到数据?

  提示:在monitoring—->Latest data 选择对应主机名称点击apply查找;如果对应主机上的监控项在指定时间内采集的有数据,则说明我们配置的监控项没有问题;从上面图片可以看到对应主机cpu上下文切换次数,最新一次数据是26次,比上一次少一次;

  查看对应监控项图形

  点击对应监控项后面的graph按钮即可显示对应监控项的图像

  到此,一个监控项就这样定义好了;要添加第二个监控项也是以上的步骤;

  克隆监控项

  在对应主机的item列表中点击要克隆的监控项

  提示:找到最下面的clone点击即可;

  提示:修改对应名称和key,点击添加即可;

  提示:监控项克隆主要针对监控同类数据的不同指标用到比较多,像上面就是监控ens33这张网卡的进站报文数和出站报文数;这也是一种快速添加监控项的方式;

  添加触发器

  提示:在configuration—>Hosts找到对应主机的Triggers,点击进去,然后找到create trigger按钮,点击进入创建触发器的页面;

  提示:触发器就是一个表达式,该表达式主要来评判对应item采集到数据是否在合理范围,如果不在合理范围该表达式返回true;书写触发器表达式可以点击后面的add来选择;如下

  提示:这个主要用于辅助我们生存触发器表达式;首先选择一个item,然后选择评判的函数,这个函数有很多,默认是last{}函数,这个函数表示取最近几次或某个时间段的数据来做评判标准,如果是次数,在last of (T) 填写对应的次数即可;如果是时间,在time shift填写时间,默认是秒为单位;result是对应评判的标准,比如500,就表示对应触发器表达式会把item采集的数据和500做对比,如果大于500 就会触发一个触发器事件;选择好条件以后点击inset 就可以自动生成我们定义的触发器表达式,定义好触发器以后,点击最下面的add即可添加触发器到指定主机上;

  查看对应监控项的graph,看看是否有触发器呢?

  提示:可以看到对应的item上就可以看到有一个水平线,超过这个线就表示采集到数据不在合理区间,此时就会产生触发器事件;

  查看触发器事件

  提示:在Monitoring—>Problems中就能查看到对应触发器事件,这里显示该事件已经恢复了;

  添加action

  为了演示能看出效果,先在node04上添加一个监控nginx是否存活的监控项

  添加nginx down触发器

  提示:以上表达式表示监控nginx状态最近3次都是down的状态就生成触发器事件;

  添加action

 

  提示:action是针对整个zabbix全局而设定的,只要有对应事件产生,监听该事件的action就会执行相应的操作,常用的操作有发邮件和远程执行命令;

  zabbix监控nginx是否启动,如果没有启动就远程执行命令,让其启动

  提示:action常用的操作有两个,第一个是当触发器从ok状态到problem状态,第二个是从problem到ok状态

  定义operations操作

  提示:选择remote command,添加targetlist为当前主机,type为ssh,填写对应的ssh用户密码端口以及执行的命令,点击add,最后点击add;这里需要注意一点,通常我们使用ssh远程执行命令,不建议直接使用root执行,如果是其他普通用户需要注意执行命令是否有权限,如果没有还需要注意授权问题;

  到此一个远程执行命令的action就定义好了;

  测试:在node04上把nginx停掉,看看它是否会自动执行命令将nginx启动起来呢?

[root@node04 ~]# systemctl stop nginx
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  到zabbix上查看对应监控项的状态

  查看是否产生了触发器事件呢?

  提示:可以看到对应触发器时间已经产生;我们等待3个检查周期,看看它是否会触发我们定义的action呢

  提示:再次查看该事件已经恢复;

  在node04上查看nginx是否启动?

[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:80                                       *:*                  
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::80                                      :::*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  提示:可以看到80端口已经正常处于监听状态;这说明我们刚才定义的action生效了;

  定义action发送邮件

  添加发送邮件的媒介

  提示:默认有3个媒介,这三个媒介是zabbix默认的,建议不使用,直接自己添加;

  提示:这个邮箱的密码填写开启smtp后自动生成的密码;填写好对应的邮箱相关信息后点击add即可;

  编辑admin用户,配置接收邮件地址

  提示:这里要选择我们刚才添加媒介类型;

  编辑nginx down action

  提示:选择send massage,添加邮件接收人,以及发送邮件的媒介点击update,最后点击最下面的update;

  测试:在node04上把nginx服务停掉,看看是否会给[email protected]发送邮件呢?

[root@node04 ~]# systemctl stop nginx
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  查看是否产生了触发器事件?

  提示:可以看到对应的事件已经产生,也执行了邮件发送;

  登录对应接收邮件的邮箱,查看是否有收到邮件呢?

  提示:可以看到在对应接收邮件里有一份[email protected]发送过来的邮件,告诉我们说node04上的nginx down掉了;我上面只是配置了触发器从ok到problem状态时发送邮件,从problem到ok状态没有配置发送邮件,生产中可以配置上;

  除了以上通过配置媒介的方式使用互联网邮箱发邮件,还可以使用脚本方式发邮件

  查看zabbix server存放告警脚本路径

  提示:默认存放告警路径为:/usr/lib/zabbix/alertscripts/目录下

  在zabbixserver的/usr/lib/zabbix/alertscripts/目录下创建sendmail.py脚本

[root@node03 ~]# cat /usr/lib/zabbix/alertscripts/sendmail.py 
#!/usr/bin/python
#coding:utf-8

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr,formataddr
import sys

def formatAddr(s):
    name,addr = parseaddr(s)
    return formataddr((Header(name,'utf-8').encode(),addr))

def send_mail(to_list,subject,content):
    mail_host = 'smtp.126.com'
    mail_user = '[email protected]'
    mail_pass = 'XIAEYNSCRHLYFADN'
    msg = MIMEText(content,'','utf-8')
    msg['Subject'] = Header(subject,'utf-8')
    msg['From'] = formatAddr('zabbix监控<%s>' %mail_user).encode()
    msg['to'] = to_list

    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(mail_user,to_list,msg.as_string())
        s.close()
        return True
    except Exception,e:
        print str(e)
        return False
if __name__ == "__main__":
    send_mail(sys.argv[1],sys.argv[2],sys.argv[3])

[root@node03 ~]# 

  提示:调用此脚本时需要传递三个参数给脚本,第一个参数是接收人的邮件地址,在zabbix中用内建宏{ALERT.SENDTO}表示,第二个参数是邮件标题,内建宏为{ALERT.SUBJECT};第三个参数是邮件正文,内建宏{ALERT.MESSAGE};

  赋予脚本执行权限

[root@node03 alertscripts]# chmod +x sendmail.py 
[root@node03 alertscripts]# ll
total 4
-rwxr-xr-x 1 root root 909 Nov 19 23:31 sendmail.py
[root@node03 alertscripts]# 

  测试:手动传递参数,看看脚本是否能够正常给我们发邮件?

[root@node03 alertscripts]# python sendmail.py '[email protected]' 'test' 'this is test mail'
[root@node03 alertscripts]# 

  登录[email protected],看看是否有收到邮件?

  提示:在测试邮箱里能够看到我们发送到邮件,说明脚本没有问题;

  创建脚本媒介

  提示:创建媒介类型时,选择script,写上脚本名称和脚本需要传递参数内建宏,然后点击add即可;有关zabbix内建宏的说明请参考官方文档说明//www.zabbix.com/documentation/4.0/manual/appendix/macros/supported_by_location

  编辑nginx down action,调用脚本来发送邮件

  更改admin用户的媒介类型为我们创建的sendmail_script

  测试:停掉node04上的nginx,看看是否会产生触发器事件?

[root@node04 ~]# systemctl stop nginx
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]#

  查看是否有触发器事件产生?

  查看对应接收邮箱里是否收到邮件呢?

  提示:这个邮件可能收到会有延迟,如果上面显示已经发送成功,基本上都可以收到;

  配置graph

  提示:configuration—> Hosts找到对应主机中的Graphs,点击进去,找到create graph按钮进入graph创建界面

  提示:选择好对应item和其他显示选项,点击add即可;

  预览graph

  添加多个item到一个graph中

  预览

  添加多个graph为一个screen

  提示:默认点击Monitoring —>Screens它显示的是zabbix server默认的屏幕,我们需要点击allscreens回到上图位置;点击create screen进入创建屏幕页面;

  点击创建好的屏幕,编辑screen,添加graph

  提示:按照以上示例,添加其他graph到其他位置即可;

  预览screen

  创建slide show 

  预览

  到此,zabbix基础使用就到此结束了!!