All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.criteo.hadoop.garmadon.agent.tracers.Tracer Maven / Gradle / Ivy

There is a newer version: 1.4.0
Show newest version
package com.criteo.hadoop.garmadon.agent.tracers;

import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.agent.builder.AgentBuilder.Listener.Filtering;
import net.bytebuddy.agent.builder.ResettableClassFileTransformer;
import net.bytebuddy.description.NamedElement;
import net.bytebuddy.matcher.ElementMatcher;

import java.lang.instrument.Instrumentation;

import static net.bytebuddy.matcher.ElementMatchers.*;

public abstract class Tracer {

    protected static ElementMatcher.Junction ignoredMatcher;

    private static final ElementMatcher BYTE_BUDDY_LOGGING_FILTER;

    protected AgentBuilder agentBuilder;

    Tracer() {
        this.agentBuilder = new AgentBuilder.Default()
            .ignore(any(), isBootstrapClassLoader())
            .ignore(any(), isSystemClassLoader())
            .ignore(any(), isExtensionClassLoader())
            .ignore(ignoredMatcher)
            .with(
                new Filtering(BYTE_BUDDY_LOGGING_FILTER, AgentBuilder.Listener.StreamWriting.toSystemOut())
            );
    }

    static {
        String[] predefWhitelist = {
            "org.apache.flink.",
            "org.apache.hadoop.",
            "org.apache.spark.",
            "com.facebook.presto.",
            "io.prestosql.",
            "com.criteo.",
        };
        String[] predefBlacklist = {
            "com.criteo.hadoop.garmadon.",
            "com.criteo.jvm.",
        };
        String runtimeWhitelist = System.getProperty("bytebuddy.whitelist.for.instrumentation");
        String runtimeBlacklist = System.getProperty("bytebuddy.blacklist.for.instrumentation");

        ElementMatcher.Junction whitelistMatcher = newListMatcher(predefWhitelist);
        if (runtimeWhitelist != null) whitelistMatcher = whitelistMatcher.or(newListMatcher(runtimeWhitelist.split(",")));

        ElementMatcher.Junction blacklistMatcher = newListMatcher(predefBlacklist);
        if (runtimeBlacklist != null) blacklistMatcher = blacklistMatcher.or(newListMatcher(runtimeBlacklist.split(",")));

        ignoredMatcher = not(whitelistMatcher).or(blacklistMatcher);
    }

    private static ElementMatcher.Junction newListMatcher(String[] packages) {
        ElementMatcher.Junction matcher = none();
        for (String pkg : packages) {
            matcher = matcher.or(nameStartsWith(pkg));
        }
        return matcher;
    }

    static {
        String filterClass = System.getProperty("bytebuddy.debug.instrumentation.for.class");
        BYTE_BUDDY_LOGGING_FILTER = filterClass != null ? s -> s.contains(filterClass) : s -> false;
    }

    public void installOn(Instrumentation instrumentation) {
        this.agentBuilder.installOn(instrumentation);
    }

    public ResettableClassFileTransformer installOnByteBuddyAgent() {
        return this.agentBuilder.installOnByteBuddyAgent();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy