首先说一下本文要分享技术经验的背景
原因很简单,常规的服务器监控只是针对机器性能或者网络的功能进行的监控,比如 CPU, 内存的资源的监控,网络端口的监控等;但是对于一些具体的业务功能,这种常规的监控往往是不起作用;比如网络明明是可以 ping 通,服务也活着,但是业务功能不正常了,举个栗子:无法登录了,无法留言了,等等;还有一个很重要的一个原因,需要监控的服务器是商业成品服务器,我们无法改代码开发监控埋点(也许也可以开发埋点监控功能,但是时间成本估计搞不定)。业务功能监控就是要模拟实际的业务动作,验证业务功能是不是正确的,如果发现该功能不工作了,则触发报警达到监控的目的。
业务功能监控实践
本文需要尝试监控的业务是公司内部 wiki server 的登录功能。原因是我们经常会碰到 wiki server 服务进程活着,但实际的登录服务已经不可用的情形;做业务功能监控就是为了预警这种问题。
先说一下实现思路,首先列一下需要使用的技术工具:jmeter, shell, jenkins;jmeter 可以实现接口自动化测试功能,验证业务登录是否成功,通过 non-GUI 的运行方式,jmeter 可以自动测试将运行结果输出到 log 文件中;shell 脚本用来解析 jmeter 输出的 log 文件,判读结果,然后根据结果决定是否发送报警信息;Jenkins 用来定时驱动整个登录验证过程定时执行,比如每隔 5 分钟尝试运行一下登录测试脚本,判断登录功能是否还正常,通过这种定期尝试的方法达到对业务的自动监控目的; 实现过程见下图。
代码实现
JMeter
由于 JMeter 无法用代码直接讲述实现过程,这里通过几张截图来演示;需要说明的是,我这个实践中是使用 JMeter 验证 wiki 的登录功能是否正确,先要通过 http 抓包的方法确定 Wiki 的登录功能应该使用哪个接口,登录接口对应的正确 与 错误返回响应内容都是什么,然后可以根据响应结果来写 JMeter 中的断言,确保当登录失败的时候 JMeter 可以给出失败的结果。
Shell 代码
### 需要提前设定如下变量
#export JMETER_HOME=******************
#export PROJ_PATH=********************
# 引入公共函数
function substr
{
STRING_A=$1
STRING_B=$2
if [[ ${STRING_A/${STRING_B}//} == $STRING_A ]]
then
## is not substring.
echo N
return 0
else
## is substring.
echo Y
return 1
fi
}
export jmx_file="监控登录验证Wiki.jmx"
export jtl_file="listenerWiki.jtl"
export failure_log="failureWiki.log"
export VPs="(Wiki登录验证)"
#运行jmeter
cd $PROJ_PATH
rm -f $jtl_file
rm -f $failure_log
sh $JMETER_HOME/bin/jmeter.sh -n -t $PROJ_PATH/$jmx_file -l $jtl_file
# 检查log文件中的false
export failure=`cat $jtl_file |grep false`
export size=`echo $failure|awk -F "fail" '{print NF}'`
# 记录false日志
echo $failure > $failure_log
# 如果失败日志中有记录,则认为本次测试结果为fail
export result="success"
export failedFile="wikifail.txt"
if [ $size != "0" ]
then
result="fail"
echo "Wiki login test failed!"
echo "result = $result"
# 判断如果wikifail.txt 文件不存在,则创建该文件,并发送报警邮件(我这里是通过一个jenkins服务来发送相应的邮件)
if [ ! -f "$failedFile" ];then
echo "文件不存在"
echo "sending wiki warning email .... "
echo "wiki can not login" > $failedFile
curl -X POST http://*********/view/TestPlatform/job/WikiAuthFail/build?token=WikiFailed #发送失败提醒邮件
else
echo "文件存在,不发邮件了"
fi
exit -1
else
result="success"
echo "wiki login test success!"
echo "result = $result"
# 判断如果wikifail.txt 文件存在,则删除文件,并发送解除报警的邮件(我这里是通过一个http服务来发送响应的邮件)
if [ -f "$failedFile" ];then
echo "文件存在, 删除文件 并发送报wiki警解除邮件"
rm -f $failedFile
curl -X POST http://****************/view/TestPlatform/job/WikiAuthSuccess/build?token=WikiSuccess #发送报警解除邮件
else
echo "文件不存在,不发邮件了"
fi
exit 0
fi
这里需要说明一定,我利用写本地文件(当做标志位)的方法来控制不要重复触发报警,具体逻辑请看代码。
Jenkins 配置
在 Jenkins 里主要需要配置一下定时任务和运行的 shell 脚本,我这里配置的是 5 分钟跑一次的监控频率,相当于每 5 分钟有人帮你尝试登录一下 wiki,登不上去就会报警。
运行测试
制造错误情形,当系统检查到 wiki 登录出现问题的时候,会启动发送报警邮件功能,发送报警邮件;当问题解决系统恢复之后,发送解除报警的邮件,提示问题解决。
由于我们这个只是监控一个内部使用系统,出现问题修复急迫性不是特别高,所以选择了最 “便宜” 的邮件报警通知的方式
最后说明
这种监控只适用于流量较小的业务,像我列的这种,一个公司内部的 wiki 服务;每天大家工作需要用它,但是访问频率也不算很高,监控的时候 5 分钟尝试一次 还算 OK;如果觉得 5 分钟频率太低也可设为每 1 分钟尝试一次。目的只有一个,就是经常有任务去验证 wiki 登录功能是不是还活着,如果有问题及时赶在同学们发现问题之前先发现,及时补救。 对于线上大流量业务,这种业务功能监控方法是否可以满足监控需求我没有尝试过,所以还有待商榷。