You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by rm...@apache.org on 2014/02/18 08:38:25 UTC
svn commit: r1569219 - in /incubator/sirona/trunk:
agent/javaagent/src/main/java/org/apache/sirona/pathtracking/
agent/javaagent/src/test/java/org/apache/sirona/pathtracking/
core/src/main/java/org/apache/sirona/tracking/
Author: rmannibucau
Date: Tue Feb 18 07:38:25 2014
New Revision: 1569219
URL: http://svn.apache.org/r1569219
Log:
reworking a bit PathTracker API, batch storage todo
Modified:
incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/pathtracking/PathTrackingInvocationListener.java
incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/pathtracking/PathTrackingInvocationListenerTest.java
incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTracker.java
incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTrackingEntry.java
Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/pathtracking/PathTrackingInvocationListener.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/pathtracking/PathTrackingInvocationListener.java?rev=1569219&r1=1569218&r2=1569219&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/pathtracking/PathTrackingInvocationListener.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/pathtracking/PathTrackingInvocationListener.java Tue Feb 18 07:38:25 2014
@@ -21,7 +21,6 @@ import org.apache.sirona.configuration.i
import org.apache.sirona.javaagent.AgentContext;
import org.apache.sirona.javaagent.SironaAgent;
import org.apache.sirona.javaagent.listener.ConfigurableListener;
-import org.apache.sirona.javaagent.spi.InvocationListener;
import org.apache.sirona.store.DataStoreFactory;
import org.apache.sirona.store.tracking.PathTrackingDataStore;
import org.apache.sirona.tracking.PathTracker;
@@ -30,10 +29,7 @@ import org.apache.sirona.tracking.PathTr
/**
* @author Olivier Lamy
*/
-public class PathTrackingInvocationListener
- extends ConfigurableListener
- implements InvocationListener
-{
+public class PathTrackingInvocationListener extends ConfigurableListener {
private static final Integer TIMESTAMP_KEY = "Sirona-path-tracking-key".hashCode();
@@ -42,17 +38,9 @@ public class PathTrackingInvocationListe
private static final boolean TRACKING_ACTIVATED =
Configuration.is( Configuration.CONFIG_PROPERTY_PREFIX + "javaagent.path.tracking.activate", false );
- private PathTrackingDataStore pathTrackingDataStore =
- IoCs.findOrCreateInstance( DataStoreFactory.class ).getPathTrackingDataStore();
-
private PathTracker.PathTrackingInformation pathTrackingInformation;
- /**
- * fqcn.methodName
- */
- private String key;
-
@Override
public boolean accept( String key )
{
@@ -74,12 +62,10 @@ public class PathTrackingInvocationListe
return false;
}
- this.key = key;
-
- int lastDot = this.key.lastIndexOf( "." );
+ int lastDot = key.lastIndexOf( "." );
- String className = this.key.substring( 0, lastDot );
- String methodName = this.key.substring( lastDot + 1, this.key.length() );
+ String className = key.substring( 0, lastDot );
+ String methodName = key.substring(lastDot + 1, key.length());
this.pathTrackingInformation = new PathTracker.PathTrackingInformation( className, methodName );
@@ -93,10 +79,7 @@ public class PathTrackingInvocationListe
{
System.out.println( "PathTrackingInvocationListener#before:" + context.getKey() );
}
- context.put( TIMESTAMP_KEY, Long.valueOf( System.nanoTime() ) );
context.put( PATH_TRACKING_LEVEL_KEY, PathTracker.start( this.pathTrackingInformation ) );
-
- context.getKey();
}
@Override
@@ -108,26 +91,6 @@ public class PathTrackingInvocationListe
System.out.println( "PathTrackingInvocationListener#after: " + context.getKey() );
}
- Long end = System.nanoTime();
- Long start = Long.class.cast( context.get( TIMESTAMP_KEY, Long.class ) );
-
- String uuid = PathTracker.get();
-
- // FIXME get node from configuration!
- // FIXME correctly configure the level!
- PathTrackingEntry pathTrackingEntry =
- new PathTrackingEntry( uuid, "node", pathTrackingInformation.getClassName(), pathTrackingInformation.getMethodName(),
- start, ( end - start ),
- context.get( PATH_TRACKING_LEVEL_KEY, Integer.class ) );
-
- if ( SironaAgent.AGENT_DEBUG )
- {
- System.out.println( "PathTrackingInvocationListener: after: " + pathTrackingEntry.toString()
- + ", pathTrackingDataStore type:" + pathTrackingDataStore.getClass().getName() );
- }
- PathTracker.stop( pathTrackingInformation );
-
- pathTrackingDataStore.store( pathTrackingEntry );
-
+ context.get(PATH_TRACKING_LEVEL_KEY, PathTracker.class).stop(pathTrackingInformation);
}
}
Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/pathtracking/PathTrackingInvocationListenerTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/pathtracking/PathTrackingInvocationListenerTest.java?rev=1569219&r1=1569218&r2=1569219&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/pathtracking/PathTrackingInvocationListenerTest.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/pathtracking/PathTrackingInvocationListenerTest.java Tue Feb 18 07:38:25 2014
@@ -62,7 +62,7 @@ public class PathTrackingInvocationListe
PathTrackingEntry first = entries.get( 0 );
System.out.println( "first entry: " + first );
-
+/* TODO: fix stop() to get consistent storage
PathTrackingEntry second = entries.get( 1 );
System.out.println( "second entry: " + second );
@@ -70,7 +70,7 @@ public class PathTrackingInvocationListe
PathTrackingEntry last = entries.get( entries.size() - 1 );
System.out.println( "last entry: " + last );
-
+*/
for ( PathTrackingEntry entry : entries )
{
System.out.println( "entry:" + entry );
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=1569219&r1=1569218&r2=1569219&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 Tue Feb 18 07:38:25 2014
@@ -16,6 +16,10 @@
*/
package org.apache.sirona.tracking;
+import org.apache.sirona.configuration.ioc.IoCs;
+import org.apache.sirona.store.DataStoreFactory;
+import org.apache.sirona.store.tracking.PathTrackingDataStore;
+
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
@@ -24,6 +28,8 @@ import java.util.concurrent.atomic.Atomi
*/
public class PathTracker
{
+ private static final PathTrackingDataStore PATH_TRACKING_DATA_STORE =
+ IoCs.findOrCreateInstance(DataStoreFactory.class).getPathTrackingDataStore();
// FIXME olamy: so not using InheritableThreadLocal will create a new uuid in case of thread creation
// whereas it's technically the same "transaction" (ie jvm call path)
@@ -61,10 +67,17 @@ public class PathTracker
@Override
protected AtomicInteger initialValue()
{
- return new AtomicInteger( 1 );
+ return new AtomicInteger( 0 );
}
};
+ // TODO: we should use a single threadlocal (PatTracker itself?, other info are in it normally) and not 3
+ private static void cleanUp() {
+ THREAD_LOCAL_TX.remove();
+ THREAD_LOCAL_LEVEL_INFO.remove();
+ THREAD_LOCAL_LEVEL.remove();
+ }
+
public static class PathTrackingInformation
{
private String className;
@@ -73,6 +86,11 @@ public class PathTracker
private PathTrackingInformation parent;
+ private long start;
+ private long end;
+
+ private int level;
+
public PathTrackingInformation( String className, String methodName )
{
this.className = className;
@@ -99,6 +117,30 @@ public class PathTracker
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;
+ }
+
+ public void setLevel(final int level) {
+ this.level = level;
+ }
+
@Override
public String toString()
{
@@ -113,10 +155,7 @@ public class PathTracker
* prevent to inc level in same class used
*/
private static final ThreadLocal<PathTrackingInformation> THREAD_LOCAL_LEVEL_INFO =
- new ThreadLocal<PathTrackingInformation>()
- {
- // no op
- };
+ new ThreadLocal<PathTrackingInformation>();
// Returns the current thread's unique ID, assigning it if necessary
@@ -131,62 +170,64 @@ public class PathTracker
}
- // An other solution could be using Thread.currentThread().getStackTrace()
+ // An other solution could be using Thread.currentThread().getStackTrace() <- very slow
- public static int start( PathTrackingInformation pathTrackingInformation )
+ public static PathTracker start( PathTrackingInformation pathTrackingInformation )
{
final int level;
PathTrackingInformation current = THREAD_LOCAL_LEVEL_INFO.get();
if ( current == null )
{
level = THREAD_LOCAL_LEVEL.get().incrementAndGet();
+ pathTrackingInformation.setLevel(level);
}
else
{
// same class so no inc
- if ( current.className.equals( pathTrackingInformation.className ) //
- && current.methodName.equals( pathTrackingInformation.methodName ) )
- {
- // yup sounds to be the same level so no level inc!
- level = THREAD_LOCAL_LEVEL.get().get();
- }
- else
+ if ( current != pathTrackingInformation )
{
level = THREAD_LOCAL_LEVEL.get().incrementAndGet();
+ pathTrackingInformation.setLevel(level);
}
pathTrackingInformation.setParent( current );
}
+ pathTrackingInformation.setStart(System.nanoTime());
THREAD_LOCAL_LEVEL_INFO.set( pathTrackingInformation );
//System.out.println("start level: " + level + " for key " + key);
- return level;
+ return new PathTracker(); // TODO: see if this shouldn't be it which should be in *the* ThreadLocal
}
- public static int stop( PathTrackingInformation pathTrackingInformation )
+ public void stop( PathTrackingInformation pathTrackingInformation )
{
- final int level;
+ final long end = System.nanoTime();
+ final long start = pathTrackingInformation.getStart();
- PathTrackingInformation current = THREAD_LOCAL_LEVEL_INFO.get();
- // same class so no inc
- if ( current.className.equals( pathTrackingInformation.className ) //
- && current.methodName.equals( pathTrackingInformation.methodName ) )
- {
- // yup sounds to be the same level so no level inc!
- level = THREAD_LOCAL_LEVEL.get().get();
- }
- else
+ final String uuid = PathTracker.get();
+
+ // FIXME get node from configuration!
+ // FIXME correctly configure the level!
+ final PathTrackingEntry pathTrackingEntry =
+ new PathTrackingEntry( uuid, "node", pathTrackingInformation.getClassName(), pathTrackingInformation.getMethodName(),
+ start, ( end - start ), THREAD_LOCAL_LEVEL.get().get());
+
+ final PathTrackingInformation current = THREAD_LOCAL_LEVEL_INFO.get();
+ // same invocation so no inc, class can do recursion so don't use classname/methodname
+ if ( pathTrackingInformation != current )
{
- level = THREAD_LOCAL_LEVEL.get().decrementAndGet();
+ THREAD_LOCAL_LEVEL.get().decrementAndGet();
}
THREAD_LOCAL_LEVEL_INFO.set( pathTrackingInformation );
- //System.out.println("start level: " + level + " for key " + key);
-
- return level;
+ // FIXME: same all duration/level browsing the tree, do we need TrackingEntry or should information just be used?
+ if (pathTrackingInformation.getLevel() == 1) { // 0 is never reached so 1 is first
+ PATH_TRACKING_DATA_STORE.store(pathTrackingEntry);
+ PathTracker.cleanUp();
+ }
}
Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTrackingEntry.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTrackingEntry.java?rev=1569219&r1=1569218&r2=1569219&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTrackingEntry.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/tracking/PathTrackingEntry.java Tue Feb 18 07:38:25 2014
@@ -145,15 +145,12 @@ public class PathTrackingEntry
@Override
public String toString()
{
- final StringBuilder sb = new StringBuilder( "PathTrackingEntry{" );
- sb.append( "trackingId='" ).append( trackingId ).append( '\'' );
- sb.append( ", nodeId='" ).append( nodeId ).append( '\'' );
- sb.append( ", className='" ).append( className ).append( '\'' );
- sb.append( ", methodName='" ).append( methodName ).append( '\'' );
- sb.append( ", startTime=" ).append( startTime );
- sb.append( ", executionTime=" ).append( executionTime );
- sb.append( ", level=" ).append( level );
- sb.append( '}' );
- return sb.toString();
+ return "PathTrackingEntry{" + "trackingId='" + trackingId
+ + '\'' + ", nodeId='" + nodeId
+ + '\'' + ", className='" + className + '\''
+ + ", methodName='" + methodName
+ + '\'' + ", startTime=" + startTime
+ + ", executionTime=" + executionTime
+ + ", level=" + level + '}';
}
}