package se.l4.vibe;
import se.l4.vibe.backend.VibeBackend;
import se.l4.vibe.builder.EventsBuilder;
import se.l4.vibe.builder.ProbeBuilder;
import se.l4.vibe.builder.SamplerBuilder;
import se.l4.vibe.builder.TimerBuilder;
import se.l4.vibe.event.Events;
import se.l4.vibe.probes.Probe;
import se.l4.vibe.probes.SampledProbe;
import se.l4.vibe.probes.Sampler;
import se.l4.vibe.timer.Timer;
/**
* Main interface for statistics and events.
*
* @author Andreas Holstenson
*
*/
public interface Vibe
{
/**
* Export a new probe.
*
* @param probe
* @return
*/
<T> ProbeBuilder<T> probe(Probe<T> probe);
/**
* Start creating a new time series.
*
* @return
*/
<T> SamplerBuilder<T> sample(SampledProbe<T> probe);
/**
* Create a new events instance.
*
* @param base
* @return
*/
<T> EventsBuilder<T> events(Class<T> base);
/**
* Start creating a new timer.
*
* @return
*/
TimerBuilder timer();
/**
* Get a {@link Probe} that has been registered at the given path.
*
* @param path
* @return
*/
<T> Probe<T> getProbe(String path);
/**
* Get a {@link Sampler} that has been registered at the given path.
*
* @param path
* @return
*/
<T> Sampler<T> getTimeSeries(String path);
/**
* Get a {@link Events} that has been registered at the given path.
*
* @param path
* @return
*/
<T> Events<T> getEvents(String path);
/**
* Get a {@link Timer} that has been registered at the given path.
*
* @param path
* @return
*/
Timer getTimer(String path);
/**
* Create a Vibe instance for the given sub path.
*
* @param path
* @return
*/
Vibe scope(String path);
/**
* Register a new backend to this instance.
*
* @param backend
*/
void addBackend(VibeBackend backend);
}