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 2015/07/20 08:24:29 UTC

svn commit: r1691881 - in /incubator/sirona/trunk: agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/ agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/ api/src/main/java/org/apache/sirona/pathtracking/ core/src/main/j...

Author: olamy
Date: Mon Jul 20 06:24:29 2015
New Revision: 1691881

URL: http://svn.apache.org/r1691881
Log:
Optimisation to avoid to have all the call path tree in memory!!

Modified:
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingListener.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/MockPathTrackingInvocationListener.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationRecursiveTest.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingListenerTest.java
    incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/Context.java
    incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/PathTrackingInformation.java
    incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/PathTrackingInvocationListener.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTracker.java

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingListener.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingListener.java?rev=1691881&r1=1691880&r2=1691881&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingListener.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingListener.java Mon Jul 20 06:24:29 2015
@@ -73,14 +73,13 @@ import org.apache.sirona.tracking.PathTr
 
         SironaAgentLogging.debug( "call PathTracker#start with {0}", pathTrackingInformation );
 
-        context.put( PATH_TRACKER_KEY, PathTracker.start( pathTrackingInformation ) );
+        context.put( PATH_TRACKER_KEY, PathTracker.start( pathTrackingInformation, context.getReference() ) );
     }
 
-    //----------------------------------------------------------------
-    // key format: org.apache.test.sirona.javaagent.App.foo()
-    // or org.apache.test.sirona.javaagent.App.pub(java.lang.String)
-    //----------------------------------------------------------------
-
+    /**
+     * @param key format: org.apache.test.sirona.javaagent.App.foo() or org.apache.test.sirona.javaagent.App.pub(java.lang.String)
+     * @return
+     */
     static String extractClassName( String key )
     {
         if ( key == null )
@@ -127,7 +126,7 @@ import org.apache.sirona.tracking.PathTr
     }
 
     /**
-     * will call {@link org.apache.sirona.tracking.PathTracker#stop()}
+     * will call {@link org.apache.sirona.tracking.PathTracker#stop(Object reference)}
      *
      * @param context
      * @param result
@@ -139,6 +138,6 @@ import org.apache.sirona.tracking.PathTr
 
         SironaAgentLogging.debug( "PathTrackingListener#after: {0}", context.getKey() );
 
-        context.get( PATH_TRACKER_KEY, PathTracker.class ).stop();
+        context.get( PATH_TRACKER_KEY, PathTracker.class ).stop( context.getReference() );
     }
 }

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/MockPathTrackingInvocationListener.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/MockPathTrackingInvocationListener.java?rev=1691881&r1=1691880&r2=1691881&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/MockPathTrackingInvocationListener.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/MockPathTrackingInvocationListener.java Mon Jul 20 06:24:29 2015
@@ -35,6 +35,10 @@ public class MockPathTrackingInvocationL
     implements PathTrackingInvocationListener, InvocationListener
 {
 
+    public static boolean START_PATH_CALLED = false;
+
+    public static boolean END_PATH_CALLED = false;
+
     int startPathCallCount = 0;
 
     int enterMethodCallCount = 0;
@@ -53,26 +57,28 @@ public class MockPathTrackingInvocationL
     @Override
     public void startPath( Context context )
     {
+        START_PATH_CALLED = true;
         startPathCallCount++;
     }
 
     @Override
-    public void enterMethod( Context context )
+    public void enterMethod( PathTrackingInformation pathTrackingInformation  )
     {
-        entered.add( context.getPathTrackingInformation() );
+        entered.add( pathTrackingInformation );
         enterMethodCallCount++;
     }
 
     @Override
-    public void exitMethod( Context context )
+    public void exitMethod(  PathTrackingInformation pathTrackingInformation  )
     {
-        exit.add( context.getPathTrackingInformation() );
+        exit.add( pathTrackingInformation );
         exitMethodCallCount++;
     }
 
     @Override
     public void endPath( Context context )
     {
+        END_PATH_CALLED = true;
         endPathCallCount++;
     }
 

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationRecursiveTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationRecursiveTest.java?rev=1691881&r1=1691880&r2=1691881&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationRecursiveTest.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationRecursiveTest.java Mon Jul 20 06:24:29 2015
@@ -58,8 +58,15 @@ public class PathTrackingInvocationRecur
 
         System.out.println( all );
 
-        Assert.assertTrue( !all.isEmpty() );
+        boolean called = MockPathTrackingInvocationListener.START_PATH_CALLED;
+
+        Assert.assertTrue( called );
+
+        called = MockPathTrackingInvocationListener.END_PATH_CALLED;
 
+        Assert.assertTrue( called );
+
+        Assert.assertTrue( !all.isEmpty() );
 
         Assert.assertEquals( 4, all.size() );
 

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingListenerTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingListenerTest.java?rev=1691881&r1=1691880&r2=1691881&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingListenerTest.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingListenerTest.java Mon Jul 20 06:24:29 2015
@@ -69,7 +69,7 @@ public class PathTrackingListenerTest
 
         // so we have 4 entries constructor is ignored!
 
-        Assert.assertEquals( 4, entries.size() );
+        Assert.assertEquals( entries.toString(), 4, entries.size() );
 
         for ( PathTrackingEntry entry : entries )
         {
@@ -82,7 +82,7 @@ public class PathTrackingListenerTest
 
         Assert.assertEquals( "org.apache.test.sirona.javaagent.App", entry.getClassName() );
 
-        Assert.assertEquals( 1, entry.getLevel() );
+        Assert.assertEquals( "level should be 1", 1, entry.getLevel() );
 
         entry = entries.get( 1 );
 
@@ -90,7 +90,7 @@ public class PathTrackingListenerTest
 
         Assert.assertEquals( "org.apache.test.sirona.javaagent.App", entry.getClassName() );
 
-        Assert.assertEquals( 2, entry.getLevel() );
+        Assert.assertEquals( "level should be 2", 2, entry.getLevel() );
 
         // there is Thread.sleep( 500 ) so we can be sure a minimum for that
 
@@ -102,7 +102,7 @@ public class PathTrackingListenerTest
 
         Assert.assertEquals( "org.apache.test.sirona.javaagent.App", entry.getClassName() );
 
-        Assert.assertEquals( 3, entry.getLevel() );
+        Assert.assertEquals( "level should be 2", 2, entry.getLevel() );
 
         Assert.assertTrue( entry.getExecutionTime() >= 100 * 1000000 );
 
@@ -112,7 +112,7 @@ public class PathTrackingListenerTest
 
         Assert.assertEquals( "org.apache.test.sirona.javaagent.App", entry.getClassName() );
 
-        Assert.assertEquals( 4, entry.getLevel() );
+        Assert.assertEquals( "level should be 2", 3, entry.getLevel() );
 
         Assert.assertTrue( entry.getExecutionTime() >= 300 * 1000000 );
 
@@ -127,9 +127,9 @@ public class PathTrackingListenerTest
 
         Assert.assertEquals( 1, mock.endPathCallCount );
 
-        Assert.assertEquals( 3, mock.enterMethodCallCount );
+        Assert.assertEquals( mock.entered.toString(), 4, mock.enterMethodCallCount );
 
-        Assert.assertEquals( 3, mock.exitMethodCallCount );
+        Assert.assertEquals( mock.exit.toString(), 4, mock.exitMethodCallCount );
 
         InvocationListener[] listeners =
             AgentContext.listeners( "org.apache.test.sirona.javaagent.App.pub(java.lang.String,java.util.List,int)", //
@@ -150,9 +150,9 @@ public class PathTrackingListenerTest
 
         Assert.assertTrue( List.class.isAssignableFrom( parameters[1].getClass() ) );
 
-        Assert.assertTrue( ((List)parameters[1]).get( 0 ).equals( "Mountain Goat" ) );
+        Assert.assertTrue( ( (List) parameters[1] ).get( 0 ).equals( "Mountain Goat" ) );
 
-        Assert.assertTrue( ((List)parameters[1]).get( 1 ).equals( "Fatyak" ) );
+        Assert.assertTrue( ( (List) parameters[1] ).get( 1 ).equals( "Fatyak" ) );
 
         Assert.assertEquals( 2, parameters[2] );
 

Modified: incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/Context.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/Context.java?rev=1691881&r1=1691880&r2=1691881&view=diff
==============================================================================
--- incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/Context.java (original)
+++ incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/Context.java Mon Jul 20 06:24:29 2015
@@ -22,7 +22,7 @@ import java.util.UUID;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
- *  @since 0.2
+ * @since 0.2
  */
 public class Context
 {
@@ -32,7 +32,9 @@ public class Context
 
     private List<PathTrackingEntry> entries;
 
-    private PathTrackingInformation pathTrackingInformation;
+    private PathTrackingInformation startPathTrackingInformation;
+
+    private Object startPathObject;
 
     public Context()
     {
@@ -56,10 +58,7 @@ public class Context
         return entries;
     }
 
-    public PathTrackingInformation getPathTrackingInformation()
-    {
-        return pathTrackingInformation;
-    }
+
 
     public void setUuid( String uuid )
     {
@@ -76,8 +75,24 @@ public class Context
         this.entries = entries;
     }
 
-    public void setPathTrackingInformation( PathTrackingInformation pathTrackingInformation )
+    public Object getStartPathObject()
+    {
+        return startPathObject;
+    }
+
+    public void setStartPathObject( Object startPathObject )
     {
-        this.pathTrackingInformation = pathTrackingInformation;
+        this.startPathObject = startPathObject;
     }
+
+    public PathTrackingInformation getStartPathTrackingInformation()
+    {
+        return startPathTrackingInformation;
+    }
+
+    public void setStartPathTrackingInformation( PathTrackingInformation startPathTrackingInformation )
+    {
+        this.startPathTrackingInformation = startPathTrackingInformation;
+    }
+
 }

Modified: incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/PathTrackingInformation.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/PathTrackingInformation.java?rev=1691881&r1=1691880&r2=1691881&view=diff
==============================================================================
--- incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/PathTrackingInformation.java (original)
+++ incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/PathTrackingInformation.java Mon Jul 20 06:24:29 2015
@@ -26,11 +26,7 @@ public class PathTrackingInformation
 
     private String methodName;
 
-    private PathTrackingInformation parent;
-
-    private long start;
-
-    private long end;
+    private final long start;
 
     private int level;
 
@@ -38,6 +34,7 @@ public class PathTrackingInformation
     {
         this.className = className;
         this.methodName = methodName;
+        this.start = System.nanoTime();
     }
 
     public String getClassName()
@@ -50,36 +47,11 @@ public class PathTrackingInformation
         return methodName;
     }
 
-    public PathTrackingInformation getParent()
-    {
-        return parent;
-    }
-
-    public void setParent( PathTrackingInformation parent )
-    {
-        this.parent = parent;
-    }
-
-    public void setStart( final long start )
-    {
-        this.start = start;
-    }
-
     public long getStart()
     {
         return start;
     }
 
-    public long getEnd()
-    {
-        return end;
-    }
-
-    public void setEnd( final long end )
-    {
-        this.end = end;
-    }
-
     public int getLevel()
     {
         return level;
@@ -93,7 +65,11 @@ public class PathTrackingInformation
     @Override
     public String toString()
     {
-        return "PathTrackingInformation{className='" + className + "', methodName='" + methodName + "\', parent="
-            + parent + '}';
+        return "PathTrackingInformation{" +
+            "className='" + className + '\'' +
+            ", methodName='" + methodName + '\'' +
+            ", start=" + start +
+            ", level=" + level +
+            '}';
     }
 }

Modified: incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/PathTrackingInvocationListener.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/PathTrackingInvocationListener.java?rev=1691881&r1=1691880&r2=1691881&view=diff
==============================================================================
--- incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/PathTrackingInvocationListener.java (original)
+++ incubator/sirona/trunk/api/src/main/java/org/apache/sirona/pathtracking/PathTrackingInvocationListener.java Mon Jul 20 06:24:29 2015
@@ -24,9 +24,9 @@ public interface PathTrackingInvocationL
 
     void startPath( Context context );
 
-    void enterMethod( Context context );
+    void enterMethod( PathTrackingInformation pathTrackingInformation );// Context context );
 
-    void exitMethod( Context context );
+    void exitMethod( PathTrackingInformation pathTrackingInformation );// Context context );
 
     void endPath( Context context );
 

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTracker.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTracker.java?rev=1691881&r1=1691880&r2=1691881&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTracker.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTracker.java Mon Jul 20 06:24:29 2015
@@ -59,7 +59,7 @@ public class PathTracker
         }
     };
 
-    private final PathTrackingInformation pathTrackingInformation;
+    private final PathTrackingInformation currentPathTrackingInformation;
 
     private static final boolean USE_EXECUTORS = Boolean.parseBoolean(
         Configuration.getProperty( Configuration.CONFIG_PROPERTY_PREFIX + "pathtracking.useexecutors", "false" ) );
@@ -120,7 +120,7 @@ public class PathTracker
 
     private PathTracker( final PathTrackingInformation pathTrackingInformation )
     {
-        this.pathTrackingInformation = pathTrackingInformation;
+        this.currentPathTrackingInformation = pathTrackingInformation;
     }
 
 
@@ -131,81 +131,76 @@ public class PathTracker
 
     // An other solution could be using Thread.currentThread().getStackTrace() <- very slow
 
-    public static PathTracker start( PathTrackingInformation pathTrackingInformation )
+    public static PathTracker start( PathTrackingInformation currentPathTrackingInformation, final Object reference )
     {
 
         final Context context = THREAD_LOCAL.get();
 
         int level = 0;
-        final PathTrackingInformation current = context.getPathTrackingInformation();
-        if ( current == null )
+        final PathTrackingInformation startPathTrackingInformation = context.getStartPathTrackingInformation();
+
+        if ( startPathTrackingInformation == null )
         {
             level = context.getLevel().incrementAndGet();
-            pathTrackingInformation.setLevel( level );
+            currentPathTrackingInformation.setLevel( level );
+            context.setStartPathTrackingInformation( currentPathTrackingInformation );
         }
         else
         {
             // same class so no inc
-            if ( current != pathTrackingInformation )
+            if ( currentPathTrackingInformation != startPathTrackingInformation )
             {
                 level = context.getLevel().incrementAndGet();
-                pathTrackingInformation.setLevel( level );
-                pathTrackingInformation.setParent( current );
+                currentPathTrackingInformation.setLevel( level );
             }
-
-
         }
-        pathTrackingInformation.setStart( System.nanoTime() );
-
-        context.setPathTrackingInformation( pathTrackingInformation );
 
         for ( PathTrackingInvocationListener listener : LISTENERS )
         {
             if ( level == 1 )
             {
                 listener.startPath( context );
+                context.setStartPathObject( reference );
             }
-            else
-            {
-                listener.enterMethod( context );
-            }
+
+            listener.enterMethod( currentPathTrackingInformation );
         }
 
-        return new PathTracker( pathTrackingInformation );
+        return new PathTracker( currentPathTrackingInformation );
     }
 
 
-    public void stop()
+    public void stop( final Object reference )
     {
         final long end = System.nanoTime();
-        final long start = pathTrackingInformation.getStart();
+        final long start = currentPathTrackingInformation.getStart();
         final Context context = THREAD_LOCAL.get();
 
         final String uuid = context.getUuid();
 
-        final PathTrackingInformation current = context.getPathTrackingInformation();
+        final PathTrackingInformation startPathTrackingInformation = context.getStartPathTrackingInformation();
+
         // same invocation so no inc, class can do recursion so don't use classname/methodname
-        if ( pathTrackingInformation != current )
+        if ( startPathTrackingInformation != this.currentPathTrackingInformation )
         {
             context.getLevel().decrementAndGet();
-            context.setPathTrackingInformation( pathTrackingInformation.getParent() );
         }
 
-        if ( context.getPathTrackingInformation() != null )
+        if ( this.currentPathTrackingInformation != null )
         {
             for ( PathTrackingInvocationListener listener : LISTENERS )
             {
-                listener.exitMethod( context );
+                listener.exitMethod( this.currentPathTrackingInformation );
 
             }
         }
 
         final PathTrackingEntry pathTrackingEntry =
-            new PathTrackingEntry( uuid, NODE, pathTrackingInformation.getClassName(), //
-                                   pathTrackingInformation.getMethodName(), //
+            new PathTrackingEntry( uuid, NODE, this.currentPathTrackingInformation.getClassName(), //
+                                   this.currentPathTrackingInformation.getMethodName(), //
                                    start, //
                                    ( end - start ), //
-                                   pathTrackingInformation.getLevel() );
+                                   this.currentPathTrackingInformation.getLevel() );
         if ( USE_SINGLE_STORE )
         {
             PATH_TRACKING_DATA_STORE.store( pathTrackingEntry );
@@ -215,7 +210,8 @@ public class PathTracker
             context.getEntries().add( pathTrackingEntry );
         }
 
-        if ( pathTrackingInformation.getLevel() == 1 && pathTrackingInformation.getParent() == null )
+        if ( this.currentPathTrackingInformation.getLevel() == 1 && //
+            ( context.getStartPathObject() != null && context.getStartPathObject() == reference ) )
         { // 0 is never reached so 1 is first
             if ( !USE_SINGLE_STORE )
             {