日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發(fā)布時(shí)間:2024/8/23 c/c++ 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ChaosBlade 发布对 C++ 应用混沌实验的支持 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

為滿足 C++ 應(yīng)用系統(tǒng)故障演練,阿里媽媽安全生產(chǎn)團(tuán)隊(duì)開源了 C++ 混沌實(shí)驗(yàn)執(zhí)行器,填補(bǔ)了 C++ 應(yīng)用混沌工程實(shí)驗(yàn)的空白,其遵循《混沌實(shí)驗(yàn)?zāi)P汀?#xff0c;可通過 ChaosBlade 工具直接執(zhí)行。項(xiàng)目詳情點(diǎn)擊這里! 。

本文重點(diǎn)介紹該執(zhí)行器的架構(gòu)圖、支持的實(shí)驗(yàn)場景,并以 Demo 為例介紹具體的使用方式,附錄介紹了阿里媽媽內(nèi)部混沌實(shí)驗(yàn)流程。

新版本 chaosblade 下載地址在這里!

實(shí)驗(yàn)場景

目前支持的 C++ 混沌實(shí)驗(yàn)場景如下,具體使用方式可詳見下文:

  • 針對某個(gè)方法,或者某行代碼注入延遲故障;
  • 針對某個(gè)方法,或者某行代碼注入替換變量,或者對象值,可以制造調(diào)用第三方接口返回結(jié)果中包含錯(cuò)誤碼等等故障;
  • 針對某個(gè)方法,或者某行代碼注入立刻退出方法并返回指定值(可以是錯(cuò)誤值)的故障;

架構(gòu)圖


解釋說明:

  • C++ 混沌實(shí)驗(yàn)執(zhí)行器包括 8 個(gè)模塊:模型匹配器模塊、應(yīng)用狀態(tài)獲取模塊、流程控制模塊、在應(yīng)用運(yùn)行中注入故障模塊、應(yīng)用未啟動(dòng)狀態(tài)啟動(dòng)應(yīng)用并注入故障模塊、故障恢復(fù)模塊、卸載實(shí)驗(yàn)器模塊 和 日志記錄模塊;
  • 模型匹配器模塊:會(huì)把用戶傳入的參數(shù)匹配《混沌實(shí)驗(yàn)?zāi)P汀?#xff0c;發(fā)現(xiàn)不符合規(guī)范的參數(shù),將停止執(zhí)行,并返回用戶相應(yīng)提示;
  • 應(yīng)用狀態(tài)獲取模塊:獲取待注入故障的 C++ 應(yīng)用目前的狀態(tài);
  • 流程控制模塊:可以控制整個(gè)實(shí)驗(yàn)器的運(yùn)行流程;
  • 在應(yīng)用運(yùn)行中注入故障模塊:在 C++ 應(yīng)用運(yùn)行狀態(tài)時(shí),在不改變應(yīng)用原有代碼,和編譯文件的情況下,直接注入故障到進(jìn)程;
  • 應(yīng)用未啟動(dòng)狀態(tài)啟動(dòng)應(yīng)用并注入故障模塊:在 C++ 應(yīng)用未啟動(dòng)狀態(tài),在不改變應(yīng)用原有代碼,和編譯文件的情況下,啟動(dòng)應(yīng)用,并同時(shí)注入故障;
  • 故障恢復(fù)模塊:當(dāng)某一個(gè)實(shí)驗(yàn)或演練場景完成,基于該模塊移除該場景的故障;
  • 卸載實(shí)驗(yàn)器模塊:當(dāng)所有實(shí)驗(yàn)或演練場景都完成,基于該模塊移除應(yīng)用所有故障,并退出 C++ 混沌實(shí)驗(yàn)執(zhí)行器的進(jìn)程;
  • 日志記錄模塊:可以把 C++ 混沌實(shí)驗(yàn)執(zhí)行器運(yùn)行過程中的情況記錄到日志中;
  • C++ 應(yīng)用:待注入故障的應(yīng)用,在故障注入過程中,C++ 混沌實(shí)驗(yàn)執(zhí)行器通過 attach 方式把 C++ 應(yīng)用做為自己的子進(jìn)程進(jìn)行狀態(tài)跟蹤;
  • ChaosBlade:混沌實(shí)驗(yàn)注入工具;

使用方法

可以通過如下三種方式對 C++ 應(yīng)用注入故障:

  • 登錄待注入故障的機(jī)器,使用 chaosblade 提供的命令行方式實(shí)施演練;
  • 登錄待注入故障的機(jī)器,手動(dòng)啟動(dòng) C++ 應(yīng)用混沌實(shí)驗(yàn)執(zhí)行器,直接調(diào)用執(zhí)行器提供的 api 實(shí)施演練;
  • 通過混沌實(shí)驗(yàn)平臺(tái),可以很方便的對多臺(tái)機(jī)器,甚至整個(gè)分組集群同時(shí)注入故障,阿里云 AHAS 后續(xù)會(huì)支持此執(zhí)行器;

接下來,通過一個(gè) C++ 應(yīng)用混沌實(shí)驗(yàn) DEMO 給大家介紹前兩種方式怎樣實(shí)現(xiàn)一次 C++ 應(yīng)用的混沌實(shí)驗(yàn)。

C++ 應(yīng)用混沌實(shí)驗(yàn)DEMO

這次實(shí)驗(yàn),我們演練 linux 系統(tǒng)下 C++ 實(shí)現(xiàn)的 socket server 應(yīng)用和 socket client 應(yīng)用通訊的過程中,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

啟動(dòng) socket server:

./server 9527

啟動(dòng) socket client:

./client 127.0.0.1 9527

啟動(dòng)成功以后會(huì)提示:"send message to server"

接下來輸入想傳給 socket server 內(nèi)容比如:666

socket server 應(yīng)用收到消息以后提示:

Received a connection from 127.0.0.1

Received message: 666
完成以上步驟表示 socket server 應(yīng)用和 socket client 應(yīng)用部署成功。

通過 chaosblade 的命令行方式實(shí)施演練
接下來我們要使用 blade 工具進(jìn)行混沌實(shí)驗(yàn),在執(zhí)行實(shí)驗(yàn)前,我們需要先執(zhí)行 prepare 命令,掛載所需要的 c++ agent:

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

返回以下結(jié)果,表示實(shí)驗(yàn)準(zhǔn)備成功:

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

我們開始實(shí)施混沌實(shí)驗(yàn),調(diào)用 socket server 接口延遲 3 秒,我們執(zhí)行以下命令:

./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

返回以下結(jié)果,表示執(zhí)行成功;

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

對實(shí)施實(shí)驗(yàn)的命令進(jìn)行解析:

  • --delayDuration: 3,表示延遲 3 s;單位是 s (delay action 特有的過濾條件)
  • --breakLine: tcp_server.cpp:33, 加入斷點(diǎn)的位置,可以是某一行,也可以是某個(gè)方法名 (對應(yīng)混沌實(shí)驗(yàn)?zāi)P偷?Matcher:實(shí)驗(yàn)規(guī)則匹配器)
  • --fileLocateAndName: /home/admin/socketServer/server,C++應(yīng)用可執(zhí)行文件的位置和名字 (對應(yīng)混沌實(shí)驗(yàn)?zāi)P偷?Matcher:實(shí)驗(yàn)規(guī)則匹配器)
  • --forkMode: child,表示我們把故障注入到子進(jìn)程還是父進(jìn)程 (對應(yīng)混沌實(shí)驗(yàn)?zāi)P偷?Matcher:實(shí)驗(yàn)規(guī)則匹配器)
  • --processName: server,可以唯一標(biāo)識(shí)出C++應(yīng)用進(jìn)程的標(biāo)識(shí),比如進(jìn)程名 (對應(yīng)混沌實(shí)驗(yàn)?zāi)P偷?Matcher:實(shí)驗(yàn)規(guī)則匹配器)
  • --initParams: 9527,C++ 進(jìn)程正常啟動(dòng)的時(shí)候,啟動(dòng)命令中執(zhí)行文件后面的參數(shù) (對應(yīng)混沌實(shí)驗(yàn)?zāi)P偷?Matcher:實(shí)驗(yàn)規(guī)則匹配器)
  • --libLoad: /home/lib,如果啟動(dòng)C++ 進(jìn)程的時(shí)候如果需要設(shè)置類庫文件夾地址,可以在這里設(shè)置(比如 /home/lib),如果啟動(dòng)時(shí),不需要加載自定義類庫,該項(xiàng)可以填入空格 (對應(yīng)混沌實(shí)驗(yàn)?zāi)P偷?Matcher:實(shí)驗(yàn)規(guī)則匹配器)

完成實(shí)驗(yàn)后,可以執(zhí)行如下命令停止當(dāng)前延遲的混沌實(shí)驗(yàn):

./blade destroy ec695fee1e458fc6

ec695fee1e458fc6 是之前創(chuàng)建實(shí)驗(yàn)返回的 UID

注:接收到 destroy 請求后,會(huì)刪除與 UID 相對應(yīng)的混沌實(shí)驗(yàn)規(guī)則。

不盡興的話,我們再實(shí)施對 server 內(nèi)部變量的修改,把 server 對外開放的監(jiān)聽端口 9527 改成 9529。

和剛才延遲命令參數(shù)差不多,因?yàn)橄嗤膮?shù)是演練 C++ 應(yīng)用所需要的,不同的是沒有了 --delayDuration,多了個(gè) --varaibleName 和 --varaibleValue 參數(shù)。我們模擬調(diào)用剛才的服務(wù)對外開放的監(jiān)聽端口 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

返回以下結(jié)果,并在 socket client 可驗(yàn)證端口是否被修改。

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

停止此次試驗(yàn):

./blade destroy 09dd96f4c062df69

最后,我們撤銷剛才的實(shí)驗(yàn)準(zhǔn)備,即卸載 c++ Agent:

./blade revoke e669d57f079a00cc

直接調(diào)用執(zhí)行器提供的 api 實(shí)施演練
掛載所需要的 c++ agent:

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

開始故障注入,發(fā)送 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=

其中請求參數(shù)為

{"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": "" }

這種方式增加了幾個(gè)參數(shù),解析如下:

create: 創(chuàng)建混沌實(shí)驗(yàn)請求

suid: 請求參數(shù),實(shí)驗(yàn)的 ID,后續(xù)停止實(shí)驗(yàn)會(huì)用到此 ID

target: 請求參數(shù),實(shí)驗(yàn)的組件目標(biāo),cplus 代表 針對 C++ 應(yīng)用的實(shí)驗(yàn)

action: 請求參數(shù),執(zhí)行實(shí)驗(yàn)的場景,delay

注:

suid、target、action 是 create 請求的必要參數(shù), breakLine、fileLocateAndName、forkMode、processName、delayDuration、initParams、libLoad 參數(shù)根據(jù) target 和 action 的不同而不同。

接收到請求,會(huì)根據(jù) target 和 action 調(diào)用參數(shù)校驗(yàn)器,驗(yàn)證參數(shù)值是否合法,如果合法,則記錄此次試驗(yàn);

對應(yīng)組件埋點(diǎn)觸發(fā)時(shí),如果查詢到有此組件的實(shí)驗(yàn),則獲取匹配器所需參數(shù),和下發(fā)的實(shí)驗(yàn)規(guī)則進(jìn)行匹配,匹配成功,則調(diào)用場景執(zhí)行器觸發(fā)實(shí)驗(yàn)。

停止此次試驗(yàn),通過發(fā)url 請求:chaosblade/destroy?suid=ec695fee1e458fc6

其中請求參數(shù)是:

{"suid": "ec695fee1e458fc6" }

suid: 請求參數(shù),之前創(chuàng)建實(shí)驗(yàn)返回的 UID

最后,我們撤銷剛才的實(shí)驗(yàn)準(zhǔn)備,即卸載 c++ Agent,通過發(fā)url 請求:chaosblade/remove

后續(xù)規(guī)劃

后續(xù)會(huì)加入更多混沌實(shí)驗(yàn)場景,也歡迎大家試用,提 issue、pr,star, 一起交流、探索和完善。

chaosblade github 地址點(diǎn)擊這里!

github 地址點(diǎn)擊這里!

附錄

實(shí)驗(yàn)流程 & 原理


解釋說明:

以上流程中,在實(shí)際的故障模擬演練,或突襲演練中,實(shí)驗(yàn)準(zhǔn)備階段,故障注入階段,故障恢復(fù)階段 和 實(shí)驗(yàn)器卸載階段,為故障注入方(或藍(lán)軍)操作,故障效果采集監(jiān)控項(xiàng)有效性驗(yàn)證,故障處置階段為故障模擬成功以后,故障注入方(或藍(lán)軍)確認(rèn)故障注入效果,也是故障處置方(或紅軍)接收報(bào)警,定位,并處置故障的階段;

實(shí)驗(yàn)執(zhí)行器底層基于 GDB 實(shí)現(xiàn),故障注入階段有提到啟動(dòng) gdb 一步。


原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的ChaosBlade 发布对 C++ 应用混沌实验的支持的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。