ChaosBlade 发布对 C++ 应用混沌实验的支持

前言

为满足 C++ 应用系统故障演练,阿里妈妈安全生产团队开源了 C++ 混沌实验执行器,填补了 C++ 应用混沌工程实验的空白,其遵循《混沌实验模型》,可通过 ChaosBlade 工具直接执行。项目详情点击这里! 。

本文重点介绍该执行器的架构图、支持的实验场景,并以 Demo 为例介绍具体的使用方式,附录介绍了阿里妈妈内部混沌实验流程。

新版本 chaosblade 下载地址在这里!

实验场景

目前支持的 C++ 混沌实验场景如下,具体使用方式可详见下文:

  • 针对某个方法,或者某行代码注入延迟故障;
  • 针对某个方法,或者某行代码注入替换变量,或者对象值,可以制造调用第三方接口返回结果中包含错误码等等故障;
  • 针对某个方法,或者某行代码注入立刻退出方法并返回指定值(可以是错误值)的故障;

架构图


解释说明:

  • C++ 混沌实验执行器包括 8 个模块:模型匹配器模块、应用状态获取模块、流程控制模块、在应用运行中注入故障模块、应用未启动状态启动应用并注入故障模块、故障恢复模块、卸载实验器模块 和 日志记录模块;
  • 模型匹配器模块:会把用户传入的参数匹配《混沌实验模型》,发现不符合规范的参数,将停止执行,并返回用户相应提示;
  • 应用状态获取模块:获取待注入故障的 C++ 应用目前的状态;
  • 流程控制模块:可以控制整个实验器的运行流程;
  • 在应用运行中注入故障模块:在 C++ 应用运行状态时,在不改变应用原有代码,和编译文件的情况下,直接注入故障到进程;
  • 应用未启动状态启动应用并注入故障模块:在 C++ 应用未启动状态,在不改变应用原有代码,和编译文件的情况下,启动应用,并同时注入故障;
  • 故障恢复模块:当某一个实验或演练场景完成,基于该模块移除该场景的故障;
  • 卸载实验器模块:当所有实验或演练场景都完成,基于该模块移除应用所有故障,并退出 C++ 混沌实验执行器的进程;
  • 日志记录模块:可以把 C++ 混沌实验执行器运行过程中的情况记录到日志中;
  • C++ 应用:待注入故障的应用,在故障注入过程中,C++ 混沌实验执行器通过 attach 方式把 C++ 应用做为自己的子进程进行状态跟踪;
  • ChaosBlade:混沌实验注入工具;

使用方法

可以通过如下三种方式对 C++ 应用注入故障:

  • 登录待注入故障的机器,使用 chaosblade 提供的命令行方式实施演练;
  • 登录待注入故障的机器,手动启动 C++ 应用混沌实验执行器,直接调用执行器提供的 api 实施演练;
  • 通过混沌实验平台,可以很方便的对多台机器,甚至整个分组集群同时注入故障,阿里云 AHAS 后续会支持此执行器;

接下来,通过一个 C++ 应用混沌实验 DEMO 给大家介绍前两种方式怎样实现一次 C++ 应用的混沌实验。

C++ 应用混沌实验DEMO

这次实验,我们演练 linux 系统下 C++ 实现的 socket server 应用和 socket client 应用通讯的过程中,socket server 接口延迟 3 秒。接下来我们下载所需要的 Socket Demo:
Socket-server.tar.gz下载地址,详情参考这里!

下载完成后,解压并编译:

g++ -g -c tcp_server.cpp -o tcp_server.o
g++ -g tcp_server.o main.cpp -I. -o server

Socket-client.tar.gz下载地址,详情参考这里!

下载完成后,解压并编译:

g++ -g -c tcp_client.cpp -o tcp_client.o
g++ -g tcp_client.o main.cpp -I. -o client

启动 socket server:

./server 9527

启动 socket client:

./client 127.0.0.1 9527

启动成功以后会提示:"send message to server"

接下来输入想传给 socket server 内容比如:666

socket server 应用收到消息以后提示:

Received a connection from 127.0.0.1

Received message: 666
完成以上步骤表示 socket server 应用和 socket client 应用部署成功。

通过 chaosblade 的命令行方式实施演练
接下来我们要使用 blade 工具进行混沌实验,在执行实验前,我们需要先执行 prepare 命令,挂载所需要的 c++ agent:

./blade prepare cplus --port 8370 --wait-time 10

返回以下结果,表示实验准备成功:

{"code":200,"success":true,"result":"e669d57f079a00cc"}

我们开始实施混沌实验,调用 socket server 接口延迟 3 秒,我们执行以下命令:

./blade create cplus delay --delayDuration 3 --breakLine tcp_server.cpp:33 --fileLocateAndName /home/admin/socketServer/server --forkMode child --processName server --initParams 9527 --libLoad /home/lib

返回以下结果,表示执行成功;

{"code":200,"success":true,"result":"ec695fee1e458fc6"}

对实施实验的命令进行解析:

  • --delayDuration: 3,表示延迟 3 s;单位是 s (delay action 特有的过滤条件)
  • --breakLine: tcp_server.cpp:33, 加入断点的位置,可以是某一行,也可以是某个方法名 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --fileLocateAndName: /home/admin/socketServer/server,C++应用可执行文件的位置和名字 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --forkMode: child,表示我们把故障注入到子进程还是父进程 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --processName: server,可以唯一标识出C++应用进程的标识,比如进程名 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --initParams: 9527,C++ 进程正常启动的时候,启动命令中执行文件后面的参数 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --libLoad: /home/lib,如果启动C++ 进程的时候如果需要设置类库文件夹地址,可以在这里设置(比如 /home/lib),如果启动时,不需要加载自定义类库,该项可以填入空格 (对应混沌实验模型的 Matcher:实验规则匹配器)

完成实验后,可以执行如下命令停止当前延迟的混沌实验:

./blade destroy ec695fee1e458fc6

ec695fee1e458fc6 是之前创建实验返回的 UID

注:接收到 destroy 请求后,会删除与 UID 相对应的混沌实验规则。

不尽兴的话,我们再实施对 server 内部变量的修改,把 server 对外开放的监听端口 9527 改成 9529。

和刚才延迟命令参数差不多,因为相同的参数是演练 C++ 应用所需要的,不同的是没有了 --delayDuration,多了个 --varaibleName 和 --varaibleValue 参数。我们模拟调用刚才的服务对外开放的监听端口 9527 改成 9529:

./blade c cplus modify --varaibleName listen_port --varaibleValue 9529 --breakLine tcp_server.cpp:11 --fileLocateAndName /home/admin/socketServer/server --forkMode child --processName server --initParams 9527 --libLoad /home/lib

返回以下结果,并在 socket client 可验证端口是否被修改。

{"code":200,"success":true,"result":"09dd96f4c062df69"}

停止此次试验:

./blade destroy 09dd96f4c062df69

最后,我们撤销刚才的实验准备,即卸载 c++ Agent:

./blade revoke e669d57f079a00cc

直接调用执行器提供的 api 实施演练
挂载所需要的 c++ agent:

nohup java -jar chaosblade-exec-cplus.jar --server.port=8703 --script.location=/home/staragent/plugins/monkeyking/chaosblade/lib/cplus/ &

开始故障注入,发送 url 请求:

chaosblade/create?suid=e669d57f079a00cc&target=cplus&action=delay&breakLine=tcp_server.cpp:33&fileLocateAndName=/home/admin/socketServer/server&forkMode=child&processName=server&delayDuration=3&initParams=9527&libLoad=

其中请求参数为

{"suid": "e669d57f079a00cc","target": "cplus","action": "delay","breakLine": "tcp_server.cpp:33","fileLocateAndName": "/home/admin/socketServer/server","forkMode": "child","processName": "server","delayDuration": “3”,"initParams": "9527","libLoad": ""
}

这种方式增加了几个参数,解析如下:

create: 创建混沌实验请求

suid: 请求参数,实验的 ID,后续停止实验会用到此 ID

target: 请求参数,实验的组件目标,cplus 代表 针对 C++ 应用的实验

action: 请求参数,执行实验的场景,delay

注:

suid、target、action 是 create 请求的必要参数, breakLine、fileLocateAndName、forkMode、processName、delayDuration、initParams、libLoad 参数根据 target 和 action 的不同而不同。

接收到请求,会根据 target 和 action 调用参数校验器,验证参数值是否合法,如果合法,则记录此次试验;

对应组件埋点触发时,如果查询到有此组件的实验,则获取匹配器所需参数,和下发的实验规则进行匹配,匹配成功,则调用场景执行器触发实验。

停止此次试验,通过发url 请求:chaosblade/destroy?suid=ec695fee1e458fc6

其中请求参数是:

{"suid": "ec695fee1e458fc6"
}

suid: 请求参数,之前创建实验返回的 UID

最后,我们撤销刚才的实验准备,即卸载 c++ Agent,通过发url 请求:chaosblade/remove

后续规划

后续会加入更多混沌实验场景,也欢迎大家试用,提 issue、pr,star, 一起交流、探索和完善。

chaosblade github 地址点击这里!

github 地址点击这里!

附录

实验流程 & 原理


解释说明:

以上流程中,在实际的故障模拟演练,或突袭演练中,实验准备阶段,故障注入阶段,故障恢复阶段 和 实验器卸载阶段,为故障注入方(或蓝军)操作,故障效果采集监控项有效性验证,故障处置阶段为故障模拟成功以后,故障注入方(或蓝军)确认故障注入效果,也是故障处置方(或红军)接收报警,定位,并处置故障的阶段;

实验执行器底层基于 GDB 实现,故障注入阶段有提到启动 gdb 一步。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

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

相关文章

TortoiseGitPlink提示输入密码解决方法

文章目录一、现象二 、解决方法2.1. 打开TortoiseGit 下的puttygen工具2.2. 点击load,加载私钥2.3. 生成一个新的私钥2.4. 项目拉取2.5. 配置新的私钥一、现象 二 、解决方法 2.1. 打开TortoiseGit 下的puttygen工具 双击D:\software\TortoiseGit\bin下面的puttyg…

引领高并发直播场景进入毫秒时代,阿里云发布超低延时直播服务

近日,阿里云上线超低延时直播服务RTS(Real-time Streaming),该服务在视频直播产品的基础上,进行全链路延时监控、传输协议改造等底层技术优化,支持千万级并发场景下的毫秒级延迟直播能力,保障低…

JavaScript-面向对象 class 继承

class继承 class 关键字是在ES6引入的 ES6之前的写法: function Student(name) {this.name name } // 给Student新增一个方法 Student.prototype.hello function () {alert(Hello) }ES6的写法: // 定义一个 学生的 类 class Student1{constructor(…

我26岁,月薪一万,刚实现“黄焖鸡自由”(苦笑)

今天是CSDN微信公众号千万粉丝达成的日子,因此,“千万粉丝狂欢节”来了!第一弹超值福利来袭,前方高能:「粉丝节限定版一卡通」重磅上线!可看该大牛老师全部课程!课程涵盖热门的Java、Python和AI…

Android侧滑原来可以这么优雅

前言 侧滑手势在Android App应用得非常广泛,常见的使用场景包括:滑动抽屉、侧滑删除、侧滑返回、下拉刷新以及侧滑封面等。由于这些使用场景实在是太通用了,各路大神们八仙过海各显神通,每种侧滑场景都开源出了很多非常实用的框架…

TortoiseGit状态图标不能正常显示的解决办法

文章目录一. 运行环境一、方案11.1. 右键点击桌面空白处,打开TortoiseGit的Settings1.2. 修改Icon Overlays的Status cache1.3. 重启电脑,你就会发现你的小乌龟箭头出来了。二、方案2一. 运行环境 版本说明Windows 10 64bit操作系统TortoiseGit-2.12.0.…

平头哥广发英雄帖,公开首款CPU“玄铁”仿真代码

“在自研芯片的路上,阿里走出了万里长征的第一步。” 7月25日,阿里云峰会上海站,压轴出场的平头哥,交出了时隔10月的首份答卷:玄铁910(XuanTie910),目前业界性能最强的RISC-V处理器…

JavaScript-操作BOM对象

BOM(Browser Object Model): 浏览器对象模型 浏览器介绍 JavaScript 和 浏览器关系? JavaScript 诞生就是为了能够让他在浏览器中运行! 内核: IE 6~11ChromeSafariFireFox 第三方浏览器(可以换上面的内核…

一文带你认识keepalived,再带你通关LVS+Keepalived!

来源 | 故事凌责编 | Carol封图 | CSDN 下载于视觉中国昨天我们讲到《那些你不知道的 LVS 秘密》,今天我们就继续一起来进行 LVS 更深的探索,来一起通关 LVSKeepalived吧!keepalivedkeepalive的学习参考网站:https://www.keepali…

手把手教你D2C,走向前端智能化

这几年来 AI 来势汹汹,在部分领域应用也逐渐成熟。前端发展至今,我们也有许多成熟的前端解决方案代码,有大量的设计稿,我们是否能够结合智能化的能力将一个 Design 变成一个 Code (设计转代码,简称 D2C&…

TortoiseGit 冲突和解决方案_入门试炼_07

文章目录一、张三操作1. 张三新增hello.java2. 提交本地仓库3. 更新项目4. 将本地仓库变动文件提交远程二、李四操作2.1. 编辑Hello.java2.2. 提交三、张三操作23.1. 在hello.java中添加内容3.2. 提交本地仓库3.3. 更新项目至最新版本3.4. 更新最版本异常(冲突&…

如何低成本实现Flutter富文本,看这一篇就够了!

作者:闲鱼技术-玄川 背景 闲鱼是国内最早使用Flutter 的团队,作为一个电商App商品详情页是非常重要场景,其中最主要的技术能力是文字混排。 我们面对文本类的需求是复杂而且多变,然而Flutter历史的几个版本,Text只能…

赋能零售成长型企业营销增长,云徙「数盈·新营销中台」发布

巨石崩裂时,有人看见了恐惧,有人看见了光。 因为有光,万物生长。 疫情给每个企业的影响都是巨大的。但在疫情冲击之下,由中台技术推动企业数字化转型,又给企业带来了希望。 从2016年创业至今,云徙科技的每…

TortoiseGit 下载、安装、配置_入门试炼_01

TortoiseGit 简介: TortoiseGit 简称 tgit, 中文名海龟Git。TortoiseGit是一个开放的GIT版本控制系统的源客户端。 文章目录一、软件下载1.1. 下载安装Git1.2. Tortoisegit二、安装流程2.1. 双击安装程序2.2. 直接点击下一步(Next)2.3. Next2.4. 选择安装目录2.5. 点…

ArchSummit分享 | 高德地图App架构演化与实践

讲师介绍 郝仁杰,高德地图无线开发专家。在7月13日落幕的2019年ArchSummit峰会上就高德地图近几年的App架构演化和实践进行了分享。 背景概述 高德是国内领先的数字地图内容、导航和位置服务解决方案提供商,端上分手机和车机两条主线。近年来&#xf…

工程师的灵魂拷问:你的密钥安全吗?

阿里妹导读:密钥管理是密码学应用的核心问题之一。任何涉及加密/签名的应用,无论算法本身机制多么安全,最终都会受到灵魂拷问:你密钥存在哪儿?本文实现了一种安全的密钥管理方案,基于安全多方计算技术&…

优化算法2D可视化的补充

4. 分析上图,说明原理(选做) 1、为什么SGD会走“之字形”?其它算法为什么会比较平滑? 之所以会走"之字形",是因为它在每次更新参数时只考虑当前的样本梯度。这导致参数更新非常不稳定&#xff0c…

TortoiseGit 本地仓库和远程仓库建立联系_入门试炼_02

TortoiseGit 简介: TortoiseGit 简称 tgit, 中文名海龟Git。TortoiseGit是一个开放的GIT版本控制系统的源客户端。 文章目录一、前提准备1.1. 生成秘钥和公钥1.2. 把 SSH Key 填到Git 服务器的配置中一、前提准备 声明:此处介绍通过SSH URL方式传输&…

来自 Spring Cloud 官方的消息,Spring Cloud Alibaba 即将毕业

2019 年 7 月 24 日晚,Spring Cloud 官方发布公告: 仓库迁移是官方决定Spring Cloud Alibaba 即将毕业 根据官方最新的发版规则,我们会把孵化器中的 Spring Cloud Alibaba 仓库迁移回 Alibaba 官方仓库,进行正式的毕业发布&#…

TortoiseGit 克隆_入门试炼_03

文章目录一、 Git克隆1.1. 右击选择Git克隆1.2. 输入URL1.3. 提示输入密码一、 Git克隆 1.1. 右击选择Git克隆 在本地文件夹的空白位置处,右击鼠标,在菜单中选择【Git克隆】: 1.2. 输入URL 标签说明URL是git项目地址,简言之后…