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

news/2024/5/20 4:02:52/文章来源:https://www.cnblogs.com/dagangtest/p/16613765.html

前言

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

  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”。因此可以通过判断监听状态来判断服务的连接情况。

具体实现如下

#!/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" ];thenecho "5081端口连接状态正常"
elseecho "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 payloadcurrent_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

五、测试环境验证

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

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

六、优化解决方案

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

#!/bin/bashdate=`date +%Y/%m/%d\ %H:%M:%S`# 重连函数
re_connet()
{echo $date   ">>>连接已经断开,正在重连中..."cd /home/jumploo/risun/BCS/binsh restartcd -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 3sif  [ $link_num_ == 1 ];thenecho $date   ">>>重新连接成功!"break;fiif  [ $i == 20 ];thenecho $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>"}}'
        fidone
}#echo "=============== 监控 大屏数据 bcs 连接 开始! ==================="
link_num=`netstat -antp | grep 5081 | grep "ESTABLISHED" | wc -l`
if [ $link_num = 0  ];thenre_connet  # 调用重连函数
elseecho $date  ">>>连接依旧存在!"
fi

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

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

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

七、实施解决方案

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

小结

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_2501.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows许可证即将过期?快来小编告诉你解决方法

https://baijiahao.baidu.com/s?id=1598094917004791962&wfr=spider&for=pc很多使用win10系统的用户都有遇到过电脑提示你的windows许可证即将过期的问题,遇到许可证即将过期要怎么办呢?小编这里给大家介绍一下这个问题的解决方法。Windows系统都需要激活后才能使用…

TypeScript 数组中查找最小、最大n个元素

TypeScript 数组中查找最小、最大n个元素var typeArr:number[]=[1,10,50,6,80,9,100];//最小元素private minArr(arr:number[]){let minArray:number[]=[];//3 就是返回多少个for (let i = 0; i < 3; i++) {let min = arr[0]; for (let j = 0; j < arr.length…

多列转两列(Power Query)

问题:多列转一列,如下图,左表转成右表let源 = Excel.CurrentWorkbook(){[Name="表2"]}[Content],拆分列 = Table.ToColumns(源),列分组 = List.Split(拆分列, 2),列合并 = List.Transform(列分组, each Table.FromColumns(_)),升表头 = List.Transform(列合并, ea…

Android开发

1.知识点解析 1.1 dimen1.尺寸资源;2.在工程的res\layout\目录下创建一个test_dimen.xml布局文件。3.在该布局文件中添加一个TextView和一个Button。4.TextView的宽和高引用尺寸资源来设置,android:width="@dimen/text_width"5.dimen定义:<resources><di…

项目管理 WBS 分解法 All In One

项目管理 WBS 分解法 All In One Work Breakdown Structure 工作分解结构项目管理 WBS 分解法 All In OnePMPWork Breakdown Structure / 工作分解结构WBS工作分解结构跟因数分解是一个原理,就是把一个项目,按一定的原则分解,项目分解成任务,任务再分解成一项项工作,再把一…

如何在电脑桌面上显示待办任务清单?

如果你每天的待办工作任务都是很多的,那么你应该如何保证自己能够把每条待办任务管理的井井有条,并且按时完成每项工作任务呢?相信这是很多职场人士都面临的一个难题,每天的工作时间都是固定的,但工作任务却是又多又繁杂,所以就需要大家通过管理待办任务来提高办公效率。…

Stream流-流式思想概述和获取流

流式思想概述 整体来看,流式思想类似于工厂车间的“生产流水线”。 当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个“模型”步骤 方案,然后再按照方案去执行他 这张图中展示了过滤、映射、跳过、计数等多步操作,这是一种集合…

仓库的种类和彼此关系与Maven标准目录结构

仓库的种类和彼此关系 仓库分为三类:本地仓库,远程仓库,中央仓库 三类仓库直间的关系:在默认情况下启动一个Maven工程会从本地仓库找jar包,如果本地没有在连网状态下会从中央仓库下载jar包在公司中启动一个Maven工程会从本地仓库找jar包,本地没有会去远程仓库下jar包,如…

Fecify 自建私有化saas跨境商城系统

作为跨境的运营者,有多站需求的用户,可以通过wp,magento,fecmall等搭建多个跨境独立站,需要每个独立站单独安装,安装模板插件,配置等等,后续的管理维护比较繁琐,大多数的开源性能低下,插件安装冲突,模板调整问题等等,对于没有技术的个人和小公司,掌控难度高,很多…

# 【博学谷学习记录】超强总结,用心分享 | RabbitMQ消息的可靠性

RabbitMQ消息的可靠性消息队列在使用过程中,如何确保RabbitMQ消息的可靠性,如何确保发送的消息至少被消费一次?1.生产者消息确认 RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。这种机制必须给每个消息指定一个唯一ID。消息发送到MQ以后,会返回一个结…

Learn Dijkstra For The Last Time

博客链接:https://www.codein.icu/learn-dijkstra/ Introduction Dijkstra 算法是用于求解非负权图单源最短路的经典算法。 市面上的大部分教程都仅仅停留在「如何实现 Dijkstra 算法」的层面。从应用角度,这当然无可厚非。但理解算法本身,也不失为一件乐事。 问自己这样几个…

自己de搭建博客记录

鸽子啊鸽子一去不复返自己de搭建博客记录因为奇奇怪怪的原因所以开始学着自己搭建一个博客了 但是估计搭好了也不会常更新,连博客园都咕了一个月了 先水水免得自己忘记了,要学的还有挺多 突然发现博客阅读量猛涨,看了下貌似是N2的插件文章被爬到各种奇怪网站了-1 参考资料 参…

The forked VM terminated without properly saying goodbye. VM crash or System.exit called?

1、maven构建报错: [INFO] BUILD FAILURE[INFO] ------------------------------------------------------------------------[INFO] Total time: 47.849 s[INFO] Finished at: 2022-08-19T08:05:22+08:00[INFO] ----------------------------------------------------------…

阿里云 EMAS Serverless 重磅发布

EMAS Serverless重磅发布, 为应用开发者特别是多端开发者实现一站式应用开发提供了全新的开发体验。为了更好的布道推广 Serverless 开发生态,现面向开发者/学生提供免费套餐(不是只1个月哦,你懂的),针对业务发展的不同阶段,提供多种套餐和按量付费模式,请来阿里云官网…

Windows安全加固

实验环境 操作系统:Windows Server 2012 系统密码: 安全加固项 1、用户系统 1.1 加固项名称: Administrator账户停用 加固说明: 防止 Administrator 账户被黑客爆破出密码,避免Administrator账户被黑客利用获取计算机系统权限。只有一个管理员账户时无法禁用,需要创建另一…

WPF实现一个简单自定义管道

先看效果 xaml代码 <UserControl x:Class="WPF控件测试.Control.Pipeline" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" …

获取数的全部因子 单次查询/预处理

对于单次查询,可以直接用sqrt(n)遍历。 对于多次查询,每次都遍历会遍历多个无用的数。 可以采用打表法,直接获取数据范围内的全部数据的因子。 代码如下:int N = 100010; vector<int> factor[100010]; for (int i = 1; i <= N; i++) {for(int j=i;j<=N;j+=i)fa…

漫谈测试成长之探索——缺陷分析

​ 回顾校园生活中,我们参加每一场考试后都会对错题进行分析总结并补缺补漏,以便能更好地去应对更重要的考试。回到软件系统开发中,我们记录和跟踪缺陷的目的是什么,仅仅是为了在软件系统开发过程中跟踪Bug直至修复么?应该不止于此。我们也可以对项目缺陷进行分析,分析其…

SpringBoot读取.yml配置文件最常见的两种方式-源码及其在nacos的应用

一、前言 我们在开发中会经常遇到一些可能会变的值,比如数据库的密码,一些关键链接的配置等等。 都需要我们写在配置文件中,这样可以把这些配置文件放到nacos上进行管理,修改nacos的配置,咱们发布的包就可以动态的进行更新了,不需要重新修改打包在重新发包! 咱们今天就来…

数据结构开门篇

数据结构 1、什么是数据结构 数据结构是数据组织、管理和存储格式,其使用目的是为了高效地访问和修改数据2、时间复杂度和空间复杂度 什么是时间复杂度 时间复杂度是对一个算法运行时间长短的度量,用大O表示,记作 T(n)=O(f(n))如果运行时间是常数量级,则用常数1表示 只保留…