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/20 07:44:49 UTC
svn commit: r1570088 - in /incubator/sirona/trunk:
agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationListener.java
core/src/main/java/org/apache/sirona/tracking/PathTracker.java
Author: rmannibucau
Date: Thu Feb 20 06:44:48 2014
New Revision: 1570088
URL: http://svn.apache.org/r1570088
Log:
using a single threadlocal + guessing node name
Modified:
incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/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/PathTrackingInvocationListener.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationListener.java?rev=1570088&r1=1570087&r2=1570088&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationListener.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationListener.java Thu Feb 20 06:44:48 2014
@@ -52,12 +52,8 @@ public class PathTrackingInvocationListe
"PathTrackingInvocationListener#accept, TRACKING_ACTIVATED:" + TRACKING_ACTIVATED + ", key: " + key );
}
- if ( !TRACKING_ACTIVATED )
- {
- return false;
- }
+ return TRACKING_ACTIVATED;
- return true;
}
/**
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=1570088&r1=1570087&r2=1570088&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 Thu Feb 20 06:44:48 2014
@@ -16,6 +16,7 @@
*/
package org.apache.sirona.tracking;
+import org.apache.sirona.configuration.Configuration;
import org.apache.sirona.configuration.ioc.IoCs;
import org.apache.sirona.store.DataStoreFactory;
import org.apache.sirona.store.tracking.PathTrackingDataStore;
@@ -30,63 +31,35 @@ import java.util.concurrent.atomic.Atomi
*/
public class PathTracker
{
+ private static final String NODE =
+ Configuration.getProperty(Configuration.CONFIG_PROPERTY_PREFIX + "javaagent.path.tracking.marker",
+ Configuration.getProperty("org.apache.sirona.cube.CubeBuilder.marker", "node"));
+
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)
- //private static final InheritableThreadLocal<String> THREAD_LOCAL_TX = new InheritableThreadLocal<String>()
-
- /**
- * Thread local to store a "transaction id" (i.e a java call)
- */
- private static final ThreadLocal<String> THREAD_LOCAL_TX = new ThreadLocal<String>()
- {
+ private static final ThreadLocal<Context> THREAD_LOCAL = new ThreadLocal<Context>() {
@Override
- protected String initialValue()
- {
- return "Sirona-" + UUID.randomUUID().toString();// + System.nanoTime();//
+ protected Context initialValue() {
+ return new Context();
}
-
- /*
- @Override
- protected String childValue( String s )
- {
- return this.get();
- }
- */
-
};
- // FIXME olamy: AtomicInteger because of starting multiple level but that's not supported with the THREAD_LOCAL_TX
- // because it doesn't use an InheritableThreadLocal so really sure :-)
-
- /**
- * Thread Local to store current call tree level
- */
- private static final ThreadLocal<AtomicInteger> THREAD_LOCAL_LEVEL = new ThreadLocal<AtomicInteger>()
- {
- @Override
- protected AtomicInteger initialValue()
- {
- return new AtomicInteger( 0 );
- }
- };
-
- private static final ThreadLocal<List<PathTrackingEntry>> THREAD_LOCAL_ENTRIES = new ThreadLocal<List<PathTrackingEntry>>(){
- @Override
- protected List<PathTrackingEntry> initialValue()
- {
- return new ArrayList<PathTrackingEntry>( );
+ private static class Context {
+ private String uuid;
+ private AtomicInteger level;
+ private List<PathTrackingEntry> entries;
+ private PathTrackingInformation trackingInformation;
+
+ private Context() {
+ this.uuid = "Sirona-" + UUID.randomUUID().toString();
+ this.level = new AtomicInteger(0);
+ this.entries = new ArrayList<PathTrackingEntry>();
}
- };
+ }
- // 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();
- THREAD_LOCAL_ENTRIES.remove();
+ THREAD_LOCAL.remove();
}
public static class PathTrackingInformation
@@ -161,23 +134,16 @@ public class PathTracker
}
}
- /**
- * Thread local to store the current Class#Method used
- * prevent to inc level in same class used
- */
- private static final ThreadLocal<PathTrackingInformation> THREAD_LOCAL_LEVEL_INFO =
- new ThreadLocal<PathTrackingInformation>();
-
// Returns the current thread's unique ID, assigning it if necessary
public static String get()
{
- return THREAD_LOCAL_TX.get();
+ return THREAD_LOCAL.get().uuid;
}
- public static void set( String uuid )
+ public static void set( final String uuid )
{
- THREAD_LOCAL_TX.set( uuid );
+ THREAD_LOCAL.get().uuid = uuid;
}
@@ -185,11 +151,13 @@ public class PathTracker
public static PathTracker start( PathTrackingInformation pathTrackingInformation )
{
+ final Context context = THREAD_LOCAL.get();
+
final int level;
- PathTrackingInformation current = THREAD_LOCAL_LEVEL_INFO.get();
+ final PathTrackingInformation current = context.trackingInformation;
if ( current == null )
{
- level = THREAD_LOCAL_LEVEL.get().incrementAndGet();
+ level = context.level.incrementAndGet();
pathTrackingInformation.setLevel(level);
}
else
@@ -197,7 +165,7 @@ public class PathTracker
// same class so no inc
if ( current != pathTrackingInformation )
{
- level = THREAD_LOCAL_LEVEL.get().incrementAndGet();
+ level = context.level.incrementAndGet();
pathTrackingInformation.setLevel(level);
pathTrackingInformation.setParent( current );
}
@@ -206,7 +174,7 @@ public class PathTracker
}
pathTrackingInformation.setStart(System.nanoTime());
- THREAD_LOCAL_LEVEL_INFO.set( pathTrackingInformation );
+ context.trackingInformation = pathTrackingInformation;
//System.out.println("start level: " + level + " for key " + key);
@@ -217,27 +185,26 @@ public class PathTracker
{
final long end = System.nanoTime();
final long start = pathTrackingInformation.getStart();
+ final Context context = THREAD_LOCAL.get();
final String uuid = PathTracker.get();
- final PathTrackingInformation current = THREAD_LOCAL_LEVEL_INFO.get();
+ final PathTrackingInformation current = context.trackingInformation;
// same invocation so no inc, class can do recursion so don't use classname/methodname
if ( pathTrackingInformation != current )
{
- THREAD_LOCAL_LEVEL.get().decrementAndGet();
- THREAD_LOCAL_LEVEL_INFO.set( pathTrackingInformation.getParent() );
+ context.level.decrementAndGet();
+ context.trackingInformation = pathTrackingInformation.getParent();
}
- // FIXME get node from configuration!
final PathTrackingEntry pathTrackingEntry =
- new PathTrackingEntry( uuid, "node", pathTrackingInformation.getClassName(), pathTrackingInformation.getMethodName(),
+ new PathTrackingEntry( uuid, NODE, pathTrackingInformation.getClassName(), pathTrackingInformation.getMethodName(),
start, ( end - start ), pathTrackingInformation.getLevel());
- THREAD_LOCAL_ENTRIES.get().add( pathTrackingEntry );
+ context.entries.add(pathTrackingEntry);
if (pathTrackingInformation.getLevel() == 1 && pathTrackingInformation.getParent() == null) { // 0 is never reached so 1 is first
- List<PathTrackingEntry> pathTrackingEntries = THREAD_LOCAL_ENTRIES.get();
- PATH_TRACKING_DATA_STORE.store( pathTrackingEntries );
+ PATH_TRACKING_DATA_STORE.store( context.entries );
PathTracker.cleanUp();
}
}
Re: svn commit: r1570088 - in /incubator/sirona/trunk:
agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationListener.java
core/src/main/java/org/apache/sirona/tracking/PathTracker.java
Posted by Olivier Lamy <ol...@apache.org>.
On 20 February 2014 17:44, <rm...@apache.org> wrote:
> Author: rmannibucau
> Date: Thu Feb 20 06:44:48 2014
> New Revision: 1570088
>
> URL: http://svn.apache.org/r1570088
> Log:
> using a single threadlocal + guessing node name
>
> Modified:
> incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/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/PathTrackingInvocationListener.java
> URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationListener.java?rev=1570088&r1=1570087&r2=1570088&view=diff
> ==============================================================================
> --- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationListener.java (original)
> +++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationListener.java Thu Feb 20 06:44:48 2014
> @@ -52,12 +52,8 @@ public class PathTrackingInvocationListe
> "PathTrackingInvocationListener#accept, TRACKING_ACTIVATED:" + TRACKING_ACTIVATED + ", key: " + key );
> }
>
> - if ( !TRACKING_ACTIVATED )
> - {
> - return false;
> - }
> + return TRACKING_ACTIVATED;
>
> - return true;
> }
>
> /**
>
> 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=1570088&r1=1570087&r2=1570088&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 Thu Feb 20 06:44:48 2014
> @@ -16,6 +16,7 @@
> */
> package org.apache.sirona.tracking;
>
> +import org.apache.sirona.configuration.Configuration;
> import org.apache.sirona.configuration.ioc.IoCs;
> import org.apache.sirona.store.DataStoreFactory;
> import org.apache.sirona.store.tracking.PathTrackingDataStore;
> @@ -30,63 +31,35 @@ import java.util.concurrent.atomic.Atomi
> */
> public class PathTracker
> {
> + private static final String NODE =
> + Configuration.getProperty(Configuration.CONFIG_PROPERTY_PREFIX + "javaagent.path.tracking.marker",
> + Configuration.getProperty("org.apache.sirona.cube.CubeBuilder.marker", "node"));
cube?
> +
> 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)
> - //private static final InheritableThreadLocal<String> THREAD_LOCAL_TX = new InheritableThreadLocal<String>()
> -
> - /**
> - * Thread local to store a "transaction id" (i.e a java call)
> - */
> - private static final ThreadLocal<String> THREAD_LOCAL_TX = new ThreadLocal<String>()
> - {
> + private static final ThreadLocal<Context> THREAD_LOCAL = new ThreadLocal<Context>() {
> @Override
> - protected String initialValue()
> - {
> - return "Sirona-" + UUID.randomUUID().toString();// + System.nanoTime();//
> + protected Context initialValue() {
> + return new Context();
> }
> -
> - /*
> - @Override
> - protected String childValue( String s )
> - {
> - return this.get();
> - }
> - */
> -
> };
>
> - // FIXME olamy: AtomicInteger because of starting multiple level but that's not supported with the THREAD_LOCAL_TX
> - // because it doesn't use an InheritableThreadLocal so really sure :-)
> -
> - /**
> - * Thread Local to store current call tree level
> - */
> - private static final ThreadLocal<AtomicInteger> THREAD_LOCAL_LEVEL = new ThreadLocal<AtomicInteger>()
> - {
> - @Override
> - protected AtomicInteger initialValue()
> - {
> - return new AtomicInteger( 0 );
> - }
> - };
> -
> - private static final ThreadLocal<List<PathTrackingEntry>> THREAD_LOCAL_ENTRIES = new ThreadLocal<List<PathTrackingEntry>>(){
> - @Override
> - protected List<PathTrackingEntry> initialValue()
> - {
> - return new ArrayList<PathTrackingEntry>( );
> + private static class Context {
> + private String uuid;
> + private AtomicInteger level;
> + private List<PathTrackingEntry> entries;
> + private PathTrackingInformation trackingInformation;
> +
> + private Context() {
> + this.uuid = "Sirona-" + UUID.randomUUID().toString();
> + this.level = new AtomicInteger(0);
> + this.entries = new ArrayList<PathTrackingEntry>();
> }
> - };
> + }
>
> - // 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();
> - THREAD_LOCAL_ENTRIES.remove();
> + THREAD_LOCAL.remove();
> }
>
> public static class PathTrackingInformation
> @@ -161,23 +134,16 @@ public class PathTracker
> }
> }
>
> - /**
> - * Thread local to store the current Class#Method used
> - * prevent to inc level in same class used
> - */
> - private static final ThreadLocal<PathTrackingInformation> THREAD_LOCAL_LEVEL_INFO =
> - new ThreadLocal<PathTrackingInformation>();
> -
>
> // Returns the current thread's unique ID, assigning it if necessary
> public static String get()
> {
> - return THREAD_LOCAL_TX.get();
> + return THREAD_LOCAL.get().uuid;
> }
>
> - public static void set( String uuid )
> + public static void set( final String uuid )
> {
> - THREAD_LOCAL_TX.set( uuid );
> + THREAD_LOCAL.get().uuid = uuid;
> }
>
>
> @@ -185,11 +151,13 @@ public class PathTracker
>
> public static PathTracker start( PathTrackingInformation pathTrackingInformation )
> {
> + final Context context = THREAD_LOCAL.get();
> +
> final int level;
> - PathTrackingInformation current = THREAD_LOCAL_LEVEL_INFO.get();
> + final PathTrackingInformation current = context.trackingInformation;
> if ( current == null )
> {
> - level = THREAD_LOCAL_LEVEL.get().incrementAndGet();
> + level = context.level.incrementAndGet();
> pathTrackingInformation.setLevel(level);
> }
> else
> @@ -197,7 +165,7 @@ public class PathTracker
> // same class so no inc
> if ( current != pathTrackingInformation )
> {
> - level = THREAD_LOCAL_LEVEL.get().incrementAndGet();
> + level = context.level.incrementAndGet();
> pathTrackingInformation.setLevel(level);
> pathTrackingInformation.setParent( current );
> }
> @@ -206,7 +174,7 @@ public class PathTracker
> }
> pathTrackingInformation.setStart(System.nanoTime());
>
> - THREAD_LOCAL_LEVEL_INFO.set( pathTrackingInformation );
> + context.trackingInformation = pathTrackingInformation;
>
> //System.out.println("start level: " + level + " for key " + key);
>
> @@ -217,27 +185,26 @@ public class PathTracker
> {
> final long end = System.nanoTime();
> final long start = pathTrackingInformation.getStart();
> + final Context context = THREAD_LOCAL.get();
>
> final String uuid = PathTracker.get();
>
> - final PathTrackingInformation current = THREAD_LOCAL_LEVEL_INFO.get();
> + final PathTrackingInformation current = context.trackingInformation;
> // same invocation so no inc, class can do recursion so don't use classname/methodname
> if ( pathTrackingInformation != current )
> {
> - THREAD_LOCAL_LEVEL.get().decrementAndGet();
> - THREAD_LOCAL_LEVEL_INFO.set( pathTrackingInformation.getParent() );
> + context.level.decrementAndGet();
> + context.trackingInformation = pathTrackingInformation.getParent();
> }
>
> - // FIXME get node from configuration!
> final PathTrackingEntry pathTrackingEntry =
> - new PathTrackingEntry( uuid, "node", pathTrackingInformation.getClassName(), pathTrackingInformation.getMethodName(),
> + new PathTrackingEntry( uuid, NODE, pathTrackingInformation.getClassName(), pathTrackingInformation.getMethodName(),
> start, ( end - start ), pathTrackingInformation.getLevel());
>
> - THREAD_LOCAL_ENTRIES.get().add( pathTrackingEntry );
> + context.entries.add(pathTrackingEntry);
>
> if (pathTrackingInformation.getLevel() == 1 && pathTrackingInformation.getParent() == null) { // 0 is never reached so 1 is first
> - List<PathTrackingEntry> pathTrackingEntries = THREAD_LOCAL_ENTRIES.get();
> - PATH_TRACKING_DATA_STORE.store( pathTrackingEntries );
> + PATH_TRACKING_DATA_STORE.store( context.entries );
> PathTracker.cleanUp();
> }
> }
>
>
--
Olivier Lamy
Ecetera: http://ecetera.com.au
http://twitter.com/olamy | http://linkedin.com/in/olamy