From 83f8714f15771f6006bb6fa36ee72d4e4a2cf50c Mon Sep 17 00:00:00 2001 From: wusheng Date: Sun, 15 Oct 2017 19:43:34 +0800 Subject: [PATCH] Finish the prototype codes. --- .../core/conf/SnifferConfigInitializer.java | 17 +- .../agent/core/plugin/PluginBootstrap.java | 10 +- .../core/plugin/PluginResourcesResolver.java | 7 +- .../interceptor/enhance/ConstructorInter.java | 2 +- .../interceptor/enhance/InstMethodsInter.java | 2 +- .../InstMethodsInterWithOverrideArgs.java | 2 +- .../enhance/StaticMethodsInter.java | 2 +- .../StaticMethodsInterWithOverrideArgs.java | 2 +- .../core/plugin/loader/AgentClassLoader.java | 226 ++++++++++++++++++ .../loader/InterceptorInstanceLoader.java | 50 +++- .../loader/NotImplementationException.java | 25 ++ .../core/plugin/loader/PluginClassLoader.java | 104 -------- .../agent/core/remote/GRPCChannelManager.java | 6 +- .../agent/core/sampling/SamplingService.java | 2 +- .../apm/plugin/jedis/v2/RedisMethodMatch.java | 2 +- .../plugin/sjdbc/ExecuteEventListener.java | 4 +- .../async/FutureGetInterceptor.java | 2 +- ...esponseExtractorFutureInstrumentation.java | 4 +- .../v2/define/MemcachedInstrumentation.java | 2 +- .../trace/TraceContextInterceptor.java | 2 +- 20 files changed, 335 insertions(+), 138 deletions(-) create mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/AgentClassLoader.java rename apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/{interceptor => }/loader/InterceptorInstanceLoader.java (78%) create mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/NotImplementationException.java delete mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/PluginClassLoader.java diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/SnifferConfigInitializer.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/SnifferConfigInitializer.java index e94d63e4b..66bc4c373 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/SnifferConfigInitializer.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/conf/SnifferConfigInitializer.java @@ -42,16 +42,13 @@ public class SnifferConfigInitializer { private static String ENV_KEY_PREFIX = "skywalking."; /** - * Try to locate config file, named {@link #CONFIG_FILE_NAME}, in following order: - * 1. Path from SystemProperty. {@link #overrideConfigBySystemEnv()} - * 2. class path. - * 3. Path, where agent is. {@link #loadConfigFromAgentFolder()} - *

- * If no found in any path, agent is still going to run in default config, {@link Config}, - * but in initialization steps, these following configs must be set, by config file or system properties: - *

- * 1. applicationCode. "-DapplicationCode=" or {@link Config.Agent#APPLICATION_CODE} - * 2. servers. "-Dservers=" or {@link Config.Collector#SERVERS} + * Try to locate `agent.config`, which should be in the /config dictionary of agent package. + * + * Also try to override the config by system.env and system.properties. All the keys in these two places should + * start with {@link #ENV_KEY_PREFIX}. e.g. in env `skywalking.agent.application_code=yourAppName` to override + * `agent.application_code` in config file. + * + * At the end, `agent.application_code` and `collector.servers` must be not blank. */ public static void initialize() throws ConfigNotFoundException, AgentPackageNotFoundException { InputStream configFileStream; diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginBootstrap.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginBootstrap.java index c3e01d98e..fac57e9fa 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginBootstrap.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginBootstrap.java @@ -22,8 +22,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; import org.skywalking.apm.agent.core.boot.AgentPackageNotFoundException; -import org.skywalking.apm.agent.core.boot.AgentPackagePath; -import org.skywalking.apm.agent.core.plugin.loader.PluginClassLoader; +import org.skywalking.apm.agent.core.plugin.loader.AgentClassLoader; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; @@ -43,7 +42,7 @@ public class PluginBootstrap { * @return plugin definition list. */ public List loadPlugins() throws AgentPackageNotFoundException { - PluginClassLoader.initAndGet(AgentPackagePath.getPath()); + AgentClassLoader.initDefaultLoader(); PluginResourcesResolver resolver = new PluginResourcesResolver(); List resources = resolver.getResources(); @@ -68,7 +67,10 @@ public class PluginBootstrap { try { logger.debug("loading plugin class {}.", pluginDefine.getDefineClass()); AbstractClassEnhancePluginDefine plugin = - (AbstractClassEnhancePluginDefine)Class.forName(pluginDefine.getDefineClass()).newInstance(); + (AbstractClassEnhancePluginDefine)Class.forName(pluginDefine.getDefineClass(), + true, + AgentClassLoader.getDefault()) + .newInstance(); plugins.add(plugin); } catch (Throwable t) { logger.error(t, "load plugin [{}] failure.", pluginDefine.getDefineClass()); diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginResourcesResolver.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginResourcesResolver.java index 4c78c38b0..eacbdbaa3 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginResourcesResolver.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginResourcesResolver.java @@ -23,6 +23,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; +import org.skywalking.apm.agent.core.plugin.loader.AgentClassLoader; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; @@ -39,7 +40,7 @@ public class PluginResourcesResolver { List cfgUrlPaths = new ArrayList(); Enumeration urls; try { - urls = getDefaultClassLoader().getResources("skywalking-plugin.def"); + urls = AgentClassLoader.getDefault().getResources("skywalking-plugin.def"); while (urls.hasMoreElements()) { URL pluginUrl = urls.nextElement(); @@ -56,8 +57,8 @@ public class PluginResourcesResolver { /** * Get the classloader. - * First get current thread's classloader, - * if fail, get {@link PluginResourcesResolver}'s classloader. + * First getDefault current thread's classloader, + * if fail, getDefault {@link PluginResourcesResolver}'s classloader. * * @return the classloader to find plugin definitions. */ diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ConstructorInter.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ConstructorInter.java index 998449eef..eb82e5684 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ConstructorInter.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ConstructorInter.java @@ -22,7 +22,7 @@ import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.implementation.bind.annotation.This; import org.skywalking.apm.agent.core.plugin.PluginException; -import org.skywalking.apm.agent.core.plugin.interceptor.loader.InterceptorInstanceLoader; +import org.skywalking.apm.agent.core.plugin.loader.InterceptorInstanceLoader; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInter.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInter.java index 869b63ecf..9f9ebd92e 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInter.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInter.java @@ -26,7 +26,7 @@ import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.implementation.bind.annotation.SuperCall; import net.bytebuddy.implementation.bind.annotation.This; import org.skywalking.apm.agent.core.plugin.PluginException; -import org.skywalking.apm.agent.core.plugin.interceptor.loader.InterceptorInstanceLoader; +import org.skywalking.apm.agent.core.plugin.loader.InterceptorInstanceLoader; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInterWithOverrideArgs.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInterWithOverrideArgs.java index 5baede086..db9371bba 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInterWithOverrideArgs.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInterWithOverrideArgs.java @@ -25,7 +25,7 @@ import net.bytebuddy.implementation.bind.annotation.Origin; import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.implementation.bind.annotation.This; import org.skywalking.apm.agent.core.plugin.PluginException; -import org.skywalking.apm.agent.core.plugin.interceptor.loader.InterceptorInstanceLoader; +import org.skywalking.apm.agent.core.plugin.loader.InterceptorInstanceLoader; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInter.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInter.java index d11e7e222..67e5df4fc 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInter.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInter.java @@ -24,7 +24,7 @@ import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.Origin; import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.implementation.bind.annotation.SuperCall; -import org.skywalking.apm.agent.core.plugin.interceptor.loader.InterceptorInstanceLoader; +import org.skywalking.apm.agent.core.plugin.loader.InterceptorInstanceLoader; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInterWithOverrideArgs.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInterWithOverrideArgs.java index 689449932..d45446659 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInterWithOverrideArgs.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInterWithOverrideArgs.java @@ -23,7 +23,7 @@ import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.Morph; import net.bytebuddy.implementation.bind.annotation.Origin; import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import org.skywalking.apm.agent.core.plugin.interceptor.loader.InterceptorInstanceLoader; +import org.skywalking.apm.agent.core.plugin.loader.InterceptorInstanceLoader; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/AgentClassLoader.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/AgentClassLoader.java new file mode 100644 index 000000000..542ebc256 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/AgentClassLoader.java @@ -0,0 +1,226 @@ +/* + * Copyright 2017, OpenSkywalking Organization 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. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.agent.core.plugin.loader; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import org.skywalking.apm.agent.core.boot.AgentPackageNotFoundException; +import org.skywalking.apm.agent.core.boot.AgentPackagePath; +import org.skywalking.apm.logging.ILog; +import org.skywalking.apm.logging.LogManager; + +/** + * The AgentClassLoader represents a classloader, + * which is in charge of finding plugins and interceptors. + * + * @author wusheng + */ +public class AgentClassLoader extends ClassLoader { + private static final ILog logger = LogManager.getLogger(AgentClassLoader.class); + private static AgentClassLoader LOADER; + + private List classpath; + private List allJars; + private ReentrantLock jarScanLock = new ReentrantLock(); + private ReentrantLock loadClassLock = new ReentrantLock(); + + public static AgentClassLoader getDefault() { + return LOADER; + } + + public static AgentClassLoader initDefaultLoader() throws AgentPackageNotFoundException { + LOADER = new AgentClassLoader(AgentClassLoader.class.getClassLoader()); + return getDefault(); + } + + public AgentClassLoader(ClassLoader parent) throws AgentPackageNotFoundException { + super(parent); + File agentDictionary = AgentPackagePath.getPath(); + classpath = new LinkedList(); + classpath.add(new File(agentDictionary, "plugins")); + classpath.add(new File(agentDictionary, "activations")); + } + + protected Class loadClass(String name, boolean resolve) + throws ClassNotFoundException { + loadClassLock.lock(); + try { + // First, check if the class has already been loaded + Class c = findLoadedClass(name); + if (c == null) { + try { + super.loadClass(name, resolve); + } catch (ClassNotFoundException e) { + // ClassNotFoundException thrown if class not found + // from the non-null parent class loader + } + + if (c == null) { + // If still not found, then invoke findClass in order + // to find the class. + c = findClass(name); + } + } + if (resolve) { + resolveClass(c); + } + return c; + } finally { + loadClassLock.unlock(); + } + } + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + List allJars = getAllJars(); + String path = "/" + name.replace('.', '/').concat(".class"); + for (Jar jar : allJars) { + JarEntry entry = jar.jarFile.getJarEntry(path); + if (entry != null) { + try { + URL classFileUrl = new URL("jar:file:" + jar.sourceFile.getAbsolutePath() + "!/" + name); + byte[] data = null; + BufferedInputStream is = null; + ByteArrayOutputStream baos = null; + try { + is = new BufferedInputStream(classFileUrl.openStream()); + baos = new ByteArrayOutputStream(); + int ch = 0; + while ((ch = is.read()) != -1) { + baos.write(ch); + } + data = baos.toByteArray(); + } finally { + if (is != null) + try { + is.close(); + } catch (IOException ignored) { + } + if (baos != null) + try { + baos.close(); + } catch (IOException ignored) { + } + } + return defineClass(name, data, 0, data.length); + } catch (MalformedURLException e) { + logger.error(e, "find class fail."); + } catch (IOException e) { + logger.error(e, "find class fail."); + } + } + } + throw new ClassNotFoundException("Can't find " + name); + } + + @Override + protected URL findResource(String name) { + List allJars = getAllJars(); + for (Jar jar : allJars) { + JarEntry entry = jar.jarFile.getJarEntry(name); + if (entry != null) { + try { + return new URL("jar:file:" + jar.sourceFile.getAbsolutePath() + "!/" + name); + } catch (MalformedURLException e) { + continue; + } + } + } + return null; + } + + @Override + protected Enumeration findResources(String name) throws IOException { + List allResources = new LinkedList(); + List allJars = getAllJars(); + for (Jar jar : allJars) { + JarEntry entry = jar.jarFile.getJarEntry(name); + if (entry != null) { + allResources.add(new URL("jar:file:" + jar.sourceFile.getAbsolutePath() + "!/" + name)); + } + } + + final Iterator iterator = allResources.iterator(); + return new Enumeration() { + @Override public boolean hasMoreElements() { + return iterator.hasNext(); + } + + @Override public URL nextElement() { + return iterator.next(); + } + }; + } + + private List getAllJars() { + if (allJars == null) { + jarScanLock.lock(); + try { + if (allJars == null) { + allJars = new LinkedList(); + for (File path : classpath) { + if (path.exists() && path.isDirectory()) { + String[] jarFileNames = path.list(new FilenameFilter() { + @Override public boolean accept(File dir, String name) { + return name.endsWith(".jar"); + } + }); + for (String fileName : jarFileNames) { + try { + File file = new File(path, fileName); + Jar jar = new Jar(new JarFile(file), file); + allJars.add(jar); + logger.info("{} loaded.", file.toString()); + } catch (IOException e) { + logger.error(e, "{} jar file can't be resolved", fileName); + } + } + } + } + } + } finally { + jarScanLock.unlock(); + } + } + + return allJars; + } + + private class Jar { + private JarFile jarFile; + private File sourceFile; + + private Jar(JarFile jarFile, File sourceFile) { + this.jarFile = jarFile; + this.sourceFile = sourceFile; + } + } +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/loader/InterceptorInstanceLoader.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/InterceptorInstanceLoader.java similarity index 78% rename from apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/loader/InterceptorInstanceLoader.java rename to apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/InterceptorInstanceLoader.java index f90096e08..90b66e2bc 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/loader/InterceptorInstanceLoader.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/InterceptorInstanceLoader.java @@ -16,7 +16,7 @@ * Project repository: https://github.com/OpenSkywalking/skywalking */ -package org.skywalking.apm.agent.core.plugin.interceptor.loader; +package org.skywalking.apm.agent.core.plugin.loader; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; @@ -24,8 +24,11 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.ProtectionDomain; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantLock; +import org.skywalking.apm.agent.core.boot.AgentPackageNotFoundException; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor; @@ -53,7 +56,52 @@ public class InterceptorInstanceLoader { private static ReentrantLock INSTANCE_LOAD_LOCK = new ReentrantLock(); + private static Map EXTEND_PLUGIN_CLASSLOADERS = new HashMap(); + public static T load(String className, ClassLoader targetClassLoader) + throws InvocationTargetException, IllegalAccessException, InstantiationException, ClassNotFoundException, AgentPackageNotFoundException { + if (targetClassLoader == null) { + targetClassLoader = InterceptorInstanceLoader.class.getClassLoader(); + } + String instanceKey = className + "_OF_" + targetClassLoader.getClass().getName() + "@" + Integer.toHexString(targetClassLoader.hashCode()); + Object inst = INSTANCE_CACHE.get(instanceKey); + if (inst == null) { + if (InterceptorInstanceLoader.class.getClassLoader().equals(targetClassLoader)) { + inst = targetClassLoader.loadClass(className).newInstance(); + } else { + INSTANCE_LOAD_LOCK.lock(); + try { + ClassLoader pluginLoader = EXTEND_PLUGIN_CLASSLOADERS.get(targetClassLoader); + if (pluginLoader == null) { + pluginLoader = new AgentClassLoader(targetClassLoader); + EXTEND_PLUGIN_CLASSLOADERS.put(targetClassLoader, pluginLoader); + } + inst = Class.forName(className, true, pluginLoader).newInstance(); + } finally { + INSTANCE_LOAD_LOCK.unlock(); + } + } + if (inst != null) { + INSTANCE_CACHE.put(instanceKey, inst); + } + } + + return (T)inst; + } + + /** + * Old load method, just for backup + * + * @param className + * @param targetClassLoader + * @param + * @return + * @throws InvocationTargetException + * @throws IllegalAccessException + * @throws InstantiationException + * @throws ClassNotFoundException + */ + public static T load0(String className, ClassLoader targetClassLoader) throws InvocationTargetException, IllegalAccessException, InstantiationException, ClassNotFoundException { if (targetClassLoader == null) { targetClassLoader = InterceptorInstanceLoader.class.getClassLoader(); diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/NotImplementationException.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/NotImplementationException.java new file mode 100644 index 000000000..0f9043394 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/NotImplementationException.java @@ -0,0 +1,25 @@ +/* + * Copyright 2017, OpenSkywalking Organization 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. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.agent.core.plugin.loader; + +/** + * @author wusheng + */ +public class NotImplementationException extends RuntimeException { +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/PluginClassLoader.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/PluginClassLoader.java deleted file mode 100644 index e1cdef4d8..000000000 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/loader/PluginClassLoader.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2017, OpenSkywalking Organization 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. - * - * Project repository: https://github.com/OpenSkywalking/skywalking - */ - -package org.skywalking.apm.agent.core.plugin.loader; - -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.net.URL; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.locks.ReentrantLock; -import java.util.jar.JarFile; -import org.skywalking.apm.logging.ILog; -import org.skywalking.apm.logging.LogManager; - -/** - * The PluginClassLoader represents a classloader, - * which is in charge of finding plugins and interceptors. - * - * @author wusheng - */ -public class PluginClassLoader extends ClassLoader { - private static final ILog logger = LogManager.getLogger(PluginClassLoader.class); - private static PluginClassLoader LOADER; - - private List classpath; - private List allJars; - private ReentrantLock jarScanLock = new ReentrantLock(); - - public static PluginClassLoader get() { - return LOADER; - } - - public static PluginClassLoader initAndGet(File agentDictionary) { - LOADER = new PluginClassLoader(agentDictionary); - return get(); - } - - private PluginClassLoader(File agentDictionary) { - super(PluginClassLoader.class.getClassLoader()); - classpath = new LinkedList(); - classpath.add(new File(agentDictionary, "plugins")); - classpath.add(new File(agentDictionary, "activations")); - } - - @Override - protected Class findClass(String name) throws ClassNotFoundException { - throw new ClassNotFoundException(name); - } - - @Override - protected URL findResource(String name) { - getAllJars(); - throw new RuntimeException(""); - } - - private List getAllJars() { - if (allJars == null) { - jarScanLock.lock(); - try { - if (allJars == null) { - allJars = new LinkedList(); - for (File path : classpath) { - if (path.exists() && path.isDirectory()) { - String[] jarFileNames = path.list(new FilenameFilter() { - @Override public boolean accept(File dir, String name) { - return name.endsWith(".jar"); - } - }); - for (String fileName : jarFileNames) { - try { - JarFile jar = new JarFile(fileName); - allJars.add(jar); - } catch (IOException e) { - logger.error(e, "{} jar file can't be resolved", fileName); - } - } - } - } - } - } finally { - jarScanLock.unlock(); - } - } - - return allJars; - } -} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java index 8f5e264ef..85f958587 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java @@ -70,13 +70,15 @@ public class GRPCChannelManager implements BootService, Runnable { @Override public void shutdown() throws Throwable { connectCheckFuture.cancel(true); - managedChannel.shutdownNow(); + if (managedChannel != null) { + managedChannel.shutdownNow(); + } logger.debug("Selected collector grpc service shutdown."); } @Override public void run() { - logger.debug("Selected collector grpc service running, reconnect:{}.",reconnect); + logger.debug("Selected collector grpc service running, reconnect:{}.", reconnect); if (reconnect) { if (RemoteDownstreamConfig.Collector.GRPC_SERVERS.size() > 0) { String server = ""; diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/sampling/SamplingService.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/sampling/SamplingService.java index e62999425..dc011840d 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/sampling/SamplingService.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/sampling/SamplingService.java @@ -86,7 +86,7 @@ public class SamplingService implements BootService { } /** - * @return true, if sampling mechanism is on, and get the sampling factor successfully. + * @return true, if sampling mechanism is on, and getDefault the sampling factor successfully. */ public boolean trySampling() { if (on) { diff --git a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/RedisMethodMatch.java b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/RedisMethodMatch.java index d026a3fce..037322844 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/RedisMethodMatch.java +++ b/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/java/org/skywalking/apm/plugin/jedis/v2/RedisMethodMatch.java @@ -39,7 +39,7 @@ public enum RedisMethodMatch { .or(named("zrangeByScore")).or(named("smove")).or(named("lset")) .or(named("decrBy")).or(named("pttl")).or(named("scan")) .or(named("zrank")).or(named("blpop")).or(named("rpoplpush")) - .or(named("zremrangeByLex")).or(named("get")).or(named("lpop")) + .or(named("zremrangeByLex")).or(named("getDefault")).or(named("lpop")) .or(named("persist")).or(named("scriptExists")).or(named("georadius")) .or(named("set")).or(named("srandmember")).or(named("incr")).or(named("setbit")) .or(named("hexists")).or(named("expireAt")).or(named("pexpire")).or(named("zcard")) diff --git a/apm-sniffer/apm-sdk-plugin/sharding-jdbc-1.5.x-plugin/src/main/java/org/skywalking/apm/plugin/sjdbc/ExecuteEventListener.java b/apm-sniffer/apm-sdk-plugin/sharding-jdbc-1.5.x-plugin/src/main/java/org/skywalking/apm/plugin/sjdbc/ExecuteEventListener.java index 4f6abb573..b278d2fc9 100644 --- a/apm-sniffer/apm-sdk-plugin/sharding-jdbc-1.5.x-plugin/src/main/java/org/skywalking/apm/plugin/sjdbc/ExecuteEventListener.java +++ b/apm-sniffer/apm-sdk-plugin/sharding-jdbc-1.5.x-plugin/src/main/java/org/skywalking/apm/plugin/sjdbc/ExecuteEventListener.java @@ -35,8 +35,8 @@ import org.skywalking.apm.network.trace.component.ComponentsDefine; import org.skywalking.apm.plugin.sjdbc.define.AsyncExecuteInterceptor; /** - * Sharding-jdbc provides {@link EventBusInstance} to help external systems get events of sql execution. - * {@link ExecuteEventListener} can get sql statement start and end events, resulting in db span. + * Sharding-jdbc provides {@link EventBusInstance} to help external systems getDefault events of sql execution. + * {@link ExecuteEventListener} can getDefault sql statement start and end events, resulting in db span. * * @author gaohongtao */ diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/resttemplate/async/FutureGetInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/resttemplate/async/FutureGetInterceptor.java index b333cb63f..076cf2032 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/resttemplate/async/FutureGetInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/resttemplate/async/FutureGetInterceptor.java @@ -32,7 +32,7 @@ public class FutureGetInterceptor implements InstanceMethodsAroundInterceptor { public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { Object[] cacheValues = (Object[])objInst.getSkyWalkingDynamicField(); - ContextManager.createLocalSpan("future/get:" + ((URI)cacheValues[0]).getPath()); + ContextManager.createLocalSpan("future/getDefault:" + ((URI)cacheValues[0]).getPath()); } @Override diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/resttemplate/async/define/ResponseExtractorFutureInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/resttemplate/async/define/ResponseExtractorFutureInstrumentation.java index 51a325bb7..33f24acf0 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/resttemplate/async/define/ResponseExtractorFutureInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/resttemplate/async/define/ResponseExtractorFutureInstrumentation.java @@ -32,7 +32,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName; /** - * {@link ResponseExtractorFutureInstrumentation} enhance the addCallback method and get + * {@link ResponseExtractorFutureInstrumentation} enhance the addCallback method and getDefault * method of org.springframework.web.client.AsyncRestTemplate$ResponseExtractorFuture by * org.skywalking.apm.plugin.spring.resttemplate.async.ResponseCallBackInterceptor and * org.skywalking.apm.plugin.spring.resttemplate.async.FutureGetInterceptor. @@ -48,7 +48,7 @@ public class ResponseExtractorFutureInstrumentation extends ClassInstanceMethods private static final String ADD_CALLBACK_INTERCEPTOR = "org.skywalking.apm.plugin.spring.resttemplate.async.ResponseCallBackInterceptor"; private static final String ENHANCE_CLASS = "org.springframework.web.client.AsyncRestTemplate$ResponseExtractorFuture"; private static final String GET_METHOD_INTERCEPTOR = "org.skywalking.apm.plugin.spring.resttemplate.async.FutureGetInterceptor"; - private static final String GET_METHOD_NAME = "get"; + private static final String GET_METHOD_NAME = "getDefault"; @Override protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { diff --git a/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/src/main/java/org/skywalking/apm/plugin/spymemcached/v2/define/MemcachedInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/src/main/java/org/skywalking/apm/plugin/spymemcached/v2/define/MemcachedInstrumentation.java index ad70d7340..9993866fc 100644 --- a/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/src/main/java/org/skywalking/apm/plugin/spymemcached/v2/define/MemcachedInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/src/main/java/org/skywalking/apm/plugin/spymemcached/v2/define/MemcachedInstrumentation.java @@ -75,7 +75,7 @@ public class MemcachedInstrumentation extends ClassInstanceMethodsEnhancePluginD return named("touch").or(named("append")).or(named("prepend")).or(named("asyncCAS")) .or(named("cas")).or(named("add")).or(named("set")).or(named("replace")) .or(named("asyncGet")).or(named("asyncGets")).or(named("gets")).or(named("getAndTouch")) - .or(named("get")).or(named("asyncGetBulk")).or(named("asyncGetAndTouch")) + .or(named("getDefault")).or(named("asyncGetBulk")).or(named("asyncGetAndTouch")) .or(named("getBulk")).or(named("getStats")).or(named("incr")) .or(named("decr")).or(named("asyncIncr")).or(named("asyncDecr")) .or(named("delete")); diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/TraceContextInterceptor.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/TraceContextInterceptor.java index 849ecb288..a888efd91 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/TraceContextInterceptor.java +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/TraceContextInterceptor.java @@ -43,6 +43,6 @@ public class TraceContextInterceptor implements StaticMethodsAroundInterceptor { @Override public void handleMethodException(Class clazz, Method method, Object[] allArguments, Class[] parameterTypes, Throwable t) { - logger.error("Failed to get trace Id.", t); + logger.error("Failed to getDefault trace Id.", t); } } -- GitLab