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);
}
}