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

前言

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

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

什么是”测试右移”

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

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

一、收到问题反馈

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

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

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

二、沟通定位问题

1.服务架构

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

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

三、讨论并选定解决方案

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连接状态;

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

2.编写监控脚本

1)服务监控脚本

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

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

具体实现如下

bash;gutter:true;</p> <h1>!/bin/sh</h1> <p>export PYTHON_HOME=/home/python3 export PATH=${PATH}:${PYTHON_HOME}"/bin"</p> <p>判断5081端口连接状态 connect_number=<code>netstat -antp | grep 5081 | grep ESTABLISHED | wc -l</code> 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</p> <pre><code> 注意事项: 脚本开头一定要导出环境变量,否则系统会识别不到Python3,即使/etc/profile中已配置好了Python3的环境变量。(在配置定时任务时发现,怎么都不执行发送消息的Python脚本,困扰了好久) #### 2)Python发送通知脚本 服务器需提前安装Python环境,可参照前面的文章《[Linux下一键安装Python3&更改镜像源&虚拟环境管理技巧](https://mp.weixin.qq.com/s?__biz=MzI0ODQ3NTA0Nw==&mid=2247484033&idx=1&sn=3f560798d579ef9f244cfd8110c785e2&chksm=e9a17e49ded6f75f0a5bf72a892f5189bf1881f269920cbe01269c49ad1154f865cbd10ef4a4#rd)》 </code></pre> <p>class EnterpriseWechatNotification: def <strong>init</strong>(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'}</p> <pre><code>def send_msg(self, result=''): """发送企业微信消息通知""" global payload current_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) content = f"""** 【大屏服务监控】** </code></pre> <blockquote> <p>当前时间: {current_time} 当前环境: #开发环境 告警事件: #大屏服务断链,请及时处理!!! {result}""" payload = { "msgtype": "markdown", "markdown": { "content": content } }</p> </blockquote> <pre><code> for hook_url in self.hook_url_list: requests.post(url=hook_url, headers=self.header, data=json.dumps(payload)) </code></pre> <p>if <strong>name</strong> == '<strong>main</strong>': # 企业微信群中创建一个机器人,即可拿到hook_url # 此处为一个hook ID的列表,传入多个,则发送到多个群 EnterpriseWechatNotification(hook=["xxxxxxxxxx"]).send_msg()</p> <pre><code> #### 1)编辑定时任务 </code></pre> <p>crontab -e</p> <pre><code> 配置内容如下: </code></pre> <p>SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root</p> <p>For details see man 4 crontabs</p> <p>Example of job definition: .---------------- minute (0 - 59) | .------------- hour (0 - 23) | | .---------- day of month (1 - 31) | | | .------- month (1 - 12) OR jan,feb,mar,apr ...</p> <p>| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat | | | | | * * * * * user-name command to be executed</p> <p>每5分钟执行一次monitor.sh <em>/5 * </em> * * root /home/monitor.sh &</p> <pre><code> #### 2)重启定时任务服务 </code></pre> <p>systemctl restart crond</p> <pre><code> ## 五、测试环境验证 将项目后台服务断掉,五分钟后,企业微信收到消息通知。可见,脚本及定时任务均正常运行。 ![](https://cdn.nlark.com/yuque/0/2022/png/22764249/1660819131367-a203a9b1-7c63-475b-900a-e6ef9649630a.png) 由于服务重连需要一段时间,通常在一分钟以内。过一分钟后查看,服务已自动重启: ![](https://cdn.nlark.com/yuque/0/2022/png/22764249/1661016631001-1e5848ed-4c73-498e-8ac8-5ebe8ffd9c74.png) ## 六、优化解决方案 上述方案虽能够监控服务连接状态并重启服务、发送消息通知等情况,但也面临一些缺点:运行脚本的服务器需要安装Python3,Python3相关进程也会占用系统资源。Python脚本的本质是调用企业微信的webhook,发送指定内容,那么能否直接在shell脚本中来实现同样的功能?答案是肯定的。(下列脚本为本项目后台开发设计编写,此处仅作引用、添加了一些注释方便理解,以供参考) </code></pre> <h1>!/bin/bash</h1> <p>date=<code>date +%Y/%m/%d\ %H:%M:%S</code></p> <p>重连函数 re_connet() { echo $date ">>>连接已经断开,正在重连中..." cd /home/jumploo/risun/BCS/bin sh restart cd - watch_msg # 调用发送消息函数 }</p> <p>发送消息函数 watch_msg() { num=$connect_num # 循环20次,每3秒轮询一次,时长共60秒 for i in {1..20};do # 此处判断逻辑与上述脚本中相同 link_num_=<code>netstat -antp | grep 5081 | grep "ESTABLISHED" | wc -l</code> 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": "大屏监控消息\n > 影响范围:"comment\">开发环境 120.48.19.238\n > 状态:"comment\">当前尝试连接失败!" } }' fi done }</p> <h1>echo "=============== 监控 大屏数据 bcs 连接 开始! ==================="</h1> <p>link_num=<code>netstat -antp | grep 5081 | grep "ESTABLISHED" | wc -l</code> if [ $link_num = 0 ];then re_connet # 调用重连函数 else echo $date ">>>连接依旧存在!" fi</p> <pre><code> 再创建一个脚本,用于生成日志文件,内容如下: </code></pre> <h1>!/bin/bash</h1> <p>sh /home/watch.sh >> /home/log_watch.log &

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

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

七、实施解决方案

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

小结

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

  1. 作为项目的测试人员,除了要完成项目测试的基本工作,还应当能够及时跟进问题反馈、了解问题背后的真实原因、参与讨论解决方案,驱动问题解决,从而”变被动为主动”;
  2. 确切地说,上述解决方案并不是上上之选,是在结合时间、风险、人力等项目实际情况,综合评定后所做的选择。截至目前,项目一直平稳运行,未再出现前面项目群中反馈的无数据问题。当然,没有问题反馈并不代表就可以高枕无忧,

更多测试开发干货,欢迎关注!

Original: https://www.cnblogs.com/dagangtest/p/16613765.html
Author: 大刚测试开发实战
Title: 测试右移-后台服务监控告警实践

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/714477/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球