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 )
{