The Metrics library is available to application code to get production metrics from their applications. It allows applications to easily mark critical section for metrics gathering, without handling the details with the Metrics Extension.
There are currently the following possibilities available;
Before looking at the details of these, we need to point out that there are some pre-conditions for Metrics to be working. First of all, you need to install a Metrics Extensions, most likely the Yammer Metrics Extension. See your chosen extension for details on how to do that.
Once the Metrics extension is installed, you will also need a suitable backend to gather all the data out of a production plant and likewise a good front-end to view this. See your chosen Metrics Extension for this as well.
There is a TimingCaptureAllConcern, which when added to a composite will install a Timer for every method call in the composite.
The @TimingCapture
annotation can be placed on any method of the composite, to indicate that
a Timer is wanted on that method.
Example;
public interface Router { @TimingCapture List<Coordinate> route( String source, String destination ); } public class RouterAlgorithm1 implements Router { @Override public List<Coordinate> route( String source, String destination ) { [...snip...] } } public class RouterAlgorithm2 implements Router { @Override public List<Coordinate> route( String source, String destination ) { [...snip...] } [...snip...] @Override public void assemble( ModuleAssembly module ) throws AssemblyException { module.addServices( Router.class ).identifiedBy( "router1" ).withMixins( RouterAlgorithm1.class ); module.addServices( Router.class ).identifiedBy( "router2" ).withMixins( RouterAlgorithm2.class ); [...snip...] } } }
It is valid to annotate either the composite interface methods or the mixin implementation methods. Any of the method declarations should work. From the testcases we have the following example;
public interface Country extends TransientComposite { @Optional Property<String> name(); void updateName( String newName ); } @Mixins( Country1Mixin.class ) public interface Country1 extends Country { } public static abstract class Country1Mixin implements Country1 { @Override public void updateName( String newName ) { name().set( newName ); } } @Mixins( Country2Mixin.class ) public interface Country2 extends Country { } public static abstract class Country2Mixin implements Country2 { @Override public void updateName( String newName ) { name().set( newName ); } } @Mixins( Country3Mixin.class ) @Concerns( TimingCaptureConcern.class ) public interface Country3 extends Country { } public static abstract class Country3Mixin implements Country3 { @Override @TimingCapture public void updateName( String newName ) { name().set( newName ); } }