参考zabbix官方中文文档 https://www.zabbix.com/documentation/3.4/zh/manual/config/items
知识点
1、触发器表达式
表达式语法规则 {<服务器>:<键> <函数>(<参数>)} <操作> <常数>
1个小时内cpu负载最小值小于0.2
test:system.cpu.load[percpu,avg1].min(1h)}<0.2
cpu负载最近10个返回值,最小值小于0.2
test:system.cpu.load[percpu,avg1].min(#10)}<0.2
目前,触发器所支持的函数有
https://www.zabbix.com/documentation/3.4/zh/manual/appendix/triggers/functions
avg 平均值 count 数据统计 change 返回最后的一个值和倒数第二个值对比 date 时间 dayofweek 本周的第几天 delta 指定时间范围内和数值内的 diff 文件是否有改变 iregexp 忽略字符大小写,正则表达式 regexp 检查最后一次采样的数据是否能够被制定的模式所匹配, 1表示匹配,0表示不匹配 主要用来监控日志内容的关键字 last 最近几次采样 max 最近采样最大值 min nodata (对于采集不到数据)没有数据判断异常 now 返回自unix元年只此刻经历的秒数 prev:倒数第二个采样值; str 从最后一个采样中,查找此次指定的字符,1找到0没找到 sum parameter 函数参数:大多数数值函数可以接受秒数为其参数, 而如果在数值参数之前使用”#“做为前缀,则表示为最近几次的取值, 如sum(300)表示300秒内所有取值之和,而sum(#10)则表示最近 10次取值之和; 此外,avg、count、last、min和max 还支持使用第二个参数, 用于完成时间限定;例如:max(1h,7d)将返回一周之前的最大值;
微服务告警监控
以下用fillorder服务为例
fillorder服务本机IP:10.200.130.96 zabbixz server IP:10.200.130.17
zabbix_agentd端配置
[appdeploy@fillorder1 etc]$ grep -v ^# /usr/local/zabbix_agentd/etc/zabbix_agentd.conf LogFile=/tmp/zabbix_agentd.log Server=10.200.130.17 ServerActive=10.200.130.17 Hostname=fillorder1 Timeout=30 User=appdeploy UserParameter=fezs_para[*],/usr/local/zabbix_agentd/scripts/zabbix_para.sh $1 $2
zabbix_para.sh
[appdeploy@fillorder1 ~]$ cat /usr/local/zabbix_agentd/scripts/zabbix_para.sh #!/bin/bash type="$1" para2="$2" function accessnum() { logs_path="${para2}" cd "${logs_path}" today=`date +"%Y-%m-%d"` yesday=`date +"%Y-%m-%d" -d yesterday` cur_min=`date +%H%M` if [ ${cur_min} = "0000" ] ;then log_file="access.${yesday}.log" else log_file="access.${today}.log" fi time=`date +"%Y-%m-%d %H:%M" -d "-1 minutes"` if ! [ -f "${log_file}" ] ;then echo "0" else cat ${log_file}|grep "^${time}"|grep -v HEAD|wc -l fi } function gettcpnum() { ss -antp|grep ESTAB|wc -l } function errorlognum() { logs_dir="${para2}" log_files=WarnLog.`date +"%Y-%m-%d"`.*.log ls ${logs_dir}/${log_files} > /dev/null 2>&1 [ $? -gt 0 ] && echo "0" && exit 0 t1=`date -d "1 minutes ago" +"%Y-%m-%d %H:%M"` grep -c -iE "^${t1}.*ERROR.*Exception" ${logs_dir}/${log_files} } function getcpu() { jcname=${para2} pid=`ps -ef|grep java|grep ${jcname}|awk '{print $2}'` top -c -b -n 1|grep ${pid}|grep -v grep|awk '{print $9}' } function getmem() { jcname=${para2} pid=`ps -ef|grep java|grep ${jcname}|awk '{print $2}'` mem=`cat /proc/${pid}/status|grep VmRSS|awk '{print $2}'` mem=$[mem*1024] echo $mem } function accesserrnum() { logs_path="${para2}" cd "${logs_path}" today=`date +"%Y-%m-%d"` yesday=`date +"%Y-%m-%d" -d yesterday` cur_min=`date +%H%M` if [ ${cur_min} = "0000" ] ;then log_file="access.${yesday}.log" else log_file="access.${today}.log" fi time=`date +"%Y-%m-%d %H:%M" -d "-1 minutes"` if ! [ -f "${log_file}" ] ;then echo "0" else cat ${log_file}|grep "^${time}"|grep -v HEAD|awk '$10>=400'|wc -l fi } case $type in accessnum) accessnum;; gettcpnum) gettcpnum;; getcpu) getcpu;; getmem) getmem;; errorlognum) errorlognum;; accesserrnum) accesserrnum;; *) esac
一、配置--创建主机
二、模板
完成
查看之前已经配置好的模板
应用集 5个
先不用看,在监控项里面可以创建
三、监控项 5个
1、accessnum_fillorder 监控项
键值 fezs_para[accessnum,/app/fillorder/logs]
2、access_error_resp_fillorder 监控项 监控acces接口访问日志
键值 logrt["/app/fillorder/logs/access.20[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9].log"," ([45][0-9][0-9]) [-0-9]+ [0-9]+$",,50,skip,]
3、getcpu-fillorder 监控项
键值 fezs_para[getcpu,fillorder]
4、getmem-fillorder 监控项
键值 fezs_para[getmem,fillorder]
5、port_5112 监控项 监控5112端口
键值 net.tcp.listen[5112]
触发器 3个
1、fillorder is down
表达式 {Micro-fillorder:net.tcp.listen[5112].max(3)}=0 Micro-fillorder 主机名或模板名(模板套用到主机上) net.tcp.listen[5112] 键值 max(3) 3秒函数范围 0 预设值 注释:3秒内采集到的最大值如果等于0则进入PROBLEM状态;
2、fillorder 服务出现接口调用异常
表达式 {Micro-fillorder:logrt["/app/fillorder/logs/access.20[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9].log"," ([45][0-9][0-9]) [-0-9]+ [0-9]+$",,50,skip,].strlen()}>0 and {Micro-fillorder:logrt["/app/fillorder/logs/access.20[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9].log"," ([45][0-9][0-9]) [-0-9]+ [0-9]+$",,50,skip,].nodata(60)}=0 说明: and 两个是1时 等于1 or 其中一个1是1 等于1 strlen() 最新值的字符长度 strlen()(等同于 strlen(#1)) → 最新值的长度 strlen(#3) → 最新的第三个值的长度 nodata() 返回值:1 - 指定评估期没有接收到数据 0 - 其它
3、fillorder 进程CPU超过90%
表达式 {Micro-fillorder:fezs_para[getcpu,fillorder].min(#2)}>90 min(#2) 返回最小值,取倒数第二个