自动化工具 旁门左道 —— 利用自动化测试方法对服务器进行业务功能监控

网球王子 · 2018年08月20日 · 最后由 John 回复于 2018年08月22日 · 1913 次阅读

首先说一下本文要分享技术经验的背景
原因很简单,常规的服务器监控只是针对机器性能或者网络的功能进行的监控,比如 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 登录功能是不是还活着,如果有问题及时赶在同学们发现问题之前先发现,及时补救。 对于线上大流量业务,这种业务功能监控方法是否可以满足监控需求我没有尝试过,所以还有待商榷。

共收到 6 条回复 时间 点赞

我用 java 刚撸了一个。配合 nginx lua,监控业务异常,巡检所有服务器。有效代码行数 20 行,哈哈哈。

JMeter 写好断言不就可以直接判断服务是否正常了么? 然后配合 Jenkins 在失败的时候发邮件不就可以了么?为什么要写 Shell

lvchongen 回复

jenkins 失败的时候发邮件提醒会有问题,我们的监控是每 5 分钟运行一次,如果 wiki 服务出现了问题,在修好服务之前,jenkins 任务都会失败,那结果就是每 5 分钟发一次邮件,等于报警邮件轰炸,这个会很头疼。

确实属于旁门左道
1、最好的方法是加埋点
2、其次是收集日志,通过日志监控发现问题

其实就跑一部分线上业务回归吗 我这 10 分钟一次 习惯了

zabbix 就可以做这种监控

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册