分布式监控系统项目实战

背景:此前我们讲到了如果安装和使用zabbix,我们可以使用zabbix来完成一下基本监控项的监控工作,但是很多时候我们也需要自定一些监控项来完成自己的定制化的监控的需求,所以,我们本章就重点从zabbix如何定制化监控的角度来做几个实战项目

image-20221019094133445

项目一:使用zabbix监控nginx web服务器的性能

1、在开始监控nginx的web性能之前,我们需要安装nginx,并将nginx的状态监控的功能给打开。

1.1 安装nginx

#先安装epel源
[root@cilent ~]# yum -y install epel-release
#安装nginx
[root@cilent ~]# yum -y install nginx

1.2 配置nginx.conf,开启Ngx_status的性能监控项

vim /etc/nginx/nginx.conf
添加新的模块
 location /ngx_status{
   stub_status on;
   access_log off;
 }

image-20211217171846945

1.3 检查配置及启动服务

[root@cilent nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@cilent nginx]# systemctl restart nginx
[root@cilent nginx]# 

1.4 测试

image-20211217172115711

Active      connections:当前活跃的连接数。
server      accepts                  handled       requests:
       nginx处理连接成功的数量数目,处理请求的数量、和总的请求数。
Reading:nginx正在读取请求头。
Writing:nginx正在将响应写回客户端。
Waiting:nginx正在等待另一个请求。开启keep-alive的情况下,这个值等于 active – (reading + writing),意思就是Nginx已经处理完成,正在等候下一次请求指令的驻留连接。

2、编写nginx性能监控的脚本

[root@cilent scripts]# vim nginx_status.sh
###添加如下的脚本:

#!/bin/bash
# DateTime: 2022-12-12
# Author: wcfeng
HOST="192.168.1.101"
PORT="80"
# 检测nginx进程是否存在
function  ping  {
    /sbin/pidof nginx  |  wc  -l
}
# 检测nginx性能
function  active  {
    /usr/bin/curl  "http://$HOST:$PORT/ngx_status/"  2>/dev/null|  grep  'Active'  |  awk  '{print $NF}'
}
function  reading  {
    /usr/bin/curl  "http://$HOST:$PORT/ngx_status/"  2>/dev/null|  grep  'Reading'  |  awk  '{print $2}'
}
function  writing  {
    /usr/bin/curl  "http://$HOST:$PORT/ngx_status/"  2>/dev/null|  grep  'Writing'  |  awk  '{print $4}'
}
function  waiting  {
    /usr/bin/curl  "http://$HOST:$PORT/ngx_status/"  2>/dev/null|  grep  'Waiting'  |  awk  '{print $6}'
}
function  accepts  {
    /usr/bin/curl  "http://$HOST:$PORT/ngx_status/"  2>/dev/null|  awk NR==3  |  awk  '{print $1}'
}
function  handled  {
    /usr/bin/curl  "http://$HOST:$PORT/ngx_status/"  2>/dev/null|  awk NR==3  |  awk  '{print $2}'
}
function  requests  {
    /usr/bin/curl  "http://$HOST:$PORT/ngx_status/"  2>/dev/null|  awk NR==3  |  awk  '{print $3}'
}
# 执行function
$1

3、在zabbix_agent中定义监控参数

[root@cilent scripts]# vim /etc/zabbix/zabbix_agentd.conf 

image-20211217172759128

##配置完成后,加上权限,并重启agent
[root@cilent scripts]# chmod a+x nginx_status.sh 
[root@cilent scripts]# systemctl restart zabbix-agent 

4、在zabbix_server上进行测试

##安装zabbix-get命令,使用zabbix-get命令获取脚本的值
[root@zabbix-server ~]# yum -y install zabbix-get
[root@zabbix-server ~]# zabbix_get -s 192.168.1.101 -k nginx.status[active]
1

5、进入 zabbix 界面配置监控模板

image-20211217205426691

image-20211217205547206

6、配置流程:配置——模板—— Nginx-status——创建应用集

image-20211217205746996

image-20211217205836916

7、添加监控项

image-20211217210341556

image-20211217210042193

image-20211217210833467

可以自行添加多个值【active】

image-20211217210946123

image-20211217211100683

8、配置流程:配置——模板—— Nginx_status——创建触发器

image-20211217211223000

image-20211217211425811

image-20211217211549763

image-20221215200052346

最终效果如下

image-20211217215524030

9、配置流程:配置——模板—— Nginx_status——创建图形

image-20211217212033669

image-20211217212155049

image-20211217215609348

image-20211217215725971

10、在监控主机中添加自己刚才创建的模板

image-20211217225229431

11、稍等一下,查看是否有相关的图形数据

image-20211217225601435

项目二:使用使用zabbix监控系统性能

背景:zabbix本身自带有非常多的模板可以提供给我们使用,我们可以利用这些已经存在的模板对系统的基础指标进行监控,比如CPU,内存,磁盘等,具体操作如下

1、应用已经存在的模板

image-20211218152404391

image-20211218152430580

image-20211218152452730

2、创建图形

image-202112181526001943、查看图形

image-20211218152940515

以上是利用自带的一些模板的所具备的监控的功能,但是部分的功能是不存在的,比如磁盘的监控,我们可以尝试自建模板来测试一下

4、可以查看自带的一些模板的应用集的类型【主机---所有模板---Template OS linux--Filesystems】

image-20211218155325070

5、监控磁盘的TPS的值

image-20211218160126854

6、将TPS的值获取出来

[root@web02 ~]# iostat |awk '/sda/{print $2}'
1.53

7、修改agent的配置文件

 vim /etc/zabbix/zabbix_agentd.conf
335 ### Option: UserParameter
336 #       User-defined parameter to monitor. There can be several user-defined parameters.
337 #       Format: UserParameter=<key>,<shell command>
338 #       See 'zabbix_agentd' directory for examples.
339 #
340 # Mandatory: no
341 # Default:
342 #UserParameter=nginx.status[*],/opt/nginx.sh $1
343 UserParameter=sda_tps,iostat |awk '/sda/{print $2}'   #添加

8、重启zabbix-agent

[root@web02 scripts]# systemctl restart zabbix-agent

9、先在zabbix_server测试一下是否可以获取到值

[root@zabbix-server ~]# zabbix_get -s 192.168.1.102 -k sda_tps
1.47

10、添加监控项

image-20211218161445795

image-20211218161523707

image-20211218161708509

11、查看监控的值

image-20211218161818372

image-20211218162530794

可以看到已经可以成功监控到磁盘的tps的值了。

当然,此方法也可以运用到监控其他的性能指标,比如说TCP的已经建立的连接数【ESTABLISHED】

以上这种方式是比较麻烦的,如果你本地有100台主机,每一台台主机进行配置文件的编写将会变得十分的麻烦,zabbix也提供一些更加方便的主机配置文件的管理方案,我们可以将需要被监控的主机的配置项的配置写入到如下目录即可,这样就可以批量推送给其他的主机,而不需要在进行单台进行修改。

/etc/zabbix/zabbix_agentd.d

完成后,在zabbix控制台上,我们可以利用监控项的复制的功能,将新建的监控项复制到其他的主机或者主机组即可,例如

image-20211218172327667

image-20211218172403278

可以看到,zabbix-server这个主机也具备了相同的监控项

image-20211218172509131

项目三:web场景监测实战

zabbix监控网站,一般通过http code进行,如果http code返回200,代表网站状态正常,当然还有更进一步的监控,比如通过用户名和密码登录后台,如果响应,返回200,就表示post成功,并且通过正则表达式从响应的html中匹配sid;验证登录,打开首页,检索html中是否包含profile(说明:只有登录成功,才会有的profile出现);退出账号,传递sid给index.php即可退出,响应200即表示退出成功。

web场景监测实战1:

我们这里只验证首页状态,不通过登录后台验证。

1、创建新的Web场景 添加一个场景来监控Zabbix的Web界面。该场景将执行多个步骤。点击配置->主机->选择主机->单击Web监测->创建Web监测

image-20221124194838781

image-20221124194859303

image-20221124195250534

2、点击“步骤”添加监控步骤

image-20221124195525055

image-20221124201133376

image-20221124201338886

image-20221124201427857

3、查看数据

image-20221124201601449

image-20221124201635349

image-20221124201656034

web场景监测实战2:监测需要使用用户名和密码的场景的web网站

这里我们使用zabbix网站测试使用用户名和密码登录的场景

1、测试curl登录

获取登录zabbix的页面

[root@zabbix-server ~]# curl -b cookies -c cookies "http://192.168.1.100/zabbix/index.php" >/usr/share/zabbix/index.html

2、测试访问获取cookies信息

image-20221217152243253

3、测试curl登录

[root@zabbix-server ~]# curl -b cookies -c cookies -L  -d "name=Admin&password=zabbix&autologin=1&enter=Sign+in" "http://192.168.1.100/zabbix/index.php"
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0




100    52    0     0  100    52      0   1242 --:--:-- --:--:-- --:--:--  1238
<!DOCTYPE html>
<html>
        <head>
                <meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
                <meta charset="utf-8" />
                <meta name="viewport" content="width=device-width, initial-scale=1">
                <meta name="Author" content="Zabbix SIA" />
                <title>服务器监控中心: 仪表板</title>
                <link rel="icon" href="favicon.ico">
                <link rel="apple-touch-icon-precomposed" sizes="76x76" href="assets/img/apple-touch-icon-76x76-precomposed.png">
                <link rel="apple-touch-icon-precomposed" sizes="120x120" href="assets/img/apple-touch-icon-120x120-precomposed.png">
                <link rel="apple-touch-icon-precomposed" sizes="152x152" href="assets/img/apple-touch-icon-152x152-precomposed.png">
                <link rel="apple-touch-icon-precomposed" sizes="180x180" href="assets/img/apple-touch-icon-180x180-precomposed.png">
                <link rel="icon" sizes="192x192" href="assets/img/touch-icon-192x192.png">
                <meta name="csrf-token" content="c08e346d9b0c9733"/>
                <meta name="msapplication-TileImage" content="assets/img/ms-tile-144x144.png">
                <meta name="msapplication-TileColor" content="#d40000">
                <meta name="msapplication-config" content="none"/>
<link rel="stylesheet" type="text/css" href="assets/styles/blue-theme.css?1663568732" />
<style type="text/css">.na-bg, .na-bg input[type="radio"]:checked + label, .na-bg:before, .flh-na-bg, .status-na-bg { background-color: #97AAB3 }
.info-bg, .info-bg input[type="radio"]:checked + label, .info-bg:before, .flh-info-bg, .status-info-bg { background-color: #7499FF }
.warning-bg, .warning-bg input[type="radio"]:checked + label, .warning-bg:before, .flh-warning-bg, .status-warning-bg { background-color: #FFC859 }
.average-bg, .average-bg input[type="radio"]:checked + label, .average-bg:before, .flh-average-bg, .status-average-bg { background-color: #FFA059 }
.high-bg, .high-bg input[type="radio"]:checked + label, .high-bg:before, .flh-high-bg, .status-high-bg { background-color: #E97659 }
.disaster-bg, .disaster-bg input[type="radio"]:checked + label, .disaster-bg:before, .flh-disaster-bg, .status-disaster-bg { background-color: #E45959 }

说明curl测试登录正常!

4、接下来,我们使用zabbix的web场景来进行监测

image-20221217153714030

image-20221217154101662

5、添加一个登录步骤

image-20221217154724869

image-20221217154859571

6、查看监测数据

image-20221217154955578

7、查看图形数据

image-20221217155103792

image-20221217160604994

8、新建触发器

image-20221217161428877

9、新建图形

image-20221217161822013

10、压力测试zabbix登录接口,使之能触发告警

压测命令:
[root@zabbix-server ~]# ab -n 1000000 -c 1000 http://192.168.1.100/zabbix/index.php

image-20221217163922976

项目四:zabbix监控mysql数据库

zabbix3.0 server已自带MySQL的模板了,只需配置好agent客户端,然后在web端主机增加模板就行了

如果没有安装数据库,需要提前安装。

1、数据库用户授权(zabbix_agent客户端操作)

mysql> grant all on *.* to zabbix@'localhost' identified by "123";
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)

mysql>

2、查看自带的mysql的模板

新版本的数据库模板需要从/usr/share/doc/zabbix-agent-5.0.40复制过来

[root@server1 zabbix_agentd.d]#cp /usr/share/doc/zabbix-agent-5.0.40/userparameter_mysql.conf /etc/zabbix/zabbix_agentd.d/
[root@server1 zabbix_agentd.d]# pwd
/etc/zabbix/zabbix_agentd.d
[root@server1 zabbix_agentd.d]# ls
php-fpm.conf  userparameter_mysql.conf

3、编辑zabbix_agentd.conf文件,启用如下的配置项

Include=/etc/zabbix/zabbix_agentd.d/*.conf  ##我这里默认开启了

4、建立数据库和zabbix的连接信息

在zabbix_agent服务/etc/zabbix目录下创建**.my.cnf** 连接文件【注意是隐藏文件】

[mysql]  
host=localhost  
user=zabbix  
password=123
socket=/var/lib/mysql/mysql.sock   #mysql套接字文件存放位置【和当前的数据库存放位置一致】
[mysqladmin]  
host=localhost   
user=zabbix     #连接数据库账号、密码
password=123
socket=/var/lib/mysql/mysql.sock

5、查看 userparameter_mysql.conf 文件,把路径全都替换为/etc/zabbix,也就是上面的**.my.cnf**文件所在的目录路径

[root@server1 zabbix_agentd.d]#vim /etc/zabbix/zabbix_agentd.conf.d/userparameter_mysql.conf
#template_db_mysql.conf created by Zabbix for "Template DB MySQL" and Zabbix 4.2
#For OS Linux: You need create .my.cnf in zabbix-agent home directory (/var/lib/zabbix by default) 
#For OS Windows: You need add PATH to mysql and mysqladmin and create my.cnf in %WINDIR%\my.cnf,C:\my.cnf,BASEDIR\my.cnf https://dev.mysql.com/doc/refman/5.7/en/option-files.html
#The file must have three strings:
#[client]
#user=zbx_monitor
#password=<password>
#
UserParameter=mysql.ping[*], mysqladmin -h"$1" -P"$2" ping
UserParameter=mysql.get_status_variables[*], mysql -h"$1" -P"$2" -sNX -e "show global status"
UserParameter=mysql.version[*], mysqladmin -s -h"$1" -P"$2" version
UserParameter=mysql.db.discovery[*], mysql -h"$1" -P"$2" -sN -e "show databases"
UserParameter=mysql.dbsize[*], mysql -h"$1" -P"$2" -sN -e "SELECT SUM(DATA_LENGTH + INDEX_LENGTH) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$3'"
UserParameter=mysql.replication.discovery[*], mysql -h"$1" -P"$2" -sNX -e "show slave status"
UserParameter=mysql.slave_status[*], mysql -h"$1" -P"$2" -sNX -e "show slave status"

将上述内容修改成:
#template_db_mysql.conf created by Zabbix for "Template DB MySQL" and Zabbix 4.2
#For OS Linux: You need create .my.cnf in zabbix-agent home directory (/var/lib/zabbix by default) 
#For OS Windows: You need add PATH to mysql and mysqladmin and create my.cnf in %WINDIR%\my.cnf,C:\my.cnf,BASEDIR\my.cnf https://dev.mysql.com/doc/refman/5.7/en/option-files.html
#The file must have three strings:
#[client]
#user=zbx_monitor
#password=<password>
#
UserParameter=mysql.ping[*], HOME=/etc/zabbix mysqladmin -h"$1" -P"$2" ping
UserParameter=mysql.get_status_variables[*], HOME=/etc/zabbix mysql -h"$1" -P"$2" -sNX -e "show global status"
UserParameter=mysql.version[*], HOME=/etc/zabbix mysqladmin -s -h"$1" -P"$2" version
UserParameter=mysql.db.discovery[*], HOME=/etc/zabbix mysql -h"$1" -P"$2" -sN -e "show databases"
UserParameter=mysql.dbsize[*], HOME=/etc/zabbix mysql -h"$1" -P"$2" -sN -e "SELECT SUM(DATA_LENGTH + INDEX_LENGTH) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$3'"
UserParameter=mysql.replication.discovery[*], HOME=/etc/zabbix mysql -h"$1" -P"$2" -sNX -e "show slave status"
UserParameter=mysql.slave_status[*], HOME=/etc/zabbix mysql -h"$1" -P"$2" -sNX -e "show slave status"

6、重启zabbix_agent

[root@server1 zabbix]# systemctl restart zabbix-agent

7、模板应用主机

登录zabbix监控界面,在“配置”-“模板”里可以看到自带的mysql监控模板

image-20221124204308773

image-20221124204421644

image-20221124204614705

8、查看数据

image-20221124204719564

9、查看图形数据

image-20221124204853227

10、将数据通过grafana来展示

添加数据源-----》新建大盘

image-20221124205519777

image-20221124205636273

项目五:使用zabbix触发钉钉告警通知

1、创建一个钉钉的群,添加自定义机器人(手机无法设置,要在电脑上)

image-20211218210701666

2、添加告警的关键字,当触发关键字就会发消息出来,保存后会弹出类似api之类接口

image-20211218211057637

image-20211218211142626

3、在zabbix_server配置告警,默认提供了告警脚本的存放路径

cd /usr/lib/zabbix/alertscripts
#!/usr/bin/env python2.7
#coding:utf-8
#zabbix钉钉报警
import requests,json,sys,os,datetime
webhook="https://oapi.dingtalk.com/robot/send?access_token=a224fda2f6af5e9557404536a51eab76f02ffeaa0de7402b3acdafdcac871919"
user=sys.argv[1]
text=sys.argv[3]
data={
    "msgtype": "text",
    "text": {
        "content": text
    },
    "at": {
        "atMobiles": [
            18679183125
        ],
        "isAtAll": False
    }
}
headers = {'Content-Type': 'application/json'}
x=requests.post(url=webhook,data=json.dumps(data),headers=headers)
if os.path.exists("/tmp/zabbix_dingding.log"):
    f=open("/tmp/zabbix_dingding.log","a+")
else:
    f=open("/tmp/zabbix_dingding.log","w+")
f.write("\n"+"--"*30)
if x.json()["errcode"] == 0:
    f.write("\n"+str(datetime.datetime.now())+"    "+str(user)+"    "+"发送成功"+"\n"+str(text))
    f.close()
else:
    f.write("\n"+str(datetime.datetime.now()) + "    " + str(user) + "    " + "发送失败" + "\n" + str(text))
    f.close()
Python脚本里需要更改上面复制钉钉的Webhook进行替换
[root@zabbix-server alertscripts]# chmod a+x dingding.py

4、测试脚本

[root@zabbix-server alertscripts]# ./dingding.py test 18679183125 "test"

image-yity.png

说明脚本没有问题。

如果测试出现如下错误:

[root@zabbix-server alertscripts]# ./dingding.py test test
Traceback (most recent call last):
  File "./dingding.py", line 4, in <module>
    import requests,json,sys,os,datetime
ImportError: No module named requests

请执行下面的命令将requests库安装一下

[root@zabbix-server alertscripts]# yum install python-requests 

5、配置监控项(以用户登录数为例)

image-20211218214756407

image-20211218214341218

添加监控项键值

image-20211218214548715

6、创建触发器

image-20211218220345843

image-20211218220438240

image-20211218220453512

7、定义报警类型

image-20211219124227009

官档:https://www.zabbix.com/documentation/3.0/en/manual/introduction/whatsnew300

脚本参数:

{ALERT.SENDTO}

#对应脚本中的,user=sys.argv[1](发给钉钉群中哪个用户)。

{ALERT.SUBJECT}

#代表发送的信息的标题,在"报表"的"动作日志"中可以看到。

{ALERT.MESSAGE}
#对应脚本中的,text=sys.argv[3](发送的报警内容)。

8、定义收件人

image-20211218223010906

image-20211218223303532

9、启用动作

image-20211218223054282

image-20211219124142043

消息内容优化参数

服务器:{HOST.NAME} 发生:{TRIGGER.NAME}故障!异常
{
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
}

10、测试,多开几个终端测试

image-20211218223630470

可以看到报错了,这是因为我们的zabbix运行默认是zabbix这个用户的,需要修改一下权限,或者直接将/tmp/zabbix_dingding.log这个文件删除掉即可

[root@zabbix-server tmp]# rm -rf zabbix_dingding.log 

再次测试,发现已经恢复,钉钉也可以收到告警信息

image-20211218232354361

image-20211219124028260