CN115757088B - 基于环境变量的故障注入方法、装置和设备 - Google Patents
基于环境变量的故障注入方法、装置和设备 Download PDFInfo
- Publication number
- CN115757088B CN115757088B CN202211236617.4A CN202211236617A CN115757088B CN 115757088 B CN115757088 B CN 115757088B CN 202211236617 A CN202211236617 A CN 202211236617A CN 115757088 B CN115757088 B CN 115757088B
- Authority
- CN
- China
- Prior art keywords
- target
- fault
- fault data
- hook
- injection
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Test And Diagnosis Of Digital Computers (AREA)
Abstract
本申请实施例提供了一种基于环境变量的故障注入方法、装置和设备,涉及混沌工程技术领域。该方法包括:获取预设的任务表并将故障数据写入到任务表中,任务表缓存于共享内存中;进程运行过程中,基于环境变量优先加载钩子动态库,环境变量为系统环境变量,进程通过钩子方法与任务表参数进行匹配;如果匹配成功则基于任务表对应故障执行故障注入;如果匹配不成功则不执行故障注入。本申请实施例提供的方法可通过对各种业务应用实施故障注入,实现对关联多个业务应用的金融核心业务系统的高可用性和稳健性的测试。
Description
技术领域
本申请涉及混沌工程技术领域,具体而言,本申请涉及一种基于环境变量的故障注入方法、装置和电子设备。
背景技术
随着金融业务的发展,构成金融核心业务系统的服务器、操作系统、数据库及业务系统越来越多的采用了云计算和分布式等新技术。而云计算和分布式技术的不确定性是对金融核心业务系统的稳健性和高可用性的挑战。其中,该不确定性来自于各种软件/硬件故障。因此,如何对金融核心业务系统的稳健性和高可用性进行测试,则成为软件开发和测试团队共同的困境。
目前,传统的非功能测试和故障模拟手段有限且效率低下,难以发现和规避软件/硬件故障,以及由此引发的服务异常级联反应所造成的系统事故。
发明内容
本申请实施例的目的在于提供一种基于环境变量的故障注入方法、装置和电子设备,以解决上述技术问题之一。为了实现该目的,本申请实施例提供的技术方案具体如下所示。
一方面,本申请实施例提供了一种基于环境变量的故障注入方法,该方法包括:
获取预设的任务表并将故障数据写入到任务表中,任务表缓存于共享内存中;进程运行过程中,基于环境变量优先加载钩子动态库,环境变量为系统环境变量,进程通过钩子方法与任务表参数进行匹配;如果匹配成功则基于任务表执行故障注入;如果匹配不成功则不执行故障注入。
可选的,进程运行过程包括进程的启动过程和进程调用方法的过程;进程运行过程中,基于环境变量优先加载钩子动态库,包括:
在进程的启动过程中,基于已配置钩子动态库的环境变量进行链接操作,以便于将进程中针对目标方法的调用定向至目标钩子方法,目标钩子方法为钩子动态库中与目标方法相匹配的钩子方法。
在进程调用方法的过程中,若进程调用目标方法,调用目标钩子方法。
可选的,获取预设的任务表并将故障数据写入到任务表中,包括:
通过探针接收至少一条故障数据;每一故障数据关联一个钩子方法和至少一个其他进程;将接收的至少一条故障数据写入任务表中。
可选的,通过钩子方法与任务表参数进行匹配,包括下述确定步骤:
从任务表中确定与目标钩子方法关联的至少一条待注入的故障数据;将进程与每条待注入的故障数据所关联的进程进行匹配;若匹配成功,则将相应的待注入的故障数据确定为目标故障数据,并确定针对进程注入目标故障数据。
可选的,在执行确定步骤之前,还包括:
若缓存有与进程的标识和目标钩子方法相应的故障数据,将缓存的故障数据确定为目标故障数据,确定针对进程注入目标故障数据;若未缓存有与进程的标识和目标钩子方法相应的故障数据,或者与目标钩子方法所关联的故障数据有更新,则执行确定步骤。
可选的,注入目标故障数据,包括:
若目标故障数据的注入故障率不为空,统计目标故障数据的实时故障率;若实时故障率小于目标故障数据的注入故障率,则注入目标故障数据。
可选的,注入目标故障数据,包括:
若目标故障数据的注入时效不为空,获取当前时间;目标注入时效由注入的开始时间和/或结束时间确定;若当前时间在目标故障数据的注入时效内,则注入目标故障数据。
另一方面,本申请实施例还提供了一种故障注入实验系统,包括实验控制台和被测试服务器,其特征在于,进行故障注入实验时执行如下操作步骤:
在实验控制台上确定故障数据。
在被测试服务器上安装探针,以及基于钩子动态库,配置环境变量并启动探针。
实验控制台将进程的相关数据下发到被测试服务器上,探针在接收到进程的相关数据后开始实验。
进程基于环境变量运行钩子动态库来判断探针将故障注入或故障执行情况反馈给实验控制台。
再一方面,本申请实施例还提供了一种基于环境变量的故障注入装置,该装置包括:
获取模块,用于获取预设的任务表并将故障数据写入到任务表中,任务表缓存于共享内存中。
运行模块,用于在进程运行过程中,基于环境变量优先加载钩子动态库,环境变量为系统环境变量,进程通过钩子方法与任务表参数进行匹配。
故障注入模块,用于如果匹配成功则基于任务表执行故障注入;如果匹配不成功则不执行故障注入。
本申请实施例还提供了一种电子设备,该电子设备包括:存储器、处理器及存储在存储器上的计算机程序,其特征在于,处理器执行计算机程序以实现本申请实施例所提供的一种基于环境变量的故障注入方法的步骤。
本申请实施例提供的技术方案带来的有益效果是:
本申请实施例提供了一种基于环境变量的故障注入方法,该方法包括:获取预设的任务表并将故障数据写入到任务表中,任务表缓存于共享内存中;进程运行过程中,基于环境变量优先加载钩子动态库,环境变量为系统环境变量,进程通过钩子方法与任务表参数进行匹配;如果匹配成功则基于任务表对应故障执行故障注入;如果匹配不成功则不执行故障注入。该方法通过将故障数据写入到任务表中,可以实现对故障数据的有效管理;而在进程运行过程中,基于环境变量优先加载钩子动态库,在方法调用阶段就可以将待调用的目标方法定向至钩子动态库,为实施故障注入奠定实施基础;而通过钩子方法与任务表参数进行的匹配操作就可以确定是否要实施故障注入。其中,如果匹配成功,则实施故障注入。本申请实施例提供的方法通过对各种业务应用实施故障注入,实现对关联多个业务应用的金融核心业务系统的高可用性和稳健性的测试。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对本申请实施例描述中所需要使用的附图作简单地介绍。
图1为本申请实施例提供的一种故障注入实验系统的结构示意图;
图2为本申请实施例提供的基于图1所示的实验系统进行故障注入实验的流程示意图;
图3为本申请实施例提供的一种基于环境变量的故障注入方法的流程示意图;
图4a为本申请实施例提供的调用方法的应用场景示意图;
图4b为本申请实施例提供的基于已配置环境变量调用方法的应用场景示意图;
图5为本申请实施例提供的一种基于环境变量的故障注入装置的结构示意图;
图6为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
下面结合本申请中的附图描述本申请的实施例。应理解,下面结合附图所阐述的实施方式,是用于解释本申请实施例的技术方案的示例性描述,对本申请实施例的技术方案不构成限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本申请实施例所使用的术语“包括”以及“包含”是指相应特征可以实现为所呈现的特征、信息、数据、步骤、操作、元件和/或组件,但不排除实现为本技术领域所支持其他特征、信息、数据、步骤、操作、元件、组件和/或它们的组合等。应该理解,当我们称一个元件被“连接”或“耦接”到另一元件时,该一个元件可以直接连接或耦接到另一元件,也可以指该一个元件和另一元件通过中间元件建立连接关系。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的术语“和/或”指示该术语所限定的项目中的至少一个,例如“A和/或B”可以实现为“A”,或者实现为“B”,或者实现为“A和B”。
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
随着金融业务的发展,构成金融核心业务系统的服务器、操作系统、数据库及业务系统越来越多的采用了云计算和分布式等新技术。其中,在该金融核心业务系统的运行过程中,通常会遇到各种故障,如:服务器等硬件故障、操作系统的内核故障和网络抖动(一种故障类型)等软件故障。因此,一个具有高可用性的金融核心业务系统,则非常依赖其自身的健壮性,以确保在上述各种硬件和/或软件故障的情形下,依旧能够稳健运行。因此,如何实现对金融核心业务系统的健壮性和高可用性的测试则成为软件开发和测试团队共同的困境。
传统测试方法是通过在代码中插入一段桩代码或写脚本来模拟错误,但这种方法存在很多问题,如修改代码、无法复用、测试效率低下、一些故障难以模拟、集成测试困难等。在此背景下,混沌工程产品应运而生。混沌工程产品,可支持在分布式系统(如,上述金融核心业务系统)上进行由经验指导控制的实验,观察系统行为并发现系统缺陷,建立对系统在规模增大时因意外条件引发混乱的场景模拟。
目前,业内的一些开源混沌工程产品要么功能比较单一只面向特定场景,要么工具做的非常复杂,对不同开发语言、中间件实现不同故障事件注入手段。因此,在实施过程中,无法对各式各样的业务应用实现快速的故障注入的。
本申请实施例基于混沌工程的思想提供了一种故障注入实验系统,该实验系统的关键点为:基于对环境变量的配置模拟注入多种硬件和软件错误,进行故障场景的编排,将故障注入到分布式系统中任一被测试服务器中。其中,该实验系统主要由两部分组成:实验控制台和被测试服务器,实验控制台和被测试服务器通过探针通信。其中,该探针可以理解为两个终端之间通讯的代理。可选的,该被测试服务器可以为一个,也可以为多个。
本申请实施例基于上述混沌演练自动化平台提供了一种基于环境变量的故障注入方法,应用于上述被测试服务器。其中,被测试服务器中预先存储有钩子动态库,基于该钩子动态库配置环境变量(如LD_PRELOAD),可将该钩子动态库配置到被测试服务器的运行环境中。其中,在创建进程的链接阶段,可基于已配置的环境变量链接钩子动态库,以便于将进程中针对目标方法的调用定向至钩子动态库中与目标方法相匹配的钩子方法。该方法具体可以包括:获取预设的任务表并将故障数据写入到任务表中,任务表缓存于共享内存中;进程运行过程中,基于环境变量优先加载钩子动态库,环境变量为系统环境变量,进程通过钩子方法与任务表参数进行匹配;如果匹配成功则基于任务表对应故障执行故障注入;如果匹配不成功则不执行故障注入。
其中,基于对环境变量的配置为将钩子动态库的标识作为参数去对LD_PRELOAD进行配置。其中,LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许定义在应用程序运行前优先加载的动态链接库。通过这个环境变量,可以在应用程序与其所依赖的动态链接库之间加载别的动态链接库(如,钩子动态库),甚至覆盖应用程序所依赖的动态链接库中的同名符号。
可选的,本申请实施例提供的方法可以实现为一独立的应用程序或者是一应用程序的功能模块/插件,比如,该应用程序可以是专门的故障注入软件或者是具有故障注入功能的其他应用程序,通过该应用程序,可以实现对上述业务应用的故障注入。
下面通过对几个示例性实施方式的描述,对本申请实施例的技术方案以及本申请的技术方案产生的技术效果进行说明。需要指出的是,下述实施方式之间可以相互参考、借鉴或结合,对于不同实施方式中相同的术语、相似的特征以及相似的实施步骤等,不再重复描述。
图1示出了本申请实施例提供的一种故障注入实验系统,该系统包括实验控制台和被测试服务器。基于图2所示的实验系统进行故障注入实验时,具体执行如下操作步骤S210~S240。
S210,在实验控制台上确定故障数据。
具体的,该实验控制台由可视化操作中心和流程引擎组成。其中,可视化操作中心负责向用户展示编辑界面,以便用户根据各种编辑界面编辑故障参数,以便生成故障数据。
S220,在被测试服务器上安装探针,以及基于钩子动态库配置环境变量并启动探针。
S230,实验控制台将进程的相关数据下发到被测试服务器上,探针在接收到进程的相关数据后开始实验。
具体的,在接收到实验人员确定要下发的故障数据之后,实验控制台调用流程引擎向被测试服务器发送故障数据,也即进程的相关数据。其中,流程引擎与安装在被测试服务器上的探针通过无线网络连接。
S240,进程基于环境变量运行钩子动态库来判断探针将故障注入或故障执行情况反馈给实验控制台。
具体的,在进程的启动阶段,基于环境变量优先调用钩子动态库,并在调用钩子动态库中的钩子方法时,实施故障注入。另外,探针还可以将是否执行故障注入,或者将执行故障注入后的执行过程,以及是否执行成功向实验控制台反馈。
可选的,被测试服务器上安装有与金融核心业务相关联的各类业务应用。本申请实施例所示的进程为各类业务应用的运行实体。
图3示出了本申请实施例提供的一种基于环境变量的故障注入方法,该方法应用于上述实施例中的被测试服务器。其中,该方法包括步骤S310~S340。
S310,获取预设的任务表并将故障数据写入到任务表中,任务表缓存于共享内存中。
具体的,该任务表缓存于用户态的共享内存中。其中,内核态与用户态是操作系统的两种运行级别。Intel CPU提供了Ring0-Ring3的多级别的运行模式。其中,标识为Ring0级别的内存,是留给操作系统进程、设备驱动进程所使用的,一般称作内核态;标识为Ring3级别的内存,则是留给普通的用户程序使用的,一般称作用户态。而本申请实施例所示的方法是基于缓存于用户态的共享内存中的任务表实施的。
S320,进程运行过程中,基于环境变量优先加载钩子动态库,环境变量为系统环境变量,进程通过钩子方法与任务表参数进行匹配。
S330,如果匹配成功则基于任务表对应故障执行故障注入。
S340,如果匹配不成功则不执行故障注入。
本申请实施例提供了一种基于环境变量的故障注入方法,通过将故障数据写入到任务表中,可以实现对故障数据的有效管理;而在进程运行过程中,基于环境变量优先加载钩子动态库,在方法调用阶段就可以将待调用的目标方法定向至钩子动态库,为实施故障注入奠定实施基础;而通过钩子方法与任务表参数进行的匹配操作就可以确定是否要实施故障注入。其中,如果匹配成功,则根据任务表对应的故障执行故障注入。
基于此,可以在每一钩子方法中设定故障注入的逻辑,如输入输出故障、读写故障、网络延时故障和磁盘故障等。因此,在业务应用相应的进程调用目标方法时,实际上是调用了钩子方法,而调用钩子方法的过程即为向进程注入故障的过程。通过对各种业务应用实施故障注入,从而实现对关联多个业务应用的金融核心业务系统的高可用性和稳健性的测试。
进程的运行过程包括多种过程,如进程的启动过程,进程调用方法的过程。下面就针对进程的不同状态展开具体阐述。在一个可选的实施例中,进程运行过程包括进程的启动过程和进程调用方法的过程;进程运行过程中,基于环境变量优先加载钩子动态库,具体可以包括如下步骤Sa1和Sa2。
Sa1,在进程的启动过程中,基于已配置钩子动态库的环境变量进行链接操作,以便于将进程中针对目标方法的调用定向至目标钩子方法,目标钩子方法为钩子动态库中与目标方法相匹配的钩子方法。
可选的,进程中目标方法可以为一个或者多个,每一目标方法都配置有相应的钩子方法,所有的钩子方法都配置于钩子动态库中。
示例性地,该环境变量为LD_PRELOAD。如,钩子动态库的名称为Libaxehooks.so,其所在路径为:“./Libaxehooks.so”,下述语句为根据该钩子动态库配置环境变量的伪代码:
export LD_PRELOAD=“./Libaxehooks.so”
可选的,将进程中针对目标方法的调用定向至目标钩子方法,具体可以包括:
在针对目标应用启动进程的启动阶段,需链接运行该进程所依赖的动态库,如:Libc函数库,标准C函数库;webkit函数库,提供浏览器支撑的函数库;openGL函数库,提供图形处理支撑的函数库。而由于对LD_PRELOAD进行了配置,在执行链接操作时,将优先于上述所依赖的动态库加载钩子动态库,并将其中的目标钩子方法的入口地址与进程中目标方法的对应关系建立起来,以便该进程调用目标方法时,是调用的目标钩子方法的入口地址。而调用一个方法的入口地址可以理解为执行该方法中所预设的逻辑。
Sa2,在进程调用方法的过程中,若进程调用目标方法,调用目标钩子方法。
应当指出,在本申请实施例中,函数也可以理解为方法,也即进程调用函数的过程也可以理解为进程调用方法的过程;同时,函数库也可以理解为方法库。
一般而言,函数的名称其实只是一个标识,具体对应内存中的一个地址,该地址通常称作函数的入口地址。在CPU执行指令的过程中,执行完一条指令之后,则由PC计数器指向下一条指令的地址,然后CPU获取下一条指令的地址,从而执行下一条指令。而函数调用的过程,是把PC计数器指向这个函数所对应的入口地址,并由CPU基于该入口地址执行指令。
应当指出,本申请实施例所指的目标方法为未在目标应用程序(也即,目标应用)中有具体实现的函数。因此,在创建进程的编译阶段,目标方法相应的入口地址为空(如以0标识),并且需要在创建进程的链接阶段,确定目标方法的入口地址。一般而言,针对目标方法,当前节点中预置有进程所依赖的动态库,该动态库中有目标方法的具体实现过程,在链接阶段则会加载该动态库至内存,并将该动态库中与目标方法相匹配的函数的入口地址作为目标方法的入口地址。而此时,若基于钩子动态库对LD_PRELOAD进行了配置,而且这个钩子动态库中存在与目标方法相匹配的钩子方法,即目标钩子方法。那么在链接阶段结束之后,会将钩子动态库中目标钩子方法的入口地址作为目标方法的入口地址。其中,目标钩子方法与目标方法具有相同的函数名称,但是该目标钩子方法中实现的逻辑则可以自定义。接下来,在进程调用目标方法时,PC计数器会指向目标钩子方法的入口地址,CPU则开始执行由目标钩子方法所编译的指令。
由于Libc动态库所包含的open()、read()、write()、sendto()、recvfrom()等方法是在进程运行过程中调用频次较高的库方法,因此,可以针对Libc动态库中的上述方法编写一个相匹配的钩子动态库,该钩子动态库中包括多个与Libc动态库中的方法具有相同匹配标识的钩子方法(该匹配标识具体为方法名称、方法的参数、方法的返回值类型),通过该钩子方法实施故障注入,以提高故障注入的效率。如,编写一个相匹配的钩子动态库Libaxehooks,并在Libaxehooks中实现open()、read()、write()、sendto()、recvfrom()等钩子方法,这些钩子方法的方法名称与Libc动态库中上述库方法的名称相同。其中,每一方法的方法名称包括了所定义的多个参数的名称,以及参数的数据类型。其中,可通过不同的方法可实现不同的故障模拟,如:基于sendto()、recvfrom()方法可以模拟网络故障、网络延迟等;基于open()、read()、write()方法可以模拟IO错误和IO延迟等。
示例性地参见图4a和图4b所示的关于进程A调用写方法的过程,该写方法可表示为:write()。其中,Libc.so为系统动态库,Libaxehooks.so为钩子动态库。在图4a中,若未对LD_PRELOAD进行配置,进程A调用写方法时,实质上调用的是Libc.so中的写方法,即write();在图4b中,若对LD_PRELOAD进行了配置,进程A调用写方法时,实质上调用的Libaxehooks.so中实现的写方法。
可选的,还可以在目标钩子方法中增添预设步骤,该预设步骤用于调用目标库方法,目标库方法为与目标方法相匹配的库方法。如图4b所示,在调用Libaxehooks.so中的write()时,由于预设步骤的设置,又将调用指向了Libc.so中write()。该相匹配的库方法隶属于进程所依赖的动态库。如,目标方法为write()时,那么Libc.so为进程所依赖的动态库,而Libc.so中有write()的具体实现。
由于一旦发起针对目标库方法的调用,将会调用与目标方法相匹配的钩子方法。因此,还可以针对目标方法基于优先级进行方法调用。如,将目标钩子方法排在优先调用的位置,而将目标库方法排在次优先调用的位置。在未设置调用优先级的条件下,默认调用目标钩子方法;若设置了调用优先级,则根据调用优先级进行方法调用。如,在该预设步骤中,设置调用的优先级为次优先级,也即最终调用的是目标库方法。
承接S340,如果匹配不成功,则不执行故障注入,并且重新调用与目标库方法,以完成进程对目标方法调用的过程。
接下来,将针对任务表如何管理故障数据进行详细的阐述。
在一个可选的实施例中,获取预设的任务表并将故障数据写入到任务表中具体可以包括步骤Sb1~Sb2。
Sb1,通过探针接收至少一条故障数据;每一故障数据关联一个钩子方法和至少一个其他进程;
可选的,在被测试服务器的启动阶段,可以在用户态的共享内存中创建任务表。
可选的,被测试服务器上的任一进程启动之后,可通过探针将已启动的进程的启动信息发送至实验控制台。实验控制台在接收到进程的启动信息之后,从启动的多个进程中选择待进行故障注入的进程,并基于用户输入的参数配置故障数据,也即该故障数据携带有进程的标识信息;实验控制台发送已创建的故障数据,并由被测试服务器的探针负责接收。
可选的,每条故障数据至少包括如下内容:所关联的进程的信息、错误码、任务标识和所关联的钩子方法的信息。其中,所关联的进程的信息包括该进程的名称、进程标识(如进程的PID)等信息。其中,关联的钩子方法的信息包括该钩子方法的名称。
可选的,该错误码可以参考被测试服务器中设置的错误码列表,该错误码列表中每个错误码都代表一种具体故障。如,“5”表示“IO输入/输出错误”,“101”表示“网络故障”。应当指出,关于错误码及其解释的定义可适应被测试服务器中预设的错误码定义方式,以便于在用户看到错误码之后能够了解具体是什么故障,即得到更好的故障模拟效果。
可选的,该条故障数据还包括预设的各种故障参数。如对于延迟类故障,故障数据还包括延迟时间。如对于文件类故障,故障数据还可以包括相应的文件名称。应当指出,故障参数的设置可以参考相关技术或者根据实际需求,为描述简便在此不再赘述。
Sb2,将接收的至少一条故障数据写入任务表中。
可选的,该至少一条故障数据以为针对单个进程下发的,也可以为针对多个进程下发的。可选的,探针在接收故障数据时,可以按照批次进行接收的,每一批的故障数据共享同一任务标识。每一批的故障数据中,每条故障数据可对应不同的故障类型。该故障类型可以以钩子方法的名称来标识,也可以用几个钩子方法所属类型来进行标识。
示例性地,通过sendto()、recvfrom()方法可以注入网络类型的故障,而通过sendto()方法可以注入网络发送故障,以及通过recvfrom方法可以注入网络接收的故障。通过read()/write()/open()可以注入输入/输出类型的故障,而通过read()可以注入读数据故障,以及通过write()可以注入写数据故障,通过open()可以注入打开文件故障。
可选的,任务表中每条故障数据可以通过任务标识和关联的钩子方法的信息唯一标识。具体地,以关联的钩子方法为第一索引,任务标识为第二索引,通过第一索引和第二索引就可以在任务表中定位一个待执行故障数据。
下面通过表1示出的一种二维的任务表对本申请实施例中所涉及的任务表进行示例性说明。在该表中,纵向索引为任务标识,横向索引为所调用的钩子方法的名称。
表1
在表1中,任务标识为任务1的一批任务中,包括所示的两条故障数据,任务标识为任务2的另一批任务中包括所示的一条故障数据。其中,在任务标识为“任务1”的一批任务中包括两个任务;其中,每一行代表一个类型的任务,并使用统一的钩子方法的名称来进行标识;其中,每一行中的时间戳用以标识该类型的任务中,最新的任务的下发时间,也可以通过该时间戳来确定该行中是否有新任务。
在正常的故障注入过程中,需要执行的故障数据有很多,并且都被统一记录至任务表中。因此,如何查询任务表以确定是否要实施故障注入也是一个问题。下面针对本申请实施例如何确定目标故障注入任务进行说明。
在一个可选的实施例中,通过钩子方法与任务表参数进行匹配,包括下述确定步骤Sc1~Sc3。
Sc1,从任务表中确定与目标钩子方法关联的至少一条待注入的故障数据。
Sc2,将进程与每条待注入的故障数据所关联的进程进行匹配。
Sc3,若匹配成功,则将相应的待注入的故障数据确定为目标故障数据,并确定针对进程注入目标故障数据。
示例性的参考上述表1,根据钩子方法的标识确定关联的至少一项待注入的故障数据。如,钩子方法为open(),那么至少一项待注入的故障数据包括如下两条故障数据:
(1)进程标识:10099;错误码:400;文件路径:xx/xx;
(2)进程标识:10086;错误码:400;文件路径:xx/xx;延迟时间:15秒;
进一步地,进程的标识为“10099”,而“(1)”所示的进程标识为“10099”。经过匹配操作,“(1)”所示的故障数据为目标故障数据。
接下来,将根据“(1)”所示的故障数据执行故障注入。
可选的,可选的,在确定目标故障数据之后,缓存目标故障数据的定位信息,该定位信息可以包括:钩子方法的标识、任务标识和进程的标识。若再次调用目标方法时,可以根据该定位信息从任务表迅速定位目标故障数据。如针对“(1)”的定位信息具体如下所示。
进程标识为“10099”;任务标识为“任务1”;钩子方法的标识为“open()”。
若再次发起针对目标方法的调用,则根据任务标识为“任务1”、“open()”就可以从任务表中定位该故障数据“(1)”。
为了提高故障注入的效率,所替换的方法都是调用频次较高的库方法,如read()/write()/open()等库方法,此类方法的调用频次可达到几千次/秒。因此,若每次调用目标方法就去查询任务表,单位时间内要进行多次查询操作,该过程比较耗时。
在一个可选的实施例中,在执行确定步骤之前,还包括:
若缓存有与进程的标识和目标钩子方法相应的故障数据,将缓存的故障数据确定为目标故障数据,确定针对进程注入目标故障数据;若未缓存有与进程的标识和目标钩子方法相应的故障数据,或者与目标钩子方法所关联的故障数据有更新,则执行确定步骤Sc1~Sc3。
具体地,确定是否存在与进程的标识、目标钩子方法相应的定位信息。若确定存在该定位信息,则根据该定位信息从任务表中直接定位目标故障数据。
可选的,与目标钩子方法所关联的故障数据有更新,具体可以包括:
若缓存有与进程的标识和目标钩子方法相应的故障数据,以及与目标钩子方法所关联的故障数据有更新,则执行确定步骤Sc1~Sc3。
可选的,定位信息还可以包括创建该定位信息的创建时间戳。根据定位信息中的钩子方法查询该目标钩子方法在该任务表中所属类型相应的时间戳,如上述表1中的“t1”。判断定位信息中创建时间戳与相应的时间戳的大小。若创建时间戳大于或者等于相应的时间戳,则表示未更新;若创建时间戳小于相应的时间戳,则表示已更新。
由此可见,在目标钩子方法所关联的故障数据有更新时,才会去进行匹配操作,以得到目标故障数据。该方式显然比较节省时间,并且也比较适应当前每秒几千次的方法调用的场景。
金融核心业务系统的运行过程中,并不是每一次触发都会引起故障,而是存在一种故障率,故障时而发生,时而不发生,可以将这种模拟效果称作故障抖动率。
在一个可选的实施例中,注入目标故障数据,包括如下步骤:
若目标故障数据的注入故障率不为空,统计目标故障数据的实时故障率;若实时故障率小于目标故障数据的注入故障率,则注入目标故障数据。
可选的,每条故障数据还可以设置注入故障率,注入故障率的取值范围为0~100%。进一步地,每条故障数据还可以设置关于钩子方法的调用次数的统计,以及相应的故障数据的执行次数的统计,实时故障率为执行次数与调用次数的比值。
可选的,在实时故障率不小于目标故障数据的注入故障率时,可在钩子方法中设置预设步骤,该预设步骤为调用与目标方法相匹配的库方法。
示例性地,设置的注入故障率为60%。在第一次发起针对目标方法的调用时,统计当前的实时故障率为0%,则调用该钩子方法以便执行目标故障注入任务;在调用结束时的实时故障率为100%。在第二次发起针对目标方法的调用时,由于实时故障率为100%,因此需要放弃执行目标故障注入任务,转而获取目标方法所依赖动态库中的库方法的入口地址,并基于该入口地址实施对与目标方法相匹配的库方法的调用;在此次调用结束之后,实时故障率为50%。依次类推,在实时故障率未达到60%时,选择调用钩子方法以便实时故障注入;若实时故障率已达到60%,选择调用库方法,即不实施故障注入。
在金融核心业务系统的运行过程中,常常出现这样一种故障场景,故障并不是一开始就出现,而是运行到某个时刻出现,在持续一段时间之后,故障就消失。如,在某个时刻的断网所引起的网络故障。
在一个可选的实施例中,注入目标故障数据,具体可以包括如下步骤:
若目标故障数据的注入时效不为空,获取当前时间;目标注入时效由注入的开始时间和/或结束时间确定;若当前时间在目标故障数据的注入时效内,则注入目标故障数据的注入。
可选的,该注入时效可以由开始时间确定,或者结束时间确定,或者由开始时间和结束时间共同确定。
从预设的任务表中确定与钩子方法关联的目标故障数据之后,还可以判断当前时间戳是否在注入时效的范围内,若在,则向进程注入目标故障数据。若不在注入时效的范围内,可在钩子方法中设置预设步骤,该预设步骤为调用与目标方法相匹配的库方法。
在注入目标故障数据的过程中,还包括故障执行的统计,如何对执行结果进行统计,也是需要考虑的问题。
在一个可选的实施例中,在执行目标故障任务之后,还包括步骤S350。
步骤S350,获取注入目标故障数据的执行结果。
可选的,根据定位信息缓存该执行结果。其中,该执行结果可以为是否可以实施故障注入,如在考虑了注入时效、注入故障率之后,是否需要执行故障注入;是否完成故障注入,如是否收到运行过程中其他信息的影响。
可选的,可根据任务表中记录的执行结果向实验控制台进行反馈,以确定是否符合测试预期。
图5示出了一种基于环境变量的故障注入装置500。该装置500装置包括如下模块。
获取模块510,用于获取预设的任务表并将故障数据写入到任务表中,任务表缓存于共享内存中。
运行模块520,用于在进程运行过程中,基于环境变量优先加载钩子动态库,环境变量为系统环境变量,进程通过钩子方法与任务表参数进行匹配。
故障注入模块530,用于如果匹配成功则基于任务表执行故障注入;如果匹配不成功则不执行故障注入。
可选的,进程运行过程包括进程的启动过程和进程调用方法的过程;进程运行过程中,运行模块520在基于环境变量优先加载钩子动态库中,具体用于:
在进程的启动过程中,基于已配置钩子动态库的环境变量进行链接操作,以便于将进程中针对目标方法的调用定向至目标钩子方法,目标钩子方法为钩子动态库中与目标方法相匹配的钩子方法。
在进程调用方法的过程中,若进程调用目标方法,调用目标钩子方法。
其中,钩子动态库包括多个与进程的方法相匹配的钩子方法。
可选的,获取模块510在获取预设的任务表并将故障数据写入到任务表中,具体用于:
通过探针接收至少一条故障数据;每一故障数据关联一个钩子方法和至少一个其他进程;将接收的至少一条故障数据写入任务表中。
可选的,运行模块520在通过钩子方法与任务表参数进行匹配中,包括下述确定步骤:
从任务表中确定与目标钩子方法关联的至少一条待注入的故障数据;将进程与每条待注入的故障数据所关联的进程进行匹配;若匹配成功,则将相应的待注入的故障数据确定为目标故障数据,并确定针对进程注入目标故障数据。
可选的,运行模块520在执行确定步骤之前,还可以用于:
若缓存有与进程的标识和目标钩子方法相应的故障数据,将缓存的故障数据确定为目标故障数据,确定针对进程注入目标故障数据;若未缓存有与进程的标识和目标钩子方法相应的故障数据,或者与目标钩子方法所关联的故障数据有更新,则执行确定步骤。
可选的,运行模块520在注入目标故障数据中,具体用于:
若目标故障数据的注入故障率不为空,统计目标故障数据的实时故障率;若实时故障率小于目标故障数据的注入故障率,则注入目标故障数据。
可选的,运行模块520在注入目标故障数据中,具体用于:
若目标故障数据的注入时效不为空,获取当前时间;目标注入时效由注入的开始时间和/或结束时间确定;若当前时间在目标故障数据的注入时效内,则注入目标故障数据。
本申请实施例的装置可执行本申请实施例所提供的方法,其实现原理相类似,本申请各实施例的装置中的各模块所执行的动作是与本申请各实施例的方法中的步骤相对应的,对于装置的各模块的详细功能描述具体可以参见前文中所示的对应方法中的描述,此处不再赘述。
本申请实施例中提供了一种电子设备,包括存储器、处理器及存储在存储器上的计算机程序,该处理器执行上述计算机程序以实现一种基于环境变量的故障注入方法的步骤,与相关技术相比:实现了对业务应用注入各类故障的目的,从而实现对关联多个业务应用的金融核心业务系统的健壮性和高可用性测试。。
在一个可选实施例中提供了一种电子设备,如图6所示,图6所示的电子设备6000包括:处理器6001和存储器6003。其中,处理器6001和存储器6003相连,如通过总线6002相连。可选的,电子设备6000还可以包括收发器6004,收发器6004可以用于该电子设备与其他电子设备之间的数据交互,如数据的发送和/或数据的接收等。需要说明的是,实际应用中收发器6004不限于一个,该电子设备6000的结构并不构成对本申请实施例的限定。
处理器6001可以是CPU(Central Processing Unit,中央处理器),通用处理器,DSP(Digital Signal Processor,数据信号处理器),ASIC(Application SpecificIntegrated Circuit,专用集成电路),FPGA(Field Programmable Gate Array,现场可编程门阵列)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器6001也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,DSP和微处理器的组合等。
总线6002可包括一通路,在上述组件之间传送信息。总线6002可以是PCI(Peripheral Component Interconnect,外设部件互连标准)总线或EISA(ExtendedIndustry Standard Architecture,扩展工业标准结构)总线等。总线6002可以分为地址总线、数据总线、控制总线等。为便于表示,图6中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
存储器6003可以是ROM(Read Only Memory,只读存储器)或可存储静态信息和指令的其他类型的静态存储设备,RAM(Random Access Memory,随机存取存储器)或者可存储信息和指令的其他类型的动态存储设备,也可以是EEPROM(Electrically ErasableProgrammable Read Only Memory,电可擦可编程只读存储器)、CD-ROM(Compact DiscRead Only Memory,只读光盘)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质、其他磁存储设备、或者能够用于携带或存储计算机程序并能够由计算机读取的任何其他介质,在此不做限定。
存储器6003用于存储执行本申请实施例的计算机程序,并由处理器6001来控制执行。处理器6001用于执行存储器6003中存储的计算机程序,以实现前述方法实施例所示的步骤。
其中,电子设备包括但不限于:服务器。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”、“1”、“2”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除图示或文字描述以外的顺序实施。
应该理解的是,虽然本申请实施例的流程图中通过箭头指示各个操作步骤,但是这些步骤的实施顺序并不受限于箭头所指示的顺序。除非本文中有明确的说明,否则在本申请实施例的一些实施场景中,各流程图中的实施步骤可以按照需求以其他的顺序执行。此外,各流程图中的部分或全部步骤基于实际的实施场景,可以包括多个子步骤或者多个阶段。这些子步骤或者阶段中的部分或全部可以在同一时刻被执行,这些子步骤或者阶段中的每个子步骤或者阶段也可以分别在不同的时刻被执行。在执行时刻不同的场景下,这些子步骤或者阶段的执行顺序可以根据需求灵活配置,本申请实施例对此不限制。
以上所述仅是本申请部分实施场景的可选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请的方案技术构思的前提下,采用基于本申请技术思想的其他类似实施手段,同样属于本申请实施例的保护范畴。
Claims (7)
1.一种基于环境变量的故障注入方法,其特征在于,所述方法包括:
获取预设的任务表并将故障数据写入到任务表中,所述任务表缓存于共享内存中;
在进程的启动过程中,若未缓存有与所述进程的标识和目标钩子方法相应的故障数据,或者与所述目标钩子方法所关联的故障数据有更新,从所述任务表中确定与目标钩子方法关联的至少一条待注入的故障数据;将所述进程与每条待注入的故障数据所关联的进程进行匹配;若匹配成功,则将相应的待注入的故障数据确定为目标故障数据,并确定针对所述进程注入所述目标故障数据;基于已配置钩子动态库的环境变量进行链接操作,以便于将所述进程中针对目标方法的调用定向至目标钩子方法,所述目标钩子方法为所述钩子动态库中与所述目标方法相匹配的钩子方法;
在所述进程调用方法的过程中,若所述进程调用所述目标方法,调用所述目标钩子方法,所述环境变量为系统环境变量,所述进程通过钩子方法与任务表参数进行匹配;
如果匹配成功则基于所述任务表对应故障执行故障注入;
如果匹配不成功则不执行故障注入。
2.根据权利要求1所述的方法,其特征在于,所述获取预设的任务表并将故障数据写入到任务表中,包括:
通过探针接收至少一条故障数据;每一所述故障数据关联一个钩子方法和至少一个其他进程;
将所述接收的所述至少一条故障数据写入所述任务表中。
3.根据权利要求1所述的方法,其特征在于,从所述任务表中确定与目标钩子方法关联的至少一条待注入的故障数据,之前还包括:
若缓存有与进程的标识和所述目标钩子方法相应的故障数据,将缓存的故障数据确定为目标故障数据,确定针对所述进程注入所述目标故障数据。
4.根据权利要求1或3所述的方法,其特征在于,所述注入所述目标故障数据,包括:
若所述目标故障数据的注入故障率不为空,统计所述目标故障数据的实时故障率;
若所述实时故障率小于所述目标故障数据的注入故障率,则注入所述目标故障数据。
5.根据权利要求1或3所述的方法,其特征在于,所述注入所述目标故障数据,包括:
若所述目标故障数据的注入时效不为空,获取当前时间;所述注入时效由注入的开始时间和/或结束时间确定;
若所述当前时间在所述目标故障数据的注入时效内,则注入所述目标故障数据。
6.一种基于环境变量的故障注入装置,其特征在于,所述装置包括:
获取模块,用于获取预设的任务表并将故障数据写入到任务表中,所述任务表缓存于共享内存中;
运行模块,用于在进程的启动过程中,若未缓存有与所述进程的标识和目标钩子方法相应的故障数据,或者与所述目标钩子方法所关联的故障数据有更新,从所述任务表中确定与目标钩子方法关联的至少一条待注入的故障数据;将所述进程与每条待注入的故障数据所关联的进程进行匹配;若匹配成功,则将相应的待注入的故障数据确定为目标故障数据,并确定针对所述进程注入所述目标故障数据;基于已配置钩子动态库的环境变量进行链接操作,以便于将所述进程中针对目标方法的调用定向至目标钩子方法,所述目标钩子方法为所述钩子动态库中与所述目标方法相匹配的钩子方法;
运行模块,用于在所述进程调用方法的过程中,若所述进程调用所述目标方法,调用所述目标钩子方法,所述环境变量为系统环境变量,所述进程通过钩子方法与任务表参数进行匹配;
故障注入模块,用于如果匹配成功则基于所述任务表对应故障执行故障注入;如果匹配不成功则不执行故障注入。
7.一种电子设备,包括存储器、处理器及存储在存储器上的计算机程序,其特征在于,所述处理器执行所述计算机程序以实现权利要求1-5任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211236617.4A CN115757088B (zh) | 2022-10-10 | 2022-10-10 | 基于环境变量的故障注入方法、装置和设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211236617.4A CN115757088B (zh) | 2022-10-10 | 2022-10-10 | 基于环境变量的故障注入方法、装置和设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115757088A CN115757088A (zh) | 2023-03-07 |
CN115757088B true CN115757088B (zh) | 2023-10-20 |
Family
ID=85351052
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211236617.4A Active CN115757088B (zh) | 2022-10-10 | 2022-10-10 | 基于环境变量的故障注入方法、装置和设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115757088B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102354298A (zh) * | 2011-07-27 | 2012-02-15 | 哈尔滨工业大学 | 基于staf的高端容错机故障注入自动化测试平台及方法 |
CN111651353A (zh) * | 2020-05-29 | 2020-09-11 | 北京百度网讯科技有限公司 | 故障注入的方法、装置、电子设备和存储介质 |
CN111831569A (zh) * | 2020-07-22 | 2020-10-27 | 平安普惠企业管理有限公司 | 基于故障注入的测试方法、装置、计算机设备和存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9842045B2 (en) * | 2016-02-19 | 2017-12-12 | International Business Machines Corporation | Failure recovery testing framework for microservice-based applications |
-
2022
- 2022-10-10 CN CN202211236617.4A patent/CN115757088B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102354298A (zh) * | 2011-07-27 | 2012-02-15 | 哈尔滨工业大学 | 基于staf的高端容错机故障注入自动化测试平台及方法 |
CN111651353A (zh) * | 2020-05-29 | 2020-09-11 | 北京百度网讯科技有限公司 | 故障注入的方法、装置、电子设备和存储介质 |
CN111831569A (zh) * | 2020-07-22 | 2020-10-27 | 平安普惠企业管理有限公司 | 基于故障注入的测试方法、装置、计算机设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN115757088A (zh) | 2023-03-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107273286B (zh) | 针对任务应用的场景自动化测试平台及方法 | |
CN108845940B (zh) | 一种企业级信息系统自动化功能测试方法和系统 | |
CN112631846A (zh) | 一种故障演练方法、装置、计算机设备及存储介质 | |
US20200133711A1 (en) | Event-Triggered Configuration of Workflow Processes for Computer Software Development Systems | |
CN111399840B (zh) | 一种模块开发方法及装置 | |
CN110532182B (zh) | 一种虚拟化平台的自动化测试方法及装置 | |
CN110928777B (zh) | 测试用例的处理方法、装置、设备及存储介质 | |
CN115454869A (zh) | 界面自动化测试方法、装置、设备及存储介质 | |
CN112765032A (zh) | 程序调试方法、装置、设备及存储介质 | |
CN111966760A (zh) | 基于Hive数据仓库的测试数据生成方法及装置 | |
CN111881041A (zh) | 前端应用测试方法、装置、终端设备及存储介质 | |
CN116257438A (zh) | 接口测试用例的更新方法及相关设备 | |
CN113742215B (zh) | 一种自动配置和调用测试工具进行测试分析的方法及系统 | |
CN114609995A (zh) | 故障控制方法、装置、系统、设备、介质及产品 | |
CN115757088B (zh) | 基于环境变量的故障注入方法、装置和设备 | |
CN110968339B (zh) | 前端构建工具的方法、装置以及电子设备 | |
CN115729724B (zh) | 故障注入方法、故障测试系统、电子设备及可读存储介质 | |
CN117270864A (zh) | 代码编译方法、装置、设备及存储介质 | |
CN116097226A (zh) | 用于将故障注入分布式系统的装置和方法 | |
CN115470141A (zh) | 一种故障模拟方法、装置及相关设备 | |
CN114791884A (zh) | 测试环境的构建方法、装置、存储介质及电子设备 | |
CN114416545A (zh) | 确定测试代码覆盖率的方法、装置和电子设备 | |
CN113031960B (zh) | 代码编译方法、装置、服务器及存储介质 | |
CN118276866A (zh) | 编译配置方法、编译方法、电子设备及可读存储介质 | |
CN114185555A (zh) | 一种服务器部署的方法、装置及电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |