day61-可观测性建设-全链路监控

发布于:2025-07-29 ⋅ 阅读:(36) ⋅ 点赞:(0)

🌟你用zabbix都监控了什么?

  • 2个维度监控
  • 第1个维度:用户访问流程维度(数据流/业务流)
  • 第2个维度:某个层次上/某个服务上具体监控的内容:模板+自定义监控
    • 物理层监控(风扇,温度,raid)
    • 系统层监控(cpu,内存,磁盘网络,负载…用户,软件包)
    • 服务监控(nginx,php,java,tomcat,db…)
    • 代码/业务监控(web场景监控,curl/wget)
    • API接口监控

🖥️任何一台机器(从下到上)

监控内容 详细内容 具体实现落地
API接口监控 监控指定的api接口,比如zabbix api,开发提供(内部接口,外部第三方接口) curl命令、web场景/监测
业务、应用、app监控 检查应用是否可用,书写测试代码页面
类似于info.php,mysqli.php
curl命令、web场景/监测
服务监控 基本:进程,端口
专有:服务的状态,不同服务不同
模板或根据具体要求自定义监控
系统监控 cpu,负载,内存,磁盘,网络,带宽,io,关键文件是否变化(aide),进程,僵尸进程,是否有非堡垒机登录 模板+自定义(僵尸进程,用户异地登录,堡垒机登录,aide,hm,日志secure)
硬件监控 如果是物理服务器则需要监控:温度,风扇转速,raid状态 zabbix自带:ipmi/自定义监控
Linux命令:(ipmitool/megacli)

🎯按照访问顺序监控(一层一层)

监控内容 详细内容 具体实现落地
DNS 解析是否OK 自定义监控-ping/dig/lookup/…
域名:whois zhubl.xyz过滤是否过期
证书:curl -Lsv www.zhubl.xyz -o /dev/null 过滤expire data 过期openssl命令检查
CDN 是否可用,命中率,带宽,流量 登录对应cdn页面检查:命中率,流量,带宽
分布式ping:
商业:监控宝,听云
免费网站:www.17ce.com,ping,chinaz.com
开源软件:smokeping
防火墙和网络设备 监控流量,带宽,端口 snmp协议
负载 nginx服务情况,证书过期,网站访问量,并发 nginx/haproxy/keepalived状态:模板
证书:模板、自定义监控
网站访问量(运营):ip,pv,uv(网站第三方插件实现百度统计),自建matomo(php piwiki)
并发:统计80,443端口连接数(已经连接)
负载均衡健康检查模式
upstream_check 自定义监控访问日志(状态码),错误日志(error,failed数量)
服务:nginx,keepalived(vip数量,备节点是否有vip)
web 主要监控服务情况 具体服务使用对应模板即可
nginx
php
tomcat(war)/jar包-自定义监控
数据库 redir,mysql 模板即可,写入内容,读取写入的内容
存储 nfs 自定义监控,存储目前多少空间,能否使用,模拟挂载,创建文件检查结果。
备份 备份的数据量 自定义监控,系统是否有备份,发送邮件…占用多少空间

核心:

按照用户访问流程,运维角度,开发角度,按照顺序逐个进行监控

辅助每个节点,硬件监控(如果有),系统监控(必需),服务监控(如果有),业务监控(如果有),api监控(如果有)

🌟监控域名

🔍监控域名dns解析是否正常

自定义监控放在负载均衡节点(任何1个)

  • 域名DNS是否可用,nslookup,xxx命令查看解析

  • 域名过期,输出剩余时间(天)

  • WEB或调取API接口查看,DNS查询数量(阿里云DNS)

  • 分布式测试ping,dns,cdn

https://ping.chinaz.com/www.zhubl.xyz
  • 阿里云cms中的一次性拨测和定时拨测
  • 全国或全世界用户访问网站的速度(分布式网站速度http,dns解析测试)
    • 第3方免费网站:ping.chinaz.com,17ce.com,…
    • 第3放收费免费使用:监控包https://www.jiankongbao.com/
    • 阿里云拨测工具于站点监控(定时拨测)
    • 自己搭建:全国各地服务器+smokeping

自定义监控项

  • 编写监控脚本
vim /server/scripts/check_dns.sh 
#!/bin/bash
##############################################################
# File Name:/server/scripts/check_dns.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################
#1.vars
url=$1

#2.检查nslookup命令是否存在
which  nslookup &>/dev/null
if [ $? -ne 0 ];then
	echo "nslookup命令不存在,正在安装软件包......"
	yum install -y bind-utils &>/dev/null
fi

#3.检查
if nslookup $url &>/dev/null;then
	echo "1"
else
	echo "0"
fi
  • 修改zabbix子配置文件
vim /etc/zabbix/zabbix_agent2.d/dns.conf
UserParameter=check.dns[*],sh /server/scripts/check_dns.sh  "$1"
  • 重启zabbix_agent2服务
systemctl restart zabbix-agent2.service
  • 客户端测试
zabbix_agent2 -t check.dns[zhubl.xyz]

  • 服务端测试
zabbix_get -s 172.16.1.5 -k check.dns[baidu.com]

web页面添加监控项

web页面添加触发器

web页面查看最新数据

🔍监控域名是否过期

自定义监控项

  • 编写监控脚本
[root@lb01 ~]# cat  /server/scripts/check_https_expire.sh 
#!/bin/bash
##############################################################
# File Name:/server/scripts/check_https_expire.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################
#1.function
#检查域名过期
function check_domain() {
  local expire_date=`whois  $url |egrep "Expiry|Expiration" |awk -F ": " '{print $2}'`
  local exprire_date_second=`date -d "${expire_date}" +%s`
  local date_second_now=`date +%s`
  local date_expire_days=`echo "(${exprire_date_second} - ${date_second_now} )/60/60/24" |bc`
  echo "$date_expire_days"
}

#检查证书过期
function check_https() {
  #这里还可以加入curl判断.
  local expire_date=`curl -v https://www.$url  |& grep expire |awk -F ": |GMT" '{print $2}'`
  local exprire_date_second=`date -d "${expire_date}" +%s`
  local date_second_now=`date +%s`
  local date_expire_days=`echo "(${exprire_date_second} - ${date_second_now} )/60/60/24" |bc`
  echo "$date_expire_days"
}

#main
function main() {
 choice=$1
 url=$2
 case "$choice" in
     domain)
            check_domain ;;
     https)
            check_https  ;;
 esac
}

main $*
  • 修改zabbix_agent2子配置文件
vim /etc/zabbix/zabbix_agent2.d/dns.conf 
UserParameter=check.domain_https[*],sudo /bin/bash /server/scripts/check_https_expire.sh "$1" "$2"

注意执行脚本需要使用sudo,否则会报错

  • 客户端测试
zabbix_agent2 -t check.domain_https[domain,zhubl.xyz]
zabbix_agent2 -t check.domain_https[https,zhubl.xyz]

  • 服务端测试
zabbix_get -s 172.16.1.5 -k check.domain_https[domain,zhubl.xyz]
zabbix_get -s 172.16.1.5 -k check.domain_https[https,zhubl.xyz]

web页面添加监控项

web页面添加触发器

web页面查看最新数据

🌟监控CDN

  • 每日带宽,web页面或api监控
  • 每日流量,web页面或api监控
  • CDN命中率,不低于90%,web页面或api监控
  • 检查分析日志 miss 2xx/3xx分析
  • 监控宝

🌟监控防火墙 waf 日志

  • POST请求 uri异常 200
  • 蜜罐
  • iptables直接看规则即可,开启或关闭
  • 共有云防火墙查看规则即可
  • 硬件防火墙通过snmp监控即可

🌟监控负载均衡

监控内容 详细内容 具体实现落地
服务 nginx,haproxy,lvs,keepalived 模板:
状态码,并发(ss -ant),每种状态数量,端口,进程
日志:访问日志,错误日志
系统 cpu,内存,磁盘,网络,io读写,进程,登录用户数,运行时间 zabbix-agent模板+自定义监控(僵尸进程数量,挂起进程数,文件是否发生变化aide --check,用户是否来自堡垒机)
硬件 ipmi监控硬件信息 megacli,ipmitool
自定义监控项/相关项

🔍监控tengine服务

安装tengine

  • 修改nginx配置文件
vim /etc/nginx/conf.d/default.conf
server {
    listen 80 default_server;
    server_name  localhost;
    default_type text/plain;
    location / {
      #return 200 "website is ok";
      index index.html;
    }
    location /status {
      #allow 221.218.213.9 ;
      allow 127.0.0.1;
      allow 10.0.0.1;
      allow 172.16.1.0/24;
      deny all;
      stub_status;
    }
}
  • 重启nginx服务
nginx -t
systemctl restart nginx

zabbix服务端测试

zabbix_get -s 172.16.1.5 -k web.page.get["localhost","status","80"]

status指令结果说明 说明 备注
Active connections 已经建立连接的数量. 4层 实时数据 当前网站并发访问数量
accepts 总数(持续增加),nginx已经接收了多少个3次握手请求 绝大部分情况accepts与handlers一致类似
handled 总数(持续增加),nginx已经处理的请求数量
requests 总数(持续增加),nginx已经收到了多少http请求 数量比accepts数量多.(连接建立后,连接可以重复使用)
Reading 实时数据.正在读取客户端请求(头,主体)数量
Writing 实时数据.正在返回客户端响应(头,主体)数量
Waiting 实时数据.空闲的连接数量.(3次握手建立连接,发出http请求,连接保留,此时没有请求使用连接)

web页面创建模板

  • 复制nginx的监控模板

  • 修改模板

正则表达式匹配需要值

Server: Tengine/(.*)


server accepts handled requests request_time\s+([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)

Reading: ([0-9]+) Writing: ([0-9]+) Waiting: ([0-9]+)


var a = value.match(/server accepts handled requests request_time\s+([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)/)
if (a) {
    return a[1]-a[2]
}

修改监控项中的相关项

主机关联tengine模板

查看最新数据

🔍监控考试系统负载均衡各web站点情况

自定义监控项

  • nginx负载均衡自定义监控 开启负载均衡监控检查模块upstream check

  • 编译安装nginx

  • 默认没有关联的模板

  • 监控项:有多少个节点,有多少个分组,每个分组里面的节点状态

  • 编写nginx配置文件

vim /etc/nginx/conf.d/exam.conf
upstream l7_pools {
  server 10.0.0.7:80;
  server 10.0.0.8:80;
  hash $remote_addr consistent;

  check interval=3000 rise=2 fall=5 timeout=1000 type=http;
  check_http_send "HEAD /index.html HTTP/1.0\r\nHost:student.zhubl.xyz\r\nUser-Agent: lb_check\r\n\r\n";
  check_http_expect_alive http_2xx http_3xx;
}
server {
  listen 80;
  server_name admin.zhubl.xyz;
  error_log /var/log/nginx/admin-error.log notice;
  access_log /var/log/nginx/admin-access.log main;
  location / {
    proxy_pass http://l7_pools;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-Ip $remote_addr;
  }
}
server {
  listen 80;
  server_name student.zhubl.xyz;
  error_log /var/log/nginx/student-error.log notice;
  access_log /var/log/nginx/student-access.log main;
  location / {
    proxy_pass http://l7_pools;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-Ip $remote_addr;
  }
  location /lb_status {
    check_status;
    access_log off;
    #allow
    #deny
  }
}
  • 命令行测试
curl -s -H Host:student.zhubl.xyz localhost/lb_status?format=csv
curl -s -H Host:student.zhubl.xyz localhost/lb_status?format=csv | grep -wi up | wc -l

  • 编写脚本
#!/bin/bash
##############################################################
# File Name:/server/scripts/check_lb_pools.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################
#1.vars
url=$1
#2.统计负载均衡后端服务器在线的数量
total=`curl -s -H Host:${url} localhost/lb_status?format=csv |wc -l`
up=`curl -s -H Host:${url} localhost/lb_status?format=csv |grep -wi up |wc -l`
#3.统计负载均衡后端服务器在线百分比
echo "scale=2; $up / $total * 100" |bc -l
  • 修改zabbix_agent2子配置文件
vim /etc/zabbix/zabbix_agent2.d/lb.conf
UserParameter=check.lb[*],/bin/bash /server/scripts/check_lb_pools.sh "$1"
  • 重启zabbix_agent2服务
systemctl restart zabbix-agent2.service
  • 客户端测试
zabbix_agent2 -t check.lb[student.zhubl.xyz]

  • 服务端测试
zabbix_get -s 172.16.1.5 -k check.lb[student.zhubl.xyz]

web页面添加监控项

web页面添加触发器

web页面查看最新数据

🔍监控keepalived服务

  • 监控keepalived是否切换
    • 监控项:过滤keepalived是否有进程
    • 监控项:是否有vip,过滤VIP,确定是否发生了主备切换

自定义监控项

  • 备节点书写监控脚本
vim /server/scripts/chk_vip.sh
#!/bin/bash
##############################################################
# File Name:/server/scripts/chk_vip.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################
#1.vars
vip=$1
#2.过滤
vip_cnt=`ip a |grep -w "${vip}" |wc -l`
#3.判断
if [ $vip_cnt -gt 0 ];then
	echo 1
else
	echo 0
fi
  • 编写zabbix_agent2子配置文件
UserParameter=keepalived.vip[*],/bin/bash /server/scripts/chk_vip.sh "$1"
  • 重启zabbix_agent2服务
systemctl restart zabbix-agent2.service
  • 客户端测试
zabbix_agent2 -t keepalived.vip[10.0.0.3]

  • 服务端测试
zabbix_get -s 172.16.1.5 -k keepalived.vip[10.0.0.3]

web页面添加监控项

web页面添加触发器

web页面查看最新数据

🔍监控访问日志

  • nginx访问日志(elk服务)
    • ip地址出现次数
    • 状态码及出现的次数

自定义监控项

  • 编写脚本(统计状态码数量)
vim /server/scripts/check_ngx_access_log.sh
#!/bin/bash
##############################################################
# File Name:/server/scripts/check_ngx_access_log.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################
#1.vars
access_files="/var/log/nginx/student-access.log"
code=$1
#2.case
case "$code" in
	200) awk '{print $9}' $access_files |grep -w "200"|wc -l;;
	206) awk '{print $9}' $access_files |grep -w "206"|wc -l;;
	301) awk '{print $9}' $access_files |grep -w "301"|wc -l;;
	302) awk '{print $9}' $access_files |grep -w "302"|wc -l;;
	304) awk '{print $9}' $access_files |grep -w "304"|wc -l;;
	400) awk '{print $9}' $access_files |grep -w "400"|wc -l;;
	401) awk '{print $9}' $access_files |grep -w "401"|wc -l;;
	403) awk '{print $9}' $access_files |grep -w "403"|wc -l;;
	404) awk '{print $9}' $access_files |grep -w "404"|wc -l;;
	405) awk '{print $9}' $access_files |grep -w "405"|wc -l;;
	413) awk '{print $9}' $access_files |grep -w "413"|wc -l;;
	500) awk '{print $9}' $access_files |grep -w "500"|wc -l;;
	502) awk '{print $9}' $access_files |grep -w "502"|wc -l;;
	503) awk '{print $9}' $access_files |grep -w "503"|wc -l;;
	504) awk '{print $9}' $access_files |grep -w "504"|wc -l;;
esac
  • 修改zabbix_agent2配置文件
UserParameter=nginx.log.status[*],sudo /bin/bash /server/scripts/check_ngx_access_log.sh "$1"
  • 重启zabbix_agent2服务
systemctl restart zabbix-agent2.service
  • 客户端测试
zabbix_agent2 -t nginx.log.status[200]

  • 服务端测试
zabbix_get -s 172.16.1.5 -k nginx.log.status[200]

web页面添加监控项

web页面添加触发器

web页面配置图形

🔍监控错误日志

  • nginx错误日志:faild/denied/error/最近5000行
tail -5000 /var/log/nginx/error.log|grep -c -i error
  • 监控系统日志secure日志是否有大量的Failed password/failure

自定义监控项

  • 命令行测试
start=`date  +%Y\/%m\/%d" "%H:%M -d "-1min"`
echo $start
2025/07/24 21:07

start=`date  +"%Y\/%m\/%d %H:%M" -d "-1min"`
echo $start
2024\/07\/26 11:37

# 输出最近1分钟的错误日志
sed -n "/${start}/,\$p" /var/log/nginx/error.log
  • 统计错误日志中最近1000行有多少error
UserParameter=check.ngx.error,sudo tail -n1000 /var/log/nginx/error.log |egrep -i 'error|failed|denied'|wc -l
  • 分析安全日志系统是否有异常登录(暴力破解)
UserParameter=check.error.login,sudo tail -n1000 /var/log/secure |egrep -i 'fail'|wc -l
  • 重启zabbix_agent2服务
systemctl restart zabbix-agent2.service
  • 客户端测试
zabbix_agent2 -t check.ngx.error
zabbix_agent2 -t check.error.login

  • 服务端测试
zabbix_get -s 172.16.1.5 -k check.ngx.error
zabbix_get -s 172.16.1.5 -k check.error.login

web页面添加监控项

🔍监控网络TCP/IP

自定义监控项

  • 修改zabbix_agent2子配置文件
#并发数
UserParameter=net.tcp.estab,sudo ss -ant | grep -i estab | wc -l
#将要断开连接的数量
UserParameter=net.tcp.wait,sudo ss -ant | grep -i wait | wc -l
  • 重启zabbix_agent2服务
systemctl restart zabbix-agent2.service
  • 客户端测试
zabbix_agent2 -t net.tcp.estab

  • 服务端测试
zabbix_get -s 172.16.1.5 -k net.tcp.estab
zabbix_get -s 172.16.1.5 -k net.tcp.wait

web页面添加监控项

添加触发器

✅监控负载均衡小结

层次 监控内容
API层监控
应用层监控
服务层监控 使用服务对应的模板stub_status
自定义监控负载均衡状态upstream_check check_status
keepalived监控是否主备切换
系统层监控 系统基本指标:使用模板linux by agent + 僵尸进程,是否堡垒机登录,是否同时同步
安全指标:自定义监控,aide,hm结果
日志监控:系统日志,服务日志,过滤错误信息,登录失败信息,访问情况
物理层监控 ipmi或megacli ipmitools

🌟监控web

应用:代码,war,jar包

服务:nginx,php,tomcat,jar

系统:模板+自定义

层次 监控内容
API层监控
应用层监控 书写专用页面(测试业务是否可用,php,jsp)
服务层监控 nginx使用服务对应的模板 stub_status
php tomcat或java jar相关项监控
系统层监控 系统基本指标:使用模板linux by agent (active)+僵尸进程,是否堡垒机登录,是否同时同步
安全指标:自定义监控,aide,hm结果
日志监控:系统日志,服务日志,过滤错误信息,登录失败信息,访问情况
物理层监控 ipmi或megacli ipmitools

🔍监控nginx服务(应用层监控)

准备测试页面

#测试页面
cd /app/code/blog/
echo 'blog' > chk_ngx.html

cat >chk_php.php<<'EOF' 
<?php
phpinfo();
?>
EOF

cat >chk_db.php<<'EOF' 
<?php
//数据库地址
$db_host='172.16.1.51';
//数据库用户名
$db_user='blog';
$db_pass='blog';
//数据库名字
$db_name="blog";

$link_id=mysqli_connect($db_host,$db_user,$db_pass,$db_name);
if($link_id){
  echo "mysql successful \n" ;
}
else{
echo "connection failed!\n" ;
}
?>
EOF

web页面添加web场景监控

注意:由于zabbix是在容器中,没有做Host解析,需要填写Host头

  • 检查nginx状态

  • 检查nginx-php状态

  • 检查php-db状态

写完步骤后记得点击添加按钮

查看最新数据

添加触发器

last(/web01-172.16.1.7/web.test.fail[监控blog业务是否正常])<>0
web.test.fail 该监控项将显示场景中失败的步骤数。如果所有步骤都成功执行,则返回 0

查看仪表盘

关闭数据库,测试触发器

🔍监控php服务

修改nginx配置文件

vim /etc/nginx/conf.d/default.conf 
server {
  listen 80 default_server;
  server_name status.zhubl.xyz;
  
  location /status {
    stub_status;
  }

  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;
  }
  
  location /php_ping {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

修改php配置文件

vim /etc/php/8.1/fpm/pool.d/www.conf

重启nginx和php服务

docker restart blog

命令行测试

curl 10.0.0.7/php_status

zabbix客户端测试

zabbix_agent2 -t web.page.get["localhost","php_status","80"]

zabbix服务端测试

zabbix_get -s 172.16.1.7 -k web.page.get["localhost","php_status","80"]

web页面修改php模板

主机关联模板

查看最新数据

🌟java-gateway监控

  • 开启远程监控功能
  • zabbix服务端部署java gateway配置
  • 添加主机关联模板

🎯zabbix客户端开启远程监控功能

  • 修改启动脚本(jar包)
#!/bin/bash
##############################################################
# File Name:entry.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=172.16.1.9 -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar
  • 修改启动脚本bin/catalina.sh(tomcat)124行后添加
CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=172.16.1.9"
  • 修改Dockerfile文件

  • 修改docker-compose

  • 运行docker-compose

🍀docker运行gateway

  • 导入java-gateway镜像
docker load -i zbx-java-gatway-7.0.9.tar

  • 修改docker-compose文件
    ZBX_JAVAGATEWAY_ENABLE: true
    ZBX_JAVAGATEWAY: zbx_java_gateway
    ZBX_JAVAGATEWAYPORT: 10052

zbx_java_gateway:
  image: zabbix/zabbix-java-gateway:7.0.9-ubuntu
  container_name: zabbix-java-gateway-7.0
  networks:
    - oldboy_zbx_net
  restart: always
  ports:
    - 10052:10052
  depends_on:
    - zbx_server

  • 启动docker-compose

🌏web页面添加java jmx监控模板



网站公告

今日签到

点亮在社区的每一天
去签到