Monday, November 29, 2010

Using the Lightweight Metrics System in my GWT code

Hi everyone,

We have a class for capturing events in our Java code for performance
monitoring, which I have ported to our GWT client code.
Unfortunately, getting it to play nice with the Lightweight Metrics
System has been a little frustrating.

By itself, our performance monitoring classes work as expected;
basically it consists of a ProfileEvent class which has a String
description and a long time (designed for currentTimeMillis), and a
Profiler class which creates ProfileEvents and puts them into an
ArrayList.

By comparing the times of the various ProfileEvents, I can get a rough
idea of the time taken between any two events in the ArrayList.

Over the weekend I decided to wire up the Lightweight Metrics System
to a Profiler in my GWT module. I did this by adapting the Javascript
over at http://code.google.com/webtoolkit/doc/latest/DevGuideLightweightMetrics.html,
but instead of sending my events to a div, I send them to my GWT
Profiler class.

My JSNI looks like this:


private static native void publish()
/*-{
$wnd.addPerfEvent = function (event) { // called by
window.__gwtStatsEvent instead of the div example
if (event) {
@com.mycompany.Profiler::logProfilerEvent(Ljava/lang/
String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/
lang/String;)
(event.moduleName,event.subSystem,event.evtGroup,event.type,'' +
event.millis);
}
};
}-*/;

My GWT code is something like:

public static void logProfilerEvent (String moduleName, String
subsystem, String eventGroup, String type, String millis) {
Double milliValue = NumberFormat.getDecimalFormat().parse(millis);
long milliTime = milliValue.longValue();

Profiler profiler = getProfiler ();
profiler.logEvent (new ProfileEvent (moduleName + "." + subsystem +
"." + type, milliTime));
}

To get this to work I had to cast the event.millis field, a native
Javascript number, to a String by appending an empty String. Then, on
the GWT side, I am parsing the String and converting it to the long I
would have preferred. Passing the millis as a Long worked up to a
point, but eventually it would throw a Javascript exception because
millis, despite being passed as a "Long", did not conform to the Long
format GWT was expecting (something like e[0] + e[1]; in the compiled
Javascript; one or the other would be undefined)... hence the
workaround.

So now it appears to work like a charm.

My question is: Is my little hack actually necessary, or is there
some JSNI trick or GWT tip that I missed that would make this code
more elegant? Should passing millis as a Long work, perhaps there is
an issue in the compiler?

I saw recently that there have been contributions made to the
Lightweight Metrics System that look like it may play nice with the
GWT code in the future, and I look forward to seeing that day.

Thanks.

--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.

No comments:

Post a Comment