Add a 'sessionId' field to GWT lightweight metrics events, which is set to the value of
the user-supplied global variable __gwtStatsSessionId at module startup.  The field should
not be considered a commited part of the API at this time.

Review by: bobv



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6441 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js
index 488a56b..e0a2727 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js
@@ -51,6 +51,7 @@
   if (isHostedMode()) {
     $stats && $stats({
       moduleName: '__MODULE_NAME__',
+      sessionId: $sessionId,
       subSystem: 'startup',
       evtGroup: 'bootstrap', 
       millis:(new Date()).getTime(), 
@@ -101,6 +102,7 @@
       // Record when the module EntryPoints return.
       $stats && $stats({
         moduleName: '__MODULE_NAME__',
+        sessionId: $sessionId,
         subSystem: 'startup',
         evtGroup: 'moduleStartup',
         millis:(new Date()).getTime(),
@@ -295,7 +297,8 @@
        * avoid FF2 refresh quirks.
        */
       $stats && $stats({
-        moduleName:'__MODULE_NAME__', 
+        moduleName:'__MODULE_NAME__',
+        sessionId: $sessionId,
         subSystem:'startup', 
         evtGroup: 'moduleStartup', 
         millis:(new Date()).getTime(), 
@@ -331,7 +334,8 @@
     // Mark this module's script injection done and (possibly) start the module.
     scriptsDone = true;
     $stats && $stats({
-      moduleName:'__MODULE_NAME__', 
+      moduleName:'__MODULE_NAME__',
+      sessionId: $sessionId,
       subSystem:'startup', 
       evtGroup: 'loadExternalRefs', 
       millis:(new Date()).getTime(), 
@@ -380,7 +384,8 @@
   // --------------- WINDOW ONLOAD HOOK ---------------
 
   $stats && $stats({
-    moduleName:'__MODULE_NAME__', 
+    moduleName:'__MODULE_NAME__',
+    sessionId: $sessionId,
     subSystem:'startup', 
     evtGroup: 'bootstrap', 
     millis:(new Date()).getTime(), 
@@ -438,7 +443,8 @@
   }, 50);
 
   $stats && $stats({
-    moduleName:'__MODULE_NAME__', 
+    moduleName:'__MODULE_NAME__',
+    sessionId: $sessionId,
     subSystem:'startup', 
     evtGroup: 'bootstrap', 
     millis:(new Date()).getTime(), 
@@ -446,10 +452,11 @@
   });
 
   $stats && $stats({
-    moduleName:'__MODULE_NAME__', 
-    subSystem:'startup', 
-    evtGroup: 'loadExternalRefs', 
-    millis:(new Date()).getTime(), 
+    moduleName:'__MODULE_NAME__',
+    sessionId: $sessionId,
+    subSystem:'startup',
+    evtGroup: 'loadExternalRefs',
+    millis:(new Date()).getTime(),
     type: 'begin'
   });
 
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/hosted.html b/dev/core/src/com/google/gwt/core/ext/linker/impl/hosted.html
index 9b312e0..7479600 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/hosted.html
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/hosted.html
@@ -5,13 +5,14 @@
 var $wnd = parent;
 var $doc = $wnd.document;
 var $moduleName, $moduleBase, $entry
-,$stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null;
+,$stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null
+,$sessionId = $wnd.__gwtStatsSessionId ? $wnd.__gwtStatsSessionId : null;
 // Lightweight metrics
 if ($stats) {
   var moduleFuncName = location.search.substr(1);
   var moduleFunc = $wnd[moduleFuncName];
   var moduleName = moduleFunc ? moduleFunc.moduleName : "unknown";
-  $stats({moduleName:moduleName,subSystem:'startup',evtGroup:'moduleStartup',millis:(new Date()).getTime(),type:'moduleEvalStart'});
+  $stats({moduleName:moduleName,sessionId:$sessionId,subSystem:'startup',evtGroup:'moduleStartup',millis:(new Date()).getTime(),type:'moduleEvalStart'});
 }
 var $hostedHtmlVersion="2.0";
 
@@ -270,7 +271,7 @@
 
 // Lightweight metrics
 window.fireOnModuleLoadStart = function(className) {
-  $stats && $stats({moduleName:$moduleName, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'onModuleLoadStart', className:className});
+  $stats && $stats({moduleName:$moduleName, sessionId:$sessionId, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'onModuleLoadStart', className:className});
 };
 
 window.__gwt_module_id = 0;
@@ -279,7 +280,7 @@
 <font face='arial' size='-1'>This html file is for hosted mode support.</font>
 <script><!--
 // Lightweight metrics
-$stats && $stats({moduleName:$moduleName,subSystem:'startup',evtGroup:'moduleStartup',millis:(new Date()).getTime(),type:'moduleEvalEnd'});
+$stats && $stats({moduleName:$moduleName, sessionId:$sessionId, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'moduleEvalEnd'});
 
 // OOPHM currently only supports IFrameLinker
 var query = parent.location.search;
diff --git a/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java b/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
index aa79a1d..5785d7f 100644
--- a/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
@@ -205,7 +205,8 @@
     DefaultTextOutput out = new DefaultTextOutput(context.isOutputCompact());
 
     out.print("$stats && $stats({moduleName:'" + context.getModuleName()
-        + "',subSystem:'startup',evtGroup:'moduleStartup'"
+        + "',sessionId:$sessionId"
+        + ",subSystem:'startup',evtGroup:'moduleStartup'"
         + ",millis:(new Date()).getTime(),type:'moduleEvalEnd'});");
 
     // Generate the call to tell the bootstrap code that we're ready to go.
@@ -305,10 +306,13 @@
       out.print("};");
       out.newlineOpt();
     }
-    out.print("var $stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null;");
+    out.print("var $stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null,");
+    out.newlineOpt();
+    out.print("$sessionId = $wnd.__gwtStatsSessionId ? $wnd.__gwtStatsSessionId : null;");
     out.newlineOpt();
     out.print("$stats && $stats({moduleName:'" + context.getModuleName()
-        + "',subSystem:'startup',evtGroup:'moduleStartup'"
+        + "',sessionId:$sessionId"
+        + ",subSystem:'startup',evtGroup:'moduleStartup'"
         + ",millis:(new Date()).getTime(),type:'moduleEvalStart'});");
     out.newlineOpt();
     out.print("</script></head>");
diff --git a/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js b/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js
index 6d5bbd7..f8873fd 100644
--- a/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js
+++ b/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js
@@ -21,6 +21,7 @@
   var $wnd = window
   ,$doc = document
   ,$stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null
+  ,$sessionId = $wnd.__gwtStatsSessionId ? $wnd.__gwtStatsSessionId : null
 
   // These variables gate calling gwtOnLoad; all must be true to start
   ,scriptsDone, loadDone, bodyDone
@@ -48,6 +49,7 @@
 
   $stats && $stats({
     moduleName: '__MODULE_NAME__',
+    sessionId: $sessionId,
     subSystem: 'startup',
     evtGroup: 'bootstrap', 
     millis:(new Date()).getTime(), 
@@ -100,6 +102,7 @@
       // Record when the module EntryPoints return.
       $stats && $stats({
         moduleName: '__MODULE_NAME__',
+        sessionId: $sessionId,
         subSystem: 'startup',
         evtGroup: 'moduleStartup',
         millis:(new Date()).getTime(),
@@ -294,7 +297,8 @@
        * avoid FF2 refresh quirks.
        */
       $stats && $stats({
-        moduleName:'__MODULE_NAME__', 
+        moduleName:'__MODULE_NAME__',
+        sessionId: $sessionId,
         subSystem:'startup', 
         evtGroup: 'moduleStartup', 
         millis:(new Date()).getTime(), 
@@ -330,7 +334,8 @@
     // Mark this module's script injection done and (possibly) start the module.
     scriptsDone = true;
     $stats && $stats({
-      moduleName:'__MODULE_NAME__', 
+      moduleName:'__MODULE_NAME__',
+      sessionId: $sessionId,
       subSystem:'startup', 
       evtGroup: 'loadExternalRefs', 
       millis:(new Date()).getTime(), 
@@ -361,7 +366,8 @@
   // --------------- WINDOW ONLOAD HOOK ---------------
 
   $stats && $stats({
-    moduleName:'__MODULE_NAME__', 
+    moduleName:'__MODULE_NAME__',
+    sessionId: $sessionId,
     subSystem:'startup', 
     evtGroup: 'bootstrap', 
     millis:(new Date()).getTime(), 
@@ -415,7 +421,8 @@
   }, 50);
 
   $stats && $stats({
-    moduleName:'__MODULE_NAME__', 
+    moduleName:'__MODULE_NAME__',
+    sessionId: $sessionId,
     subSystem:'startup', 
     evtGroup: 'bootstrap', 
     millis:(new Date()).getTime(), 
@@ -423,7 +430,8 @@
   });
 
   $stats && $stats({
-    moduleName:'__MODULE_NAME__', 
+    moduleName:'__MODULE_NAME__',
+    sessionId: $sessionId,
     subSystem:'startup', 
     evtGroup: 'loadExternalRefs', 
     millis:(new Date()).getTime(), 
diff --git a/dev/core/src/com/google/gwt/core/linker/XSLinker.java b/dev/core/src/com/google/gwt/core/linker/XSLinker.java
index 43e9820..185c29d 100644
--- a/dev/core/src/com/google/gwt/core/linker/XSLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/XSLinker.java
@@ -80,7 +80,8 @@
     out.print("var $stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null;");
     out.newlineOpt();
     out.print("$stats && $stats({moduleName:'" + context.getModuleName()
-        + "',subSystem:'startup',evtGroup:'moduleStartup'"
+        + "',sessionId:$sessionId"
+        + ",subSystem:'startup',evtGroup:'moduleStartup'"
         + ",millis:(new Date()).getTime(),type:'moduleEvalStart'});");
     out.newlineOpt();
 
@@ -93,7 +94,8 @@
     DefaultTextOutput out = new DefaultTextOutput(context.isOutputCompact());
 
     out.print("$stats && $stats({moduleName:'" + context.getModuleName()
-        + "',subSystem:'startup',evtGroup:'moduleStartup'"
+        + "',sessionId:$sessionId"
+        + ",subSystem:'startup',evtGroup:'moduleStartup'"
         + ",millis:(new Date()).getTime(),type:'moduleEvalEnd'});");
 
     // Generate the call to tell the bootstrap code that we're ready to go.
diff --git a/dev/core/src/com/google/gwt/core/linker/XSTemplate.js b/dev/core/src/com/google/gwt/core/linker/XSTemplate.js
index 8cbdbe9..811a096 100644
--- a/dev/core/src/com/google/gwt/core/linker/XSTemplate.js
+++ b/dev/core/src/com/google/gwt/core/linker/XSTemplate.js
@@ -48,6 +48,7 @@
 
   $stats && $stats({
     moduleName: '__MODULE_NAME__',
+    sessionId: $sessionId,
     subSystem: 'startup',
     evtGroup: 'bootstrap', 
     millis:(new Date()).getTime(), 
@@ -85,6 +86,7 @@
       // Record when the module EntryPoints return.
       $stats && $stats({
         moduleName: '__MODULE_NAME__',
+        sessionId: $sessionId,
         subSystem: 'startup',
         evtGroup: 'moduleStartup',
         millis:(new Date()).getTime(),
@@ -292,6 +294,7 @@
 
   $stats && $stats({
     moduleName:'__MODULE_NAME__', 
+    sessionId: $sessionId,
     subSystem:'startup', 
     evtGroup: 'bootstrap', 
     millis:(new Date()).getTime(), 
@@ -342,6 +345,7 @@
 
   $stats && $stats({
     moduleName:'__MODULE_NAME__', 
+    sessionId: $sessionId,
     subSystem:'startup', 
     evtGroup: 'bootstrap', 
     millis:(new Date()).getTime(), 
@@ -350,6 +354,7 @@
 
   $stats && $stats({
     moduleName:'__MODULE_NAME__', 
+    sessionId: $sessionId,
     subSystem:'startup', 
     evtGroup: 'loadExternalRefs', 
     millis:(new Date()).getTime(), 
@@ -371,11 +376,11 @@
   var compiledScriptTag = '"<script src=\\"' + base + strongName + '.cache.js\\"></scr" + "ipt>"';
   $doc.write('<script><!--\n'
     + 'window.__gwtStatsEvent && window.__gwtStatsEvent({'
-    + 'moduleName:"__MODULE_NAME__", subSystem:"startup",'
+    + 'moduleName:"__MODULE_NAME__", sessionId:$sessionId, subSystem:"startup",'
     + 'evtGroup: "loadExternalRefs", millis:(new Date()).getTime(),'
     + 'type: "end"});'
     + 'window.__gwtStatsEvent && window.__gwtStatsEvent({'
-    + 'moduleName:"__MODULE_NAME__", subSystem:"startup",'
+    + 'moduleName:"__MODULE_NAME__", sessionId:$sessionId, subSystem:"startup",'
     + 'evtGroup: "moduleStartup", millis:(new Date()).getTime(),'
     + 'type: "moduleRequested"});'
     + 'document.write(' + compiledScriptTag + ');'
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java b/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java
index cadf257..03db287 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java
@@ -110,7 +110,7 @@
         "JavaArray", "JavaMember",
 
         // GWT-defined identifiers
-        "$wnd", "$doc", "$entry", "$moduleName", "$moduleBase", "$gwt_version",
+        "$wnd", "$doc", "$entry", "$moduleName", "$moduleBase", "$gwt_version", "$sessionId",
 
         // Identifiers used by JsStackEmulator; later set to obfuscatable
         "$stack", "$stackDepth", "$location",
diff --git a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Stats.java b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Stats.java
index 79fbd86..7e4a74b 100644
--- a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Stats.java
+++ b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Stats.java
@@ -31,6 +31,7 @@
   static native boolean onModuleStart(String mainClassName) /*-{
     return $stats({
       moduleName: $moduleName,
+      sessionId: $sessionId,
       subSystem: "startup",
       evtGroup: "moduleStartup",
       millis : (new Date()).getTime(),
diff --git a/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java b/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java
index fb03197..7c02f04 100644
--- a/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java
+++ b/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java
@@ -242,6 +242,7 @@
         String type, Integer fragment, Integer size) /*-{
       var evt = {
        moduleName: @com.google.gwt.core.client.GWT::getModuleName()(), 
+        sessionId: $sessionId,
         subSystem: 'runAsync',
         evtGroup: eventGroup,
         millis: (new Date()).getTime(),
diff --git a/user/src/com/google/gwt/user/client/rpc/impl/RemoteServiceProxy.java b/user/src/com/google/gwt/user/client/rpc/impl/RemoteServiceProxy.java
index 54e72bd..793f63f 100644
--- a/user/src/com/google/gwt/user/client/rpc/impl/RemoteServiceProxy.java
+++ b/user/src/com/google/gwt/user/client/rpc/impl/RemoteServiceProxy.java
@@ -74,7 +74,8 @@
   public static native JavaScriptObject timeStat(String method, int count,
       String eventType) /*-{
     return {
-      moduleName: @com.google.gwt.core.client.GWT::getModuleName()(), 
+      moduleName: @com.google.gwt.core.client.GWT::getModuleName()(),
+      sessionId: $sessionId,
       subSystem: 'rpc',
       evtGroup: count,
       method: method,