步骤
确认工作需求:从0到1的监控架构或监控完善
计划和分析:会议分析,制定初步计划与文档
实施:进行实际部署,定期汇报
总结与培训:总结文档资料,对员工培训
工作需求 从0搭建以下的监控体系:
需要监控的细节:
基础设施/硬件:温度、风扇转速、raid状态、网络设备等
系统基础指标:CPU、内存、磁盘、网络、负载等
服务监控:不同服务如nginx/php/tomcat/db/nfs/rsync等
业务/应用监控:检查业务/应用是否可用,书写专用页面显示业务状态
API接口/网关:curl/wget监控接口是否可用
其他监控:
DNS/CDN监控:ping.chinaz.com(免费)、听云/应用宝(商业)
pv/uv/ip监控:第三方监控代码,如百度统计等
用户行为监控:piwik/maomo等
舆情监控:第三方公司做
初步计划
公司所有服务器的基础监控:使用zabbix自带的模板,比如:Template os linux by zabbix agent
DNS/CDN的监控:使用 ping.chinaz.com(免费) 或 听云/应用宝(商业)
负载均衡的监控:
nginx/lvs/haproxy状态监控
keepalived进程监控
web服务器监控
9000端口监控(nginx连接php)
3306端口监控(php连接数据库)
tomcat多实例/单实例监控(JVM内存使用情况)
日志中每种状态码的数量监控
tcp11种状态的数量监控(当前网站并发)
https证书过期时间
数据库服务监控
存储服务
nfs服务/rpcbind服务监控
共享了哪些目录,共享目录的大小
备份服务器监控
Redis监控
其他监控:openvpn、跳板机(非跳板机登录告警)等
实施部署 nginx状态监控 负载均衡的监控(以nginx为例),获取每秒新增的连接数,采用zabbix内置模板。比如:Template App Nginx By Zabbix Agent
开启nginx状态网页
1 2 3 4 location /nginx_status { stub_status; }
模板的宏配置
监控项配置
找到模板里的监控项,此处以一例监控项Nginx: Get stub status page: Nginx: Connections accepted per second
进行说明。
下图中可以看到此监控项并不是Zabbix客户端
类型,而是相关项目
类型,所以它不是直接从Zabbix客户端获取数据的,而是从相关项Nginx: Get stub status page
中获取数据的。
先看主要项Nginx: Get stub status page
,它的类型是Zabbix客户端
,它的动作是获取nginx的状态网页,从下图可以看到,它的键值是web.page.get[里面是模板定义的宏,在第一步中已经修改完成]
。它获取到的内容类似于在浏览器中访问nginx_status
获取的内容。
可以在服务端用zabbix_get
测试一下
1 2 3 4 5 6 7 8 9 10 11 12 |root@m01 zabbix|$ zabbix_get -s web01 -k web.page.get["web01" ,"nginx_status" ,"80" ] HTTP/1.1 200 OK Connection: close Content-Length: 109 Content-Type: text/plain Date: Fri, 01 Mar 2024 09:00:22 GMT Server: nginx/1.24.0 Active connections: 1 server accepts handled requests 60201 60201 60201 Reading: 0 Writing: 1 Waiting: 0
再看监控项Nginx: Get stub status page: Nginx: Connections accepted per second
做了什么
下图可以看到它填写了一个键值(这个是自定义的键值,其实在客户端并不存在,可以随便写),主要项这里填写了上面的Nginx: Get stub status page
,意思是它的数据是从主要项这里来的
那么它想要获取网页中的某个数据,此处应该是每秒连接数,必定要对网页的内容进行提取,所以查看它预处理的内容:
先用正则表达式
提取出累计连接总数,然后通过每秒更改
获取出每秒变化的内容
日志中状态码的数量监控 获取nginx日志中每种http状态码的数量,这个需要自定义监控项了
1 2 3 4 5 6 7 vim /server/scripts/log_status_code_count.sh LOG=/var/log/nginx/access.log awk -v code=$1 -v i=0 '$9==code{i++}END{print i}' $LOG
然后在zabbix-agent2的变量配置文件中写入
1 2 3 vim /etc/zabbix/zabbix_agent2.d/nginx.conf UserParameter=nginx.status.code[*],sudo sh /server/scripts/log_status_code_count.sh "$1 "
在服务端测试
1 zabbix_get -s lb401 01 -k nginx.status.code[200]
然后在web界面创建监控项即可。
同理,可以创建404、403等状态码的监控项,并设置触发器和图形。
TCP状态的数量监控 此处只写脚本内容
1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash status=$1 port="80" case "$status " in listen) ss -ant | awk -v p=":$port$" '$4~p' | grep -ic listen ;; estab) ss -ant | awk -v p=":$port$" '$4~p' | grep -ic estab ;; time-wait) ss -ant | awk -v p=":$port$" '$4~p' | grep -ic time-wait ;; *) echo "please input: listen|estab|time-wait" easc
SSL证书过期时间监控 一般SSL证书到期之日前一个月告警
1 2 3 4 5 6 7 8 9 #!/bin/bash Date=`openssl x509 -in /root/ca-bundle.trust.crt -noout -text | awk '/After/{for(i=4; i<=NF; i++) printf("%s%s", $i, (i<NF) ? " " : "\n")}' ` deadline_date=`date -d "$Date " +%s` today=`date +%s` remain_sec=`echo $deadline_date - $today | bc` remain_day=`echo $remain_sec /60/60/24 | bc` echo $remain_day
端口的监控 内置键值:net.tcp.port[<ip>,port]
,检查是否可以将TCP连接到指定端口
ip:IP地址
port:端口号
进程数的监控 内置键值:proc.num[<name>,<user>,<state>,<cmdline>]
获取进程数量
name:进程名称
user:用户名
state:进程状态,disk(不间断休眠)/run(运行中)/sleep(间断休眠)/trace(停止)/zomb(僵尸)
cmdline:按进程运行命令行过滤,这是一个正则表达式
php状态监控 与nginx状态的监控类似,采用主要项的方式先获取网页内容,然后再创建相关项目的监控项
开启php状态网页
与nginx状态的监控类似,在nginx配置文件中先添加显示php状态的网页
1 2 3 4 5 6 7 location /php_status { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name ; include fastcgi_params; }
在php的配置文件中定义此URL路径
1 2 3 vim /etc/php-fpm.d/www.conf pm.status_path = /php_status
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@web01 php-fpm.d]$ curl localhost/php_status pool: www process manager: dynamic start time: 02/Mar/2024:01:24:31 +0800 start since: 45 accepted conn: 2 listen queue: 0 max listen queue: 0 listen queue len: 128 idle processes: 4 active processes: 1 total processes: 5 max active processes: 1 max children reached: 0 slow requests: 0
创建主要项
创建相关项
监控项信息
预处理
web场景监控 许多时候我们需要监测一些web场景,比如监测网站后端的php是否连接上了数据库以及一些网站的API,经常用到web场景的监测
创建监控网页
准备好一个文件mysqli.php,放到网站的访问目录中,文件内容如下
1 2 3 4 5 6 7 8 <?php $link_id =mysqli_connect ('db01' ,'blog' ,'123456' ); if ($link_id ){ echo "mysql successful by blog" }else { echo mysqli_error (); } ?>
创建web场景监控
web界面侧边栏>配置 >主机 ,选择一个主机,上方选项中选择web场景 ,右上角创建web场景 ,填写以下信息
在步骤中,添加一个步骤,URL填写访问监控文件的URL
填写要访问的主机头,要求的字符串和要求的状态码,点击添加即可
查看数据
web页面侧边栏>监测>主机,点击相应主机的web监测,点击刚刚添加web监测场景,可以查看状态
Tomcat多实例监控 Tomcat的多实例的监控的实现可以使用低级自动发现
启动两个tomcat实例,查看
1 2 3 4 5 6 7 8 9 sh /app/tomcat-shell/start_tomcat.sh /app/tomcat-1 sh /app/tomcat-shell/start_tomcat.sh /app/tomcat-2 ss -tunlp | grep java [root@web03 app]$ ss -tunlp | grep java tcp LISTEN 0 1 [::ffff:127.0.0.1]:8005 [::]:* users :(("java",pid=1540 ,fd=64 )) tcp LISTEN 0 1 [::ffff:127.0.0.1]:8006 [::]:* users :(("java",pid=1583 ,fd=64 )) tcp LISTEN 0 100 [::]:8080 [::]:* users :(("java",pid=1540 ,fd=52 )) tcp LISTEN 0 100 [::]:8081 [::]:* users :(("java",pid=1583 ,fd=52 ))
编写脚本tomcat.port.discovery.sh
,发现tomcat的多个端口,作为自动发现项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/bin/bash port_list=(`ss -tunlp | grep -w java | awk -F'[ :]+' '$7~/^808.$/{print $7}' `) i=0 echo '{' echo -e '\t"data":[' for port in ${port_list[*]} do let i++ if [ $i -eq ${#port_list[*]} ] then echo -e "\t\t{\"{#TOMCATPORT}\":$port }" else echo -e "\t\t{\"{#TOMCATPORT}\":$port }," fi done echo -e '\t]' echo '}'
编写脚本tomcat_status.sh
,获取内存使用情况,作为监控项原型使用
1 2 3 4 5 6 7 8 9 10 #!/bin/bash . /etc/profile PORT=$1 JVM_NAME=$2 PID=`ss -tunlp | grep -w $PORT | awk -F'pid=|,' '{print $3}' ` jmap -heap $PID | grep -wiA4 "^${JVM_NAME} " | awk 'NR==5{print $1}' | tr -d '%'
修改zabbix客户端键值配置文件
1 2 3 4 [root@web03 scripts]$ vim /etc/zabbix/zabbix_agent2.d/tomcat.conf UserParameter=tomcat.port.discovery,sudo sh /server/scripts/tomcat.port.discovery.sh UserParameter=tomcat.status[*],sudo sh /server/scripts/tomcat_status.sh "$1 " "$2 "
web界面创建lld规则,监控项原型、触发器和图形等,不再赘述。
存储服务监控 自动发现共享目录以及目录的占用空间
系统模板中的低级自动发现已经存在
Redis监控 可以使用模板,自定义监控项待补充
MySQL监控 可以使用模板,自定义监控项待补充