Search in sources :

Example 1 with PluginException

use of org.apache.skywalking.apm.agent.core.plugin.PluginException in project incubator-skywalking by apache.

the class SkyWalkingAgent method premain.

/**
 * Main entrance.
 * Use byte-buddy transform to enhance all classes, which define in plugins.
 *
 * @param agentArgs
 * @param instrumentation
 * @throws PluginException
 */
public static void premain(String agentArgs, Instrumentation instrumentation) throws PluginException {
    final PluginFinder pluginFinder;
    try {
        SnifferConfigInitializer.initialize();
        pluginFinder = new PluginFinder(new PluginBootstrap().loadPlugins());
        ServiceManager.INSTANCE.boot();
    } catch (Exception e) {
        logger.error(e, "Skywalking agent initialized failure. Shutting down.");
        return;
    }
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

        @Override
        public void run() {
            ServiceManager.INSTANCE.shutdown();
        }
    }, "skywalking service shutdown thread"));
    new AgentBuilder.Default().type(pluginFinder.buildMatch()).transform(new AgentBuilder.Transformer() {

        @Override
        public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) {
            List<AbstractClassEnhancePluginDefine> pluginDefines = pluginFinder.find(typeDescription, classLoader);
            if (pluginDefines.size() > 0) {
                DynamicType.Builder<?> newBuilder = builder;
                EnhanceContext context = new EnhanceContext();
                for (AbstractClassEnhancePluginDefine define : pluginDefines) {
                    DynamicType.Builder<?> possibleNewBuilder = define.define(typeDescription.getTypeName(), newBuilder, classLoader, context);
                    if (possibleNewBuilder != null) {
                        newBuilder = possibleNewBuilder;
                    }
                }
                if (context.isEnhanced()) {
                    logger.debug("Finish the prepare stage for {}.", typeDescription.getName());
                }
                return newBuilder;
            }
            logger.debug("Matched class {}, but ignore by finding mechanism.", typeDescription.getTypeName());
            return builder;
        }
    }).with(new AgentBuilder.Listener() {

        @Override
        public void onDiscovery(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded) {
        }

        @Override
        public void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, boolean loaded, DynamicType dynamicType) {
            if (logger.isDebugEnable()) {
                logger.debug("On Transformation class {}.", typeDescription.getName());
            }
            InstrumentDebuggingClass.INSTANCE.log(typeDescription, dynamicType);
        }

        @Override
        public void onIgnored(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, boolean loaded) {
        }

        @Override
        public void onError(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded, Throwable throwable) {
            logger.error("Enhance class " + typeName + " error.", throwable);
        }

        @Override
        public void onComplete(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded) {
        }
    }).installOn(instrumentation);
}
Also used : DynamicType(net.bytebuddy.dynamic.DynamicType) AgentBuilder(net.bytebuddy.agent.builder.AgentBuilder) PluginBootstrap(org.apache.skywalking.apm.agent.core.plugin.PluginBootstrap) PluginException(org.apache.skywalking.apm.agent.core.plugin.PluginException) JavaModule(net.bytebuddy.utility.JavaModule) EnhanceContext(org.apache.skywalking.apm.agent.core.plugin.EnhanceContext) AgentBuilder(net.bytebuddy.agent.builder.AgentBuilder) PluginFinder(org.apache.skywalking.apm.agent.core.plugin.PluginFinder) AbstractClassEnhancePluginDefine(org.apache.skywalking.apm.agent.core.plugin.AbstractClassEnhancePluginDefine) TypeDescription(net.bytebuddy.description.type.TypeDescription) List(java.util.List)

Aggregations

List (java.util.List)1 AgentBuilder (net.bytebuddy.agent.builder.AgentBuilder)1 TypeDescription (net.bytebuddy.description.type.TypeDescription)1 DynamicType (net.bytebuddy.dynamic.DynamicType)1 JavaModule (net.bytebuddy.utility.JavaModule)1 AbstractClassEnhancePluginDefine (org.apache.skywalking.apm.agent.core.plugin.AbstractClassEnhancePluginDefine)1 EnhanceContext (org.apache.skywalking.apm.agent.core.plugin.EnhanceContext)1 PluginBootstrap (org.apache.skywalking.apm.agent.core.plugin.PluginBootstrap)1 PluginException (org.apache.skywalking.apm.agent.core.plugin.PluginException)1 PluginFinder (org.apache.skywalking.apm.agent.core.plugin.PluginFinder)1