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

Reply via email to