5

测试右移-后台服务监控告警实践_大刚测试开发实战的技术博客_51CTO博客

 2 years ago
source link: https://blog.51cto.com/u_12612738/5609339
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

前段时间,公司上线了“大屏”项目,用于对接展示一些业务平台的数据。但是在上线后使用过程中,产品或业务经常反馈前台页面没有数据。出现这种情况后,开发人员会去排查问题,解决后再通知产品或业务人员解决修复情况。虽然研发每次都能在较短的时间内响应并解决问题,但运行一段时间后又会反复出现,也给用户造成了极其不好的使用体验。而本文则是基于“测试右移”思想,开展的一次后台服务监控告警的实践记录总结,整个实践过程可以分为:

  1. 收到问题反馈;
  2. 沟通定位问题;
  3. 讨论并选定解决方案;
  4. 解决方案实现;
  5. 验证解决方案;
  6. 优化解决方案;
  7. 实施解决方案;

什么是“测试右移”

在正式开始之前,先简单介绍一下“测试右移”:

我们都知道,软件测试活动应当贯穿整个软件生命周期,包括需求讨论分析阶段、研发设计编码阶段、测试阶段、上线后的监控运行阶段。“测试右移”是在产品上线后,为了验证在真实的用户数据环境下,功能、性能以及产品体验,是否符合预期而开展的一系列监控、分析、测试活动,以达到持续监控软件线上质量的目的。一旦线上发生任何问题,则可以提前反应,主动分析,尽快处理,给用户以良好的使用体验。

一、收到问题反馈

测试右移-后台服务监控告警实践_python
测试右移-后台服务监控告警实践_python_02

从项目上线不久,即收到产品多次在项目群中反馈的以上问题。开发经过定位后,给出的说法是“后台链接断掉了”。在其重启后台服务后,该项目确实平稳运行了一段时间,但一段时间后,又会再次发生链接断掉、前台无数据展示的情况。此问题给用户造成了很不好的使用体验。

二、沟通定位问题

1.服务架构

经过和研发的几次沟通交流,我画了份草图,尝试理解和说明问题的产生原因。先简单介绍一下大屏项目的后台服务架构,后台服务假设为B服务。B服务监听的是本地5081端口,通过TCP与网关进行连接,网关通过websocket将B服务传来的后台数据推送给前端进行展示,用户可以通过9530端口进行页面访问。网关与前端之间的websocket连接相对较为稳定,导致出问题的是B服务与网关之间的TCP连接经常断掉,从而导致网关拿不到数据,前端无法展示数据。

测试右移-后台服务监控告警实践_解决方案_03

三、讨论并选定解决方案

1.讨论分析解决方案

既然了解了问题所在,那么就可以针对性地设计解决方案。经过与研发的交流讨论,共总结了以下方案:

① 监控后台服务端口

通过shell脚本+定时任务,每几分钟轮询一次,判断5081端口是否处于连接状态,来确定后台服务与网关之间的TCP链接是否正常,若是断链,则向企业微信发送告警消息、通知人为处理,并自动重启后台服务。这种方法优点是:

  • 最为简单快捷,能够及时通知相关研发测试及时去关注服务连通性,而不是等待客户发现,做到了主动监控;
  • 通过重启机制,能重启后台服务、重新建立TCP链接;
  • 启动shell脚本,开启进程,占用系统资源;
  • 部分情况下可能并不是TCP链接断掉,也可能是连接数量达到上限导致的问题,并没有从根本层面解决问题;

② 业务层代码解决

在业务层的代码中增加“定期检查与网关之间的TCP连接状态”机制,若出现连接断掉的情况,及时重新连接,和上述第一种方式类似,只不过由shell脚本改成了业务代码的形式。

③ 修改底层框架

对于底层通信框架,这个我了解不多。从研发出得到的结论是,改动比较大,需要修改地方比较多,可能会造成其他连带风险。

2.选定解决方案

由于底层框架修改代价较高,可能会导致其他风险、甚至影响到其他在运行项目,且项目需要重新排期,因此,经过一番权衡,我们决定采用第一种通过shell脚本监控后台服务状态的方式来实现解决。

四、解决方案实现

1.总体方案设计

  • send_msg.py:python脚本,向企微发送消息,通知人为干预;
  • monitor.sh:shell脚本,用于监听5081端口,判断服务是否为正常连接状态,若连接异常,则重启服务,并驱动执行send_msg.py的,向企微发送消息;
  • 定时任务:配置一个每五分钟执行一次的定时任务,用于执行monitor.sh,检测TCP连接状态;
测试右移-后台服务监控告警实践_python_04

2.编写监控脚本

1)服务监控脚本

5081为后台服务本地端口,其与网关之间建立连接后,正常连接下,监听状态为“ESTABLISHED”;异常连接时,监听状态为“TIME_WAIT”。因此可以通过判断监听状态来判断服务的连接情况。

测试右移-后台服务监控告警实践_定时任务_05

具体实现如下

#!/bin/sh
export PYTHON_HOME=/home/python3
export PATH=${PATH}:${PYTHON_HOME}"/bin"

# 判断5081端口连接状态
connect_number=`netstat -antp | grep 5081 | grep ESTABLISHED | wc -l`
echo $connect_number
if [ $connect_number != "0" ];then
echo "5081端口连接状态正常"
else
echo "5081端口已断开!!!"
# 重启后台服务
/home/BCS/bin/start.sh
# 执行Python脚本,发送企微消息通知
/home/python3/bin/python3 /home/send_msg.py
fi

注意事项:

脚本开头一定要导出环境变量,否则系统会识别不到Python3,即使/etc/profile中已配置好了Python3的环境变量。(在配置定时任务时发现,怎么都不执行发送消息的Python脚本,困扰了好久)

2)Python发送通知脚本

服务器需提前安装Python环境,可参照前面的文章《​ ​Linux下一键安装Python3&更改镜像源&虚拟环境管理技巧​​》

class EnterpriseWechatNotification:
def __init__(self, hook: list):
self.hook_url_list = [f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={i}" for i in hook]
self.header = {'Content-Type': 'application/json'}

def send_msg(self, result=''):
"""发送企业微信消息通知"""
global payload
current_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
content = f"""** 【大屏服务监控】**
> 当前时间: {current_time}
> 当前环境: #开发环境
> 告警事件: #大屏服务断链,请及时处理!!!
{result}"""
payload = {
"msgtype": "markdown",
"markdown": {
"content": content
}
}

for hook_url in self.hook_url_list:
requests.post(url=hook_url, headers=self.header, data=json.dumps(payload))

if __name__ == '__main__':
# 企业微信群中创建一个机器人,即可拿到hook_url
# 此处为一个hook ID的列表,传入多个,则发送到多个群
EnterpriseWechatNotification(hook=["xxxxxxxxxx"]).send_msg()

3.配置服务器定时任务

1)编辑定时任务

crontab -e

配置内容如下:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

# 每5分钟执行一次monitor.sh
*/5 * * * * root /home/monitor.sh &

2)重启定时任务服务

systemctl restart crond

五、测试环境验证

将项目后台服务断掉,五分钟后,企业微信收到消息通知。可见,脚本及定时任务均正常运行。

测试右移-后台服务监控告警实践_python_06

由于服务重连需要一段时间,通常在一分钟以内。过一分钟后查看,服务已自动重启:

测试右移-后台服务监控告警实践_解决方案_07

六、优化解决方案

上述方案虽能够监控服务连接状态并重启服务、发送消息通知等情况,但也面临一些缺点:运行脚本的服务器需要安装Python3,Python3相关进程也会占用系统资源。Python脚本的本质是调用企业微信的webhook,发送指定内容,那么能否直接在shell脚本中来实现同样的功能?答案是肯定的。(下列脚本为本项目后台开发设计编写,此处仅作引用、添加了一些注释方便理解,以供参考)

#!/bin/bash

date=`date +%Y/%m/%d\ %H:%M:%S`

# 重连函数
re_connet()
{
echo $date ">>>连接已经断开,正在重连中..."
cd /home/jumploo/risun/BCS/bin
sh restart
cd -
watch_msg # 调用发送消息函数
}

# 发送消息函数
watch_msg()
{
num=$connect_num
# 循环20次,每3秒轮询一次,时长共60秒
for i in {1..20};do
# 此处判断逻辑与上述脚本中相同
link_num_=`netstat -antp | grep 5081 | grep "ESTABLISHED" | wc -l`
sleep 3s
if [ $link_num_ == 1 ];then
echo $date ">>>重新连接成功!"
break;
fi
if [ $i == 20 ];then
echo $date ">>>重新连接失败 , 发送企微消息"
# 通过curl命令工具请求企业微信群机器人的webhook_url,发送消息通知到企业微信
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "markdown",
"markdown": {
"content":
"<font color=\"warning\">大屏监控消息</font>\n
> 影响范围:<font color=\"comment\">开发环境 120.48.19.238</font>\n
> 状态:<font color=\"comment\">当前尝试连接失败!</font>"
}
}'
fi
done
}

#echo "=============== 监控 大屏数据 bcs 连接 开始! ==================="
link_num=`netstat -antp | grep 5081 | grep "ESTABLISHED" | wc -l`
if [ $link_num = 0 ];then
re_connet # 调用重连函数
else
echo $date ">>>连接依旧存在!"
fi

再创建一个脚本,用于生成日志文件,内容如下:

#!/bin/bash
sh /home/watch.sh >> /home/log_watch.log &

配置定时任务,5分钟执行一次。测试环境,手动停止B项目的后台服务后,企业微信通知效果如下:

测试右移-后台服务监控告警实践_python_08

七、实施解决方案

我们采用的是Shell脚本中发送企微通知的方案,这样更有利于节约资源。在测试环境验证通过后,即可在生产环境进行部署,步骤同测试环境中的部署步骤一致。

以上就是基于xx后台服务监控告警的一次“测试右移”的实践过程:

  1. 作为项目的测试人员,除了要完成项目测试的基本工作,还应当能够及时跟进问题反馈、了解问题背后的真实原因、参与讨论解决方案,驱动问题解决,从而“变被动为主动”;
  2. 确切地说,上述解决方案并不是上上之选,是在结合时间、风险、人力等项目实际情况,综合评定后所做的选择。截至目前,项目一直平稳运行,未再出现前面项目群中反馈的无数据问题。当然,没有问题反馈并不代表就可以高枕无忧,测试右移的核心目标是持续监控软件线上质量,这样才能做到提前反应,尽快处理,给用户以良好的使用体验。
测试右移-后台服务监控告警实践_python_09

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK