Skip to content

Commit

Permalink
获取sermant增强信息:插件、增强类、方法
Browse files Browse the repository at this point in the history
  • Loading branch information
TangLeDaily committed Nov 7, 2023
1 parent a1308ed commit d768519
Show file tree
Hide file tree
Showing 7 changed files with 199 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import com.huaweicloud.sermant.core.plugin.agent.ByteEnhanceManager;
import com.huaweicloud.sermant.core.plugin.agent.adviser.AdviserInterface;
import com.huaweicloud.sermant.core.plugin.agent.adviser.AdviserScheduler;
import com.huaweicloud.sermant.core.plugin.agent.info.EnhanceInfoManager;
import com.huaweicloud.sermant.core.plugin.agent.template.DefaultAdviser;
import com.huaweicloud.sermant.core.service.ServiceManager;
import com.huaweicloud.sermant.god.common.SermantManager;
Expand Down Expand Up @@ -157,6 +158,9 @@ public static void uninstall() {
// 清理配置类
ConfigManager.shutdown();

// 清理增强信息类
EnhanceInfoManager.clear();

// 设置该artifact的Sermant状态为false,非运行状态
SermantManager.updateSermantStatus(artifactCache, false);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright (C) 2023-2023 Huawei Technologies Co., Ltd. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.huaweicloud.sermant.core.command;

import com.huaweicloud.sermant.core.common.LoggerFactory;
import com.huaweicloud.sermant.core.plugin.Plugin;
import com.huaweicloud.sermant.core.plugin.PluginManager;
import com.huaweicloud.sermant.core.plugin.agent.info.EnhanceInfoManager;
import com.huaweicloud.sermant.core.utils.CollectionUtils;
import com.huaweicloud.sermant.core.utils.MapUtils;

import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* 增强信息查询命令执行器
*
* @author tangle
* @since 2023-11-02
*/
public class CheckEnhanceCommandExecutor implements CommandExecutor {
private static final Logger LOGGER = LoggerFactory.getLogger();

@Override
public void execute(String args) {
LOGGER.log(Level.INFO, "========== print plugin ==========");
for (Map.Entry<String, Plugin> entry : PluginManager.getPluginMap().entrySet()) {
LOGGER.log(Level.INFO, entry.getKey() + ":" + entry.getValue().getVersion());
}
LOGGER.log(Level.INFO, "========== print enhance class and method ==========");
Map<String, Set<String>> enhancement = EnhanceInfoManager.getEnhancement();
if (MapUtils.isEmpty(enhancement)) {
LOGGER.log(Level.INFO, "enhancement map is empty.");
return;
}
for (Map.Entry<String, Set<String>> enhancemantEntry : enhancement.entrySet()) {
Set<String> methodDescSet = enhancemantEntry.getValue();
if (CollectionUtils.isEmpty(methodDescSet)) {
continue;
}
for (String methodDesc : methodDescSet) {
LOGGER.log(Level.INFO, enhancemantEntry.getKey() + " " + methodDesc);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,13 @@ public enum Command {
/**
* 卸载插件指令
*/
UNINSTALL_PLUGINS("UNINSTALL-PLUGINS");
UNINSTALL_PLUGINS("UNINSTALL-PLUGINS"),

/**
* 增强查询指令
*/
CHECK_ENHANCE("CHECK-ENHANCE");

private final String value;

Command(String value) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public class CommandProcessor {
COMMAND_EXECUTOR_MAP.put(Command.INSTALL_PLUGINS.getValue(), new PluginsInstallCommandExecutor());
COMMAND_EXECUTOR_MAP.put(Command.UNINSTALL_AGENT.getValue(), new AgentUnInstallCommandExecutor());
COMMAND_EXECUTOR_MAP.put(Command.UNINSTALL_PLUGINS.getValue(), new PluginsUnInstallCommandExecutor());
COMMAND_EXECUTOR_MAP.put(Command.CHECK_ENHANCE.getValue(), new CheckEnhanceCommandExecutor());
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.huaweicloud.sermant.core.exception.SchemaException;
import com.huaweicloud.sermant.core.plugin.agent.ByteEnhanceManager;
import com.huaweicloud.sermant.core.plugin.agent.adviser.AdviserScheduler;
import com.huaweicloud.sermant.core.plugin.agent.info.EnhanceInfoManager;
import com.huaweicloud.sermant.core.plugin.agent.interceptor.Interceptor;
import com.huaweicloud.sermant.core.plugin.agent.template.BaseAdviseHandler;
import com.huaweicloud.sermant.core.plugin.classloader.PluginClassLoader;
Expand Down Expand Up @@ -105,6 +106,9 @@ public static void uninstall(Set<String> pluginNames) {
AdviserScheduler.unLock(adviceKey);
}

// 清除增强信息
EnhanceInfoManager.removePluginEnhancement(plugin);

// 取消字节码增强
ByteEnhanceManager.unEnhanceDynamicPlugin(plugin);

Expand Down Expand Up @@ -183,6 +187,10 @@ public static void initPlugins(Set<String> pluginNames, boolean isDynamic) {
}
}

public static Map<String, Plugin> getPluginMap() {
return PLUGIN_MAP;
}

private static void doInitPlugin(Plugin plugin) {
loadPluginLibs(plugin);
loadServiceLibs(plugin);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/*
* Copyright (C) 2023-2023 Huawei Technologies Co., Ltd. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.huaweicloud.sermant.core.plugin.agent.info;

import com.huaweicloud.sermant.core.plugin.Plugin;
import com.huaweicloud.sermant.core.plugin.agent.interceptor.Interceptor;
import com.huaweicloud.sermant.core.utils.MapUtils;
import com.huaweicloud.sermant.core.utils.StringUtils;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* 存储增强信息的静态类
*
* @author tangle
* @since 2023-11-02
*/
public class EnhanceInfoManager {
private static Map<String, Set<String>> enhancement;

private EnhanceInfoManager() {
}

public static Map<String, Set<String>> getEnhancement() {
return enhancement;
}

public static void setEnhancement(Map<String, Set<String>> enhancement) {
EnhanceInfoManager.enhancement = enhancement;
}

/**
* 添加拦截器信息
*
* @param interceptorList 拦截器列表
* @param plugin 插件
* @param className 类名
* @param methodName 方法名
*/
public static void addMethodDesc(Plugin plugin, List<Interceptor> interceptorList, String className,
String methodName) {
if (MapUtils.isEmpty(enhancement)) {
enhancement = new HashMap<>();
}
String enhancementKey = combinePluginInfo(plugin);
Set<String> methodDesc = enhancement.computeIfAbsent(enhancementKey, key -> new HashSet<>());
if (!StringUtils.isEmpty(className) && !StringUtils.isEmpty(methodName)) {
methodDesc.add(combineEnhanceInfo(interceptorList, className, methodName));
}
}

/**
* 卸载插件时清除该插件的增强信息
*
* @param plugin 插件
*/
public static void removePluginEnhancement(Plugin plugin) {
if (enhancement != null) {
enhancement.remove(combinePluginInfo(plugin));
}
}

/**
* 清理缓存的增强信息
*/
public static void clear() {
if (enhancement != null) {
enhancement.clear();
}
}

/**
* 拼接插件信息
*/
private static String combinePluginInfo(Plugin plugin) {
return plugin.getName() + ":" + plugin.getVersion();
}

/**
* 拼接增强信息
*/
private static String combineEnhanceInfo(List<Interceptor> interceptors, String className, String methodName) {
StringBuilder result = new StringBuilder("\tinterceptors: ");
int len = interceptors.size();
for (int i = 0; i < len; i++) {
result.append(interceptors.get(i).getClass().getCanonicalName());
if (i != len - 1) {
result.append(" & ");
}
}
result.append("\tenhance: ");
result.append(className).append("::").append(methodName);
return result.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.huaweicloud.sermant.core.plugin.Plugin;
import com.huaweicloud.sermant.core.plugin.agent.adviser.AdviserScheduler;
import com.huaweicloud.sermant.core.plugin.agent.declarer.InterceptDeclarer;
import com.huaweicloud.sermant.core.plugin.agent.info.EnhanceInfoManager;
import com.huaweicloud.sermant.core.plugin.agent.interceptor.Interceptor;
import com.huaweicloud.sermant.core.plugin.agent.template.BaseAdviseHandler;

Expand Down Expand Up @@ -69,6 +70,9 @@ protected Builder<?> resolve(Builder<?> builder, InDefinedShape methodDesc, List
createdInterceptorForAdviceKey.add(interceptor.getClass().getCanonicalName());
}
}
EnhanceInfoManager.addMethodDesc(plugin, interceptors,
methodDesc.getDeclaringType().getCanonicalName(),
methodDesc.getActualName());
if (checkAdviceLock(adviceKey)) {
return builder.visit(Advice.to(templateCls).on(ElementMatchers.is(methodDesc)));
}
Expand Down

0 comments on commit d768519

Please sign in to comment.