逐渐更新
一、服务器配(置简单带过,网上教程很多)
- 服务器RHEL8
- zabbix server端:版本5.4.9。别人配好了,端口防火墙开好了,我直接拿来用,怎么配置的不知道...
- zabbix agent端:版本5.4.4。自己配制的,但是端口防火墙是已经就开好了的
agent端服务器没连公网,无法通过命令直接安装,我去别人装好了agent的服务器上拷贝了rpm文件运行了一把。我觉得是没装上,但是启动服务居然启动成功了?!
按照网上教学简单配置了conf文件,把agent设置成Active
按照别人已经添加好的Host和网上教学添加了Host
坑:权限(zabbix没权限进入log文件夹读取log)
填坑:用了以下这位大哥的方法成功解决
项目采坑日志——zabbix agent执行脚本,提示 Permission denied
二、Zabbix页面端配置(没有Admin权限)
暂时只用了logrt[],只说logrt[],其他不会,用到的时候再学吧...
regexp,AKA regular expression,正则表达式,坑了我了,由于没有Zabbix页面端admin权限就没法使用zabbix自带的正则表达式test功能,就只能蒙着来(主要还是不会,不然两秒钟也就写完了),正则表达式具体怎么写这里就不赘述了,网上一搜一大把,还有在线工具可以用,学起来就还挺方便。
首先看logrt[]模板:
logrt[file_regexp,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>,<options>,<persistent_dir>]
就不逐一解释每个参数都什么意思了,zabbix官网上有。
坑一:item的too many parameters
填坑一:比如agent端5.4.4最多支持9个参数,由于手残多敲了一个逗号,导致变成了10个参数,然后就会有这个红“i”出现在info栏,鼠标放上面就会有too many parameters。注意检查agent版本可支持的参数是什么有多少个。
如果你写了<encoding>参数又写了<options>参数,然后这两个参数之间的参数都留默认值,那么,就要把这两个参数之间的“,”都敲出来!具体参数留空即可。
比如:logrt[file_regexp,regexp,encoding,,,,,options]
如果你写了<encoding>参数然后后面所有参数都要留默认值那么这个参数后面的“,”就都不用敲出来!
比如:logrt[file_regexp,regexp,encoding]
如果你没按照这个规则写,并且“,”写多、少了,都有可能出现too many parameters的红i
坑二:正则表达式的双引号“”
填坑二:如果你在可以使用正则表达式的参数里没有用到正则表达式则可以不用把参数放在双引号“”里。
比如:logrt[/home/zabbix32/test.log,error]
如果你在可以使用正则表达式的参数里使用了正则表达式则必须把参数放在双引号“”里。
比如logrt["/home/zabbix32/test[0-9].log","large result buffer allocation.*Entries: ([0-9]+)"]
总结起来一个字就是,file_regexp,<regexp>那个用了正则表达式那个就“”起来,没用就不“”。
坑三:正则表达式的空格
填坑三:针对<regexp>这个参数,在不用正则表达式的情况下是可以直接识别空格这个符号的。
比如logrt["/home/zabbix32/test[0-9].log",large result buffer allocation]
这里zabbix会去log的每一行里找large result buffer allocation这段话进行匹配并将整行返回给你
比如的比如This is a large result buffer allocation会匹配成功并返回整行
比如的比如large result buffer allocation in memory
比如的比如This is a large result buffer allocation in memory还会匹配成功并返回整行
总结,如果需要匹配的关键字只有单纯的一句话,就不用像我似的花一个来小时查怎么用正则表达式写空格了。直接把句子写出来就行了...
坑四:正则表达式匹配多行
填坑四:例如需要匹配log内如下文本,注意单词之间都是用空格隔开的,然后DOWN之后还有多个空格,然后才是新启一行
server1 api1 DOWN
server2 api2 DOWN
server3 api3 DOWN
server4 api4 DOWN
server5 api5 DOWN
一次性匹配所有行的正则表达式为:
api1.*DOWN.*\n.*api2.*DOWN.*\n.*api3.*DOWN.*\n.*api4.*DOWN.*\n.*api5.*DOWN
其中\n表示新起一行然后.*表示通配符,其他都是关键字了
我首先尝试了匹配api1.*DOWN与api2.*DOWN与api3.*DOWN... ...但经过多方查证后正则表达式内没有单独表示”与“的通配符,所以需要换个角度思考。
坑五:item正则表达式无法返还多行内容
填坑五:如坑四所说,经过正则表达式在线工具测试的填坑四内的正则表达式可以匹配多行。但是,写在zabbix的item里之后,latest data里没有任何返回值。虽然暂时没有查到任何资料明确表示item的返回值无法将匹配到的多行内容返还,但是测试结果的确是就算在保存item时没有报错提示说正则表达式写的有问题,但是latest data返还值是空的。估计可以通过使用user parameters来返还多行?还没试,不知道。
真·填坑五:书接上文,我监控的APP需要设置crontab跑一个checkstatus.sh,.sh内用>>将checkappstatus命令结果输出到一个txt文件内。来了来了,开始了啊~checkappstatus命令给的结果是多行的,如坑四。我的想法是通过item一次性返还所有行的内容,然后通过trigger加以分析并作出对应action。结果踩进了坑五。在zabbix官网和Forum和support翻阅各种资料,除了创建多个item分别匹配多行,没人给出更好的方法,甚至有个大哥在一个十年前的帖子里回复说“这都十年了啊!还这德行”,我心一凉,这咋办呢这?!突然之间,天昏地暗,世界可以突然什么都没有。我想起了...可以在.sh里输出到txt的时候把命令结果转换到同一行。又是一痛搜索,发现了tr,可以将换行符\n替换为其他字符,然后输出的结果就都挤在一行里了。再创建一个item随便匹配这一行里随便那个固定的内容并返回,这样就实现了内个Forum里十年来都没解决的问题。同时也填上了一次返回“多行”内容这个坑。
坑六:触发器find表达式触发Problem后不自动关闭
填坑六:在触发器的Expression内使用了History functions中的find()表达式find(logrt["/test/key",error],10m,"like","error")=1,我对该表达式的理解是,从现在开始往前10min之内,如果在logrt["/test/key",error] item内匹配到error关键字就触发problem。该触发器的OK event generation选择了Expression,根据Expression选项在zabbix官网文档内的解释“OK events are generated based on the same expression as problem events”,我对该解释的理解为,如果Expression内的表达式的整体为True时,触发problem,为False时,关闭problem。我对该触发器的整体理解为,从现在开始往前10min之内,如果在logrt["/test/key",error] item内匹配到error关键字就触发problem,在problem触发后如果我晾着这个problem不管,随着时间的推移,当系统根据OK event generation选项判定匹配到的error关键字是出现在第11min之前的时候,就会自动关闭该problem。然鹅...真实情况是系统并没有自动关闭该problem,每次都要手动去点啊天哪... 在无数的无奈的叹息中,当我再一次打开这个触发器想试试还有没有其他办法时,显示器内一道耀眼的闪电闪瞎了我的狗眼,与此同时nodata(logrt["/test/key",error],10m)=1闪亮登场,这个小家伙表示它从现在开始往前10min之内如果没发现logrt["/test/key",error] item有任何更新就会帮我关掉problem的想法,我觉得这小家伙人真好,就把小家伙安排到了OK event generation的Recovery expression选项的Recovery expression里,结果problem成功自动关闭了(虽然是在第14min的时候)。我很开心,就跑来写了(我今天废话真多)。
仔细一想应该是我item和trigger使用逻辑有些许问题?正常都应该是用item读取log内的全部内容,然后通过触发器的problem expression匹配关键字并触发problem。我现在的情况是,用item读取log并匹配关键字,然后触发器再匹配一次item已经匹配好了的关键字然后再触发problem。这简直就是脱了裤子,然后再脱了内裤,再放*。不过唐朝时有句古话说的好,“代码什么的能跑起来就行了,不用在乎那么多细节。”
【待更新】坑七:使用其他item内抓取的关键字自动关闭problem
坑n:待定
小技巧一、zabbix内生成关键字的正则表达式
在写item里的logrt key的时候如果不确定需要匹配的关键字的正则表达式怎么写,可以先去triggers里新建一个trigger,然后在expression区域选择add,我个人一般会在condition弹出窗口内的function下拉菜单内选择find(),然后再V框里输入需要生成正则表达式的关键字,其他选项随便写,然后点insert,这时候zabbix就会自动生成关键字的正则表达式,然后拿着这个正则表达式贴在item的key里就好了,当然我知道zabbix自带正则表达式测试功能,但是我这不没有权限用不了么,只能曲线一把了。