ChaosBlade
2025-09-16 11:16:12 0 举报
AI智能生成
阿里开源组件 ChaosBlade 源码分析
作者其他创作
大纲/内容
./blade prepare jvm<br>AgentLauncher.agentmain()
JVM-SANDBOX
ProxyCoreServer.bind()<br>启动 Jetty Server
onLoad()
Jetty Server
onActive()<br>处理 /sandbox-module-mgr/active 请求
status()<br>处理 /chaosblade/status 请求
./blade create jvm
JVM-SANDBOX
ProxyCoreServer.bind()<br>启动 Jetty Server
onLoad()
ManagerFactory.getListenerManager().setPluginLifecycleListener(this)<br>注册监听器【当前类SandboxModule】
dispatchService.load()<br>处理请求路由
registerHandler(new CreateHandler())<br>处理 /create 请求<br>
registerHandler(new DestroyHandler())<br>处理 /destroy 请求<br>
registerHandler(new StatusHandler())<br>处理 /status 请求<br>
ManagerFactory.load()<br>
modelSpecManager.load()
listenerManager.load()
statusManager.load()
spiServiceManager.load()
onUnload()
dispatchService.unload()
ManagerFactory.unload()
Jetty Server
onActive()<br>处理 /sandbox-module-mgr/active 请求
loadPlugins()<br>使用 SPI 加载插件
ManagerFactory.getModelSpecManager().registerModelSpec(modelSpec)
ManagerFactory.getPluginManager().registerPlugin(pluginBean)
status()<br>处理 /chaosblade/status 请求
create()<br>处理 /chaosblade/create 请求
CreateHandler.handle()<br>处理请求
this.modelSpecManager.getModelSpec(target)
handleInjection()<br>注入故障
statusManager.registerExp(suid, model)<br>注册到 models 中,防止重复注入同一故障
lazyLoadPlugin()<br>懒加载插件<br>这里只会加载一次
这里有一系列判断,确保 plugin 只会加载一次
listener.add(pluginBean)<br>装载 plugin<br>
SandboxEnhancerFactory.createFilter()<br>创建匹配过滤器(用于目标增强类匹配)
com.alibaba.jvm.sandbox.api.filter.Filter#doClassFilter<br>类判断,这里为 ""
com.alibaba.jvm.sandbox.api.filter.Filter#doMethodFilter<br>方法判断,这里为 ""
SandboxEnhancerFactory.createBeforeEventListener()<br>创建事件监听器(用于接收事件通知)
moduleEventWatcher.watch(filter, eventListener, Event.Type.BEFORE)<br>使用 watch 增强
ManagerFactory.getPluginManager().setLoad(pluginBeans, modelSpec.getTarget())<br>【jvm】插件初始化完毕,装载到 pluginManager
applyPreInjectionModelHandler()<br>前置异常
JvmModelSpec.preCreate()
((DirectlyInjectionAction) actionSpec).createInjection(uid, model)<br>直接添加故障,如 oom,fgc 等
MethodPreInjectHandler.preHandleInjection(model)<br>
listener.add(new PluginBean(methodPlugin))<br>字节码增强<br>
SandboxEnhancerFactory.createFilter()<br>创建匹配过滤器(用于目标增强类匹配)
com.alibaba.jvm.sandbox.api.filter.Filter#doClassFilter<br>类判断,这里为 "com.xhs.chaos.demo.controller.HelloWorldController"
com.alibaba.jvm.sandbox.api.filter.Filter#doMethodFilter<br>方法判断,这里为 "hello"
SandboxEnhancerFactory.createBeforeEventListener()<br>创建事件监听器(用于接收事件通知)
moduleEventWatcher.watch(filter, eventListener, Event.Type.BEFORE)<br>使用 watch 增强
匹配成功后<br>ManagerFactory.getStatusManager().registerEnhancer(enhancerClassName)
destroy()<br>处理 /chaosblade/destroy 请求
DestroyHandler.handle()<br>处理请求
destroy()<br>销毁故障
statusManager.removeExp(uid)<br>删除实验
applyPreDestroyInjectionModelHandler()<br>实验删除之后的步骤
JvmModelSpec.preDestroy()
MethodPreInjectHandler.preHandleRecovery(model)
listener.delete(new PluginBean(methodPlugin))<br>revoke 字节码增强
moduleEventWatcher.delete(watcherId)<br>从 watch 中移除
处理请求
BeforeEventListener.handleEvent()<br>处理事件
BeforeEnhancer.beforeAdvice()
doBeforeAdvice()<br>构造 EnhancerModel
getUrl()<br>获取 url
getTimeout()<br>获取超时时间
setTimeoutExecutor()<br>设置超时时间执行器
Injector.inject(model)<br>故障注入
compare(model, enhancerModel)<br>model 匹配,根据前面设置的 match 匹配
actionSpec.getActionExecutor().run(enhancerModel)
DefaultDelayExecutor.run()
0 条评论
下一页