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