The repository is a singleton for the JVM. It is the entry point to get access to counters and gauges.

public interface Repository extends Iterable<Counter> {
    Counter getCounter(Counter.Key key);
    void clear();
    StopWatch start(Counter counter);

    Map<Long, Double> getGaugeValues(long start, long end, Role role);
    void stopGauge(Role role);


A counter is a statistic and concurrency holder. It aggregates the information provided computing the average, min, max, sum of logs, ….

public interface Counter {
    Key getKey();
    void reset();

    void add(double delta);

    AtomicInteger currentConcurrency();
    int getMaxConcurrency();

    double getMax();
    double getMin();
    long getHits();
    double getSum();
    double getStandardDeviation();
    double getVariance();
    double getMean();
    double getGeometricMean();
    double getSumOfLogs();
    double getSumOfSquares();


A gauge is a way to get a measure. It is intended to get a history of a metric.

public interface Gauge {
    Role role();
    double value();
    long period();


Counters and Gauges are saved and queried (in memory by default) through a DataStore. it allows you to plug behind it any kind of persistence you would like.

public interface DataStore {
    Counter getOrCreateCounter(Counter.Key key);
    void clearCounters();
    Collection<Counter> getCounters();
    void addToCounter(Counter defaultCounter, double delta);  // sensitive method which need to be thread safe

    Map<Long,Double> getGaugeValues(long start, long end, Role role);
    void createOrNoopGauge(Role role);
    void addToGauge(Gauge gauge, long time, double value);


A StopWatch is just a handler for a measure with a counter.

public interface StopWatch {
    long getElapsedTime();

    StopWatch stop();