后台服务异常?测试右移告警监控早知道。。。。

news2024/7/4 5:17:43

目录

引言

“测试右移”思想下实践步骤

什么是“测试右移”

一、收到问题反馈

二、沟通定位问题

1.服务架构

三、讨论并选定解决方案

1.讨论分析解决方案

2.选定解决方案

四、解决方案实现

1.总体方案设计

2.编写监控脚本

3.配置服务器定时任务

五、测试环境验证

六、优化解决方案

七、实施解决方案

小结


引言

后台服务异常是影响正常业务运行的重要原因之一。如果我们能够提前发现这些异常情况,就可以及时采取措施避免问题扩大化。测试右移告警监控方案在这个时候就能派上用场了。

通过实践,我们发现这种方案可以帮助团队更早地发现后台服务异常,并快速解决问题,从而保障业务的稳定性和可靠性。让我们一起来了解一下测试右移告警监控实践吧!

“测试右移”思想下实践步骤

前段时间,公司上线了“大屏”项目,用于对接展示一些业务平台的数据。但是在上线后使用过程中,产品或业务经常反馈前台页面没有数据。出现这种情况后,开发人员会去排查问题,解决后再通知产品或业务人员解决修复情况。

虽然研发每次都能在较短的时间内响应并解决问题,但运行一段时间后又会反复出现,也给用户造成了极其不好的使用体验。而本文则是基于“测试右移”思想,开展的一次后台服务监控告警的实践记录总结,整个实践过程可以分为:

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

具体实现如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#!/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环境

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

五、测试环境验证

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

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

六、优化解决方案

上述方案虽能够监控服务连接状态并重启服务、发送消息通知等情况,但也面临一些缺点:运行脚本的服务器需要安装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项目的后台服务后,企业微信通知效果如下:

七、实施解决方案

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

小结

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

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

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。欢迎留言,或是关注我的专栏和我交流。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始学Java之Integer底层原理探究

前言 在之前的两篇文章中&#xff0c;壹哥给大家介绍了Java中的包装类及其特点、用法&#xff0c;但是这些内容主要是停留在”怎么用“的层面&#xff0c;没有太多涉及”为什么“&#xff0c;所以接下来壹哥会给大家讲一讲Integer这个包装类的底层原理。在现在的就业环境下&am…

Apache Tomcat CVE-2020-1938 漏洞

Apache Tomcat CVE-2020-1938 漏洞简单复现 文章目录 Apache Tomcat CVE-2020-1938 漏洞简单复现实验准备实验步骤搭建环境nmap扫描漏洞端口POC代码验证漏洞修复建议 参考链接 实验准备 所选漏洞&#xff1a;Apache Tomcat远程代码执行漏洞 漏洞编号&#xff1a;CVE-2020-193…

AppArmor零知识学习三、源码介绍与下载

本文内容参考&#xff1a; AppArmor配置&#xff08;二&#xff09;_domybest_nsg的博客-CSDN博客&#xff0c; Apparmor简单学习_trap0D的博客-CSDN博客&#xff0c; 学习LSM(Linux security module)之三:Apparmor的前世今生和基本使用_wx5b7658e51ef04的技术博客_51CTO博客…

JavaEE初阶学习:文件操作

1.文件 1.认识文件 平时说的文件一般都是指存储再硬盘上的普通文件&#xff0c;形如txt&#xff0c;jpg&#xff0c;MP4&#xff0c;rar等这些文件都可以认为是普通文件&#xff0c;它们都是再硬盘上存储的。 在计算机中&#xff0c;文件可能是一个广义的概念&#xff0c;就…

【云原生|Docker】12-Docker Harbor企业级镜像管理

【云原生Docker】12-Docker Harbor企业级镜像管理 文章目录【云原生Docker】12-Docker Harbor企业级镜像管理前言Harbor简介简介架构介绍组件间说明工作原理docker logindocker pushHarbor安装版本介绍安装Http模式部署https模式部署前言 ​ 上一章节我们介绍了Docker的官方的镜…

【redis】集成到SpringBoot

集成到SpringBoot 类似于java连接mysql需要JDBC 而Java连接redis则需要 对应的 工具类 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录集成到SpringBoot前言一、Jedis加依赖写业务二、lettuce加依赖写业务Jedis和…

转换字符串的最少操作次数是否所有1都至少相隔k个元素重复至少k次且长度为M的模式移除指定数字得到的最大结果 得到k个黑块的最少涂色次数

转换字符串的最少操作次数&#xff08;回顾等级&#xff1a;不值得&#xff1b;已达最优解&#xff09; 来源&#xff1a;自己LeetCode刷题 usa int minimumMoves(char * s) {int szstrlen(s);int res0;for (int i0;i<sz;i){if (s[i]X){i2;res;}}return res; }是否所有1都…

Makefile实验

一、准备C程序 1、input.h #ifndef __INPUT_H #define __INPUT_Hvoid input_int(int *a, int *b);#endif 2、input.c #include <stdio.h> #include "input.h"void input_int(int *a, int *b) {printf("input two nums: ");scanf("%d %d&q…

8年经验的面试官分享Android工程师的面试秘诀

本人目前在一家知名企业担任Android高级工程师&#xff0c;工作八年来面试不过不少Android工程师求职者&#xff0c;前后累积有两三百人。在本文内容中&#xff0c;小编将结合本人的面试经验&#xff0c;给各位正在找Android开发工作的小伙伴提出一些面试前的准备建议。 一&am…

vue3通用后台管理项目

一、创建项目 1、使用vite创建名为my-vue的项目&#xff1a;npm init vite-app my-vue 2、进入到my-vue文件夹下&#xff1a;cd my-vue 3、安装依赖包&#xff1a;npm install 4、运行该项目&#xff1a;npm run dev 二、引入element-plus 1、element-plus地址&#xff1a;http…

Camunda整体架构

REST API REST API 允许您从远程应用程序或 JavaScript 应用程序使用流程引擎。&#xff08;注意&#xff1a;REST API 的文档被分解为自己的文档。&#xff09;REST API Reference | docs.camunda.org Camunda Tasklist用于人工工作流管理和用户任务的 Web 应用程序&#xff0…

UniverSeg:通用医学图像分割模型来了!

自从今年以来ChatGPT爆火和GPT-4的发布&#xff0c;一时间在大模型的潮流下&#xff0c;通用人工智能&#xff08;AGI&#xff09;也呼之欲出。随着本月初SAM和SegGPT等通用的CV大模型的提出&#xff0c;大模型和通用模型这把火也逐渐烧到的CV领域&#xff0c;特别是图像分割领…

Linux应用编程(文件IO进阶)

一、Linux 系统如何管理文件 1.1、静态文件与 inode 文件存放在磁盘文件系统中&#xff0c;并且以一种固定的形式进行存放&#xff0c;我们把他们称为静态文件。 每一个文件都必须对应一个 inode&#xff0c;inode 实质上是一个结构体&#xff0c;这个结构体中有很多的元素&a…

【C语言】初阶指针(指针运算、二级指针及指针数组)

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1. 指针运算 4.1 指针-整数 1.2 指针 - 指针 1.3 指针的关系运算 2. 指针和数组 3. 二级指针 4. 指针数组 1. 指针运算 指针-整数指针-指针指针的关系运算 4.1 指针-整数 上面这个程序的作用是将数组中每个元…

【攻城狮计划】Renesas RA2E1 开发板

&#x1f6a9;WRITE IN FRONT&#x1f6a9; &#x1f50e;介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四"&#x1f50e;&#x1f3c5;荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TOP10…

Scalable Recognition with a Vocabulary Tree(词汇树)

视觉单词 参考 视觉词袋&#xff08;BoVW&#xff0c;Bag of Visual Words&#xff09;模型&#xff0c;是“词袋”&#xff08;BoW&#xff0c;Bag of Words&#xff09;模型从自然语言处理与分析领域向图像处理与分析领域的一次自然推广。对于任意一幅图像&#xff0c;BoVW模…

jwt生成和解密-jose4j

jwt生成和解密-jose4j jwt的概念和生成意义在这里就不描述了&#xff0c;百度能搜到很多&#xff0c;直接上代码 官网地址 https://bitbucket.org/b_c/jose4j/wiki/Home maven <dependency><groupId>org.bitbucket.b_c</groupId><artifactId>jose4j…

【微信小程序】-- 配置uni-app的开发环境(四十八)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

Echarts图表显示不完全(多种图表解决方案)

前言 在使用Echarts画图的时候&#xff0c;有时候图表在固定大小的盒子模型&#xff08;dom容器&#xff09;中会显示不完全&#xff0c;因此我们需要对图表进行相关的调整使得图表内容显示完全。结合最近遇到的情况&#xff0c;提出一些解决方向 &#xff08;比较片面&#x…

Linux操作系统ARM体系结构处理器机制原理与实现

ARM 的概念ARM(Advanced RISC Machine)&#xff0c;既可以认为是一个公司的名字&#xff0c;也可以认为是对一类微处理器的通称&#xff0c;还可以认为是一种技术的名字。ARM 公司并不生产芯片也不销售芯片&#xff0c;它只出售芯片技术授权。其合作公司针对不同需求搭配各类硬…