Hi,
Whilst writing the MBeans in the event bundle I started thinking about
monitoring inside Sling. IMHO there are not enough to really know what
a instance under load is doing. Much though I like JMX it comes with
implementation and runtime overhead which I don't much like.
Runtime:
* Running with JMX enabled doesn't add any overhead, but once a client
is connected there is some (some reports upto 3% of resources).
* You have to remember to enable it, and most of the time JVMs are not
enabled. By the time you really need it, its often too late.
* JMX is not restful.
Implementation
* MBeans are not that hard to implement with the OSGi Whiteboard, but
they have to be implemented.
Alternatives.
In Jackarabbit there is/was a statistics class [1], which IIUC uses
counters and time series stored in a map. The service can then be
queries to extract the values by wrapping in an MBean or Servlet.
I think the approach could be generalised and extended so that
anything in the container could use the service to record metrics. The
api might look something like
public interface Statistics {
/**
* Increment a counter by 1
*/
void increment(String counterName);
/**
* Record a double value in a timeseries.
*/
void record(String timeSeriesName, double value);
/**
* Record a long value in a timeseries.
*/
void record(String timeSeriesName, long value);
}
and (so that any reference can be optional on a service
implementation, the final is a hint to hotspot to inline)
public final class StatisticsUtils {
private StatisticsUtils() {
}
public static void increment(Statistics statistics, String counterName) {
if ( statistics != null ) {
statistics.increment(counterName);
}
}
... etc for the other methods ..
}
The service would need to deal with all the implementation details
(including concurrency and speed). The service implementation would
also come with a servlet endpoint (under /system/*) and/or single JMX
MBean.
Anything that wanted to record stats would then bind to the service
and use it. I think this would avoid the issues mentioned above with
wide scale MBean usage.
WDYT?
(apologies for the noise if this already exists, and if so, please
treat it as a question: where and how do we record stats?)
Ian
1 http://wiki.apache.org/jackrabbit/Statistics