Hello everyone, I would like to share a new feature with SkyWalking, called ??Dynamically close some plugins of java agent??.
Background 1.in our production environment, there have been several failures or fusing of online business due to incompatible SkyWalking agent plugins. 2.some business applications do not need to monitor the links of certain plugins. Therefore, we have developed a dynamic plugin shutdown function, which is used to shut down the link monitoring of a plugin of a certain application in an emergency, or close all plugins under the application. Structure Agent(dynamic close java agent plugin) ?? gRPC protocol ?? OAP Server ?? SkyWalking-Rocketbot-UI More detail OAP Server: 1.Store plugin status information of each instance agent 2.Provide GraphQL API to change cluster/instance plugin status. This means that the plugin status of the application/instance is managed in OAP, and the agent obtains the plugin status of the application/instance by querying OAP. SkyWalking-Rocketbot-UI: 1. Manage the plugin status of each application/instance Agent: 1. Establish the relationship between the plug-in and the enhanced class. After obtaining that the plug-in is closed, close all interceptors under the plug-in. In principle, we only need to modify ConstructorInter, InstMethodsInter, InstMethodsInterWithOverrideArgs, StaticMethodsInter, StaticMethodsInterWithOverrideArgs and some bootstrap template interceptors. We need to determine whether the interceptor corresponding to the current class is closed in the interception method of these interceptors. If it is closed, we directly call the original method, skipping the execution of the before, after, handleMethodException methods of the relevant interceptor. 2. Query the plugin status of the current instance at a certain interval. 3. Update the plugin state in the agent with the plug-n state obtained by querying OAP. Question: 1.Why can only dynamically close the plugin, but not dynamically open the plugin? Because some interceptors need some initialization information, for example, when the plug-in is used for the first time, the plug-in is turned off, causing some information to not be initialized. When it is turned on, calling getSkyWalkingDynamicField returns null. At this time, some NullPointerException may occur. My English is not very good, and some parts may be unclear. Please forgive me.
