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 + '}';
     }
 }