You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by ol...@apache.org on 2014/01/28 00:39:24 UTC

svn commit: r1561905 - in /incubator/sirona/trunk/agent/javaagent: ./ src/main/java/org/apache/sirona/javaagent/ src/main/java/org/apache/sirona/javaagent/listener/ src/test/java/org/apache/sirona/javaagent/ src/test/java/org/apache/test/sirona/javaagent/

Author: olamy
Date: Mon Jan 27 23:39:23 2014
New Revision: 1561905

URL: http://svn.apache.org/r1561905
Log:
[SIRONA-22] provide a parameter to disable default CounterListener in javaagent

Modified:
    incubator/sirona/trunk/agent/javaagent/pom.xml
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/CounterListener.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/SimpleTest.java

Modified: incubator/sirona/trunk/agent/javaagent/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/pom.xml?rev=1561905&r1=1561904&r2=1561905&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/pom.xml (original)
+++ incubator/sirona/trunk/agent/javaagent/pom.xml Mon Jan 27 23:39:23 2014
@@ -59,6 +59,14 @@
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
     </dependency>
+
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.2.1</version>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 
   <build>

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java?rev=1561905&r1=1561904&r2=1561905&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java Mon Jan 27 23:39:23 2014
@@ -25,17 +25,38 @@ import org.apache.sirona.javaagent.spi.O
 import org.apache.sirona.spi.SPI;
 
 import java.lang.reflect.Method;
-import java.util.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 // just a helper to ease ASM work and reuse AbstractPerformanceInterceptor logic
 public class AgentContext {
+
     private static final InvocationListener[] EXISTING_LISTENERS = loadAllListeners();
 
     private static final ConcurrentMap<String, InvocationListener[]> LISTENERS_BY_KEY = new ConcurrentHashMap<String, InvocationListener[]>();
     private static final ConcurrentMap<String, Counter.Key> KEYS_CACHE = new ConcurrentHashMap<String, Counter.Key>();
 
+    private static Map<String, String> agentParameters = new HashMap<String, String>( );
+
+    public static void addAgentParameter( String key, String value){
+        agentParameters.put( key, value );
+    }
+
+    /**
+     *
+     * @return a copy of the Agent parameters
+     */
+    public static Map<String,String> getAgentParameters(){
+        return new HashMap<String, String>( agentParameters );
+    }
+
     // called by agent
     public static AgentContext startOn(final String key, final Object that) {
         return new AgentContext(key, that, listeners(key));
@@ -106,7 +127,7 @@ public class AgentContext {
                 listeners.add(listener);
             }
         }
-        Collections.sort(listeners, ListenerComparator.INSTANCE);
+        Collections.sort( listeners, ListenerComparator.INSTANCE );
         return listeners.toArray(new InvocationListener[listeners.size()]);
     }
 
@@ -185,7 +206,8 @@ public class AgentContext {
         }
     }
 
-    private static class ListenerComparator implements Comparator<InvocationListener> {
+    private static class ListenerComparator implements Comparator<InvocationListener>
+    {
         private static final ListenerComparator INSTANCE = new ListenerComparator();
 
         private ListenerComparator() {

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java?rev=1561905&r1=1561904&r2=1561905&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java Mon Jan 27 23:39:23 2014
@@ -21,7 +21,11 @@ import java.io.File;
 import java.io.IOException;
 import java.lang.annotation.Annotation;
 import java.lang.instrument.Instrumentation;
+import java.lang.reflect.Method;
 import java.net.URL;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.jar.JarFile;
 
 public class SironaAgent {
@@ -72,6 +76,20 @@ public class SironaAgent {
         }
 
         try {
+            // setup agent parameters
+            Class<?> clazz = Class.forName("org.apache.sirona.javaagent.AgentContext", true, loader);
+            Method addAgentParameterMethod = clazz.getMethod( "addAgentParameter", new Class[]{ String.class, String.class } );
+            Map<String,String> agentParameters=extractParameters( agentArgs );
+            for (Map.Entry<String,String> entry : agentParameters.entrySet() ){
+                addAgentParameterMethod.invoke( null, new String[]{entry.getKey(), entry.getValue() == null ? "" : entry.getValue()} );
+
+            }
+        } catch ( final Exception e ) {
+            e.printStackTrace();
+        }
+
+
+        try {
             final SironaTransformer transformer = SironaTransformer.class.cast(loader.loadClass("org.apache.sirona.javaagent.SironaTransformer").newInstance());
             instrumentation.addTransformer(transformer, instrumentation.isRetransformClassesSupported());
 
@@ -149,4 +167,32 @@ public class SironaAgent {
         }
         return null;
     }
+
+    /**
+     *
+     * @param agentArgs foo=bar|beer=palepale|etc...
+     * @return
+     */
+    protected static Map<String, String> extractParameters(String agentArgs){
+        if(agentArgs==null||agentArgs.length()<1){
+            return Collections.emptyMap();
+        }
+
+        String[] separatorSplitted = agentArgs.split( "\\|" );
+
+        Map<String,String> params = new HashMap<String, String>( separatorSplitted.length / 2 );
+
+        for (final String agentArg:separatorSplitted){
+            int idx = agentArg.indexOf( '=' );
+            if (idx>=0){
+                String key = agentArg.substring( 0, idx);
+                String value = agentArg.substring(idx+1, agentArg.length());
+                params.put( key, value);
+            } else {
+                params.put( agentArg, "" );
+            }
+        }
+
+        return params;
+    }
 }

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/CounterListener.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/CounterListener.java?rev=1561905&r1=1561904&r2=1561905&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/CounterListener.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/CounterListener.java Mon Jan 27 23:39:23 2014
@@ -27,6 +27,9 @@ import org.apache.sirona.javaagent.spi.O
 @Order(0)
 @AutoSet
 public class CounterListener extends AbstractPerformanceInterceptor<String> implements InvocationListener {
+
+    public static final String DISABLE_PARAMETER_KEY = "disable-counter-listener";
+
     private static final int KEY = 0;
 
     private PredicateEvaluator includes = new PredicateEvaluator("true:true", ",");
@@ -34,7 +37,8 @@ public class CounterListener extends Abs
 
     @Override
     public boolean accept(final String key) {
-        return includes.matches(key) && !excludes.matches(key);
+        return !AgentContext.getAgentParameters().containsKey( DISABLE_PARAMETER_KEY ) //
+                && includes.matches(key) && !excludes.matches(key);
     }
 
     // @AutoSet

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java?rev=1561905&r1=1561904&r2=1561905&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java Mon Jan 27 23:39:23 2014
@@ -16,6 +16,7 @@
  */
 package org.apache.sirona.javaagent;
 
+import org.apache.commons.lang3.text.StrSubstitutor;
 import org.junit.internal.TextListener;
 import org.junit.runner.Description;
 import org.junit.runner.JUnitCore;
@@ -118,12 +119,39 @@ public class JavaAgentRunner extends Blo
 
     private static String[] buildProcessArgs(final FrameworkMethod mtd) throws IOException {
         final Collection<String> args = new ArrayList<String>();
-        args.add(findJava());
-        args.add("-javaagent:" + buildJavaagent());
-        if (Boolean.getBoolean("test.debug.remote")) {
-            args.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=" + Integer.getInteger("test.debug.remote.port", 5005));
+
+        args.add( findJava() );
+
+        AgentArgs agentArgs = mtd.getAnnotation( AgentArgs.class );
+
+        String maxMem = agentArgs == null ? "" : agentArgs.maxMem();
+
+        if ( maxMem.length() > 1 )
+        {
+            args.add( "-Xmx" + maxMem );
+        }
+
+        String minMem = agentArgs == null ? "" : agentArgs.minMem();
+
+        if ( minMem.length() > 1 )
+        {
+            args.add( "-Xms" + minMem );
+        }
+
+        String javaAgentArgs =
+            agentArgs == null ? null : StrSubstitutor.replace( agentArgs.value(), System.getProperties() );
+        args.add( "-javaagent:" + buildJavaagent() + "=" + ( javaAgentArgs == null ? "" : javaAgentArgs ) );
+
+        if ( Boolean.getBoolean( "test.debug.remote" ) )
+        {
+            args.add( "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=" + Integer.getInteger(
+                "test.debug.remote.port", 8080 ) );
+        }
+        if ( agentArgs != null && agentArgs.noVerify() )
+        {
+            args.add( "-noverify" );
         }
-        args.add("-cp");
+        args.add( "-cp" );
         args.add(removeAgentFromCp(System.getProperty("surefire.test.class.path", System.getProperty("java.class.path"))));
         args.add(JavaAgentRunner.class.getName());
         args.add(mtd.getMethod().getDeclaringClass().getName());

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/SimpleTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/SimpleTest.java?rev=1561905&r1=1561904&r2=1561905&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/SimpleTest.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/SimpleTest.java Mon Jan 27 23:39:23 2014
@@ -18,7 +18,9 @@ package org.apache.test.sirona.javaagent
 
 import org.apache.sirona.Role;
 import org.apache.sirona.counters.Counter;
+import org.apache.sirona.javaagent.AgentArgs;
 import org.apache.sirona.javaagent.JavaAgentRunner;
+import org.apache.sirona.javaagent.listener.CounterListener;
 import org.apache.sirona.repositories.Repository;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -99,6 +101,14 @@ public class SimpleTest {
         assertHits("org.apache.test.sirona.javaagent.SimpleTest$ServiceTransform.soPrimitive", 1);
     }
 
+    @Test
+    @AgentArgs( value = CounterListener.DISABLE_PARAMETER_KEY)
+    public void primitiveDisable() {
+        assertHits("org.apache.test.sirona.javaagent.SimpleTest$ServiceTransform.soPrimitive", 0);
+        new ServiceTransform().soPrimitive();
+        assertHits("org.apache.test.sirona.javaagent.SimpleTest$ServiceTransform.soPrimitive", 0);
+    }
+
     private static void assertException(final int count, final Class<?> exception) {
         int iae = 0;
         for (final Counter c : Repository.INSTANCE.counters()) {