package org.stagemonitor.os.metrics;
import java.util.concurrent.TimeUnit;
import com.codahale.metrics.CachedGauge;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.stagemonitor.core.metrics.metrics2.Metric2Set;
public abstract class AbstractSigarMetricSet<T> implements Metric2Set {
private final Sigar sigar;
/*
* The CachedGauge is used as a cache, to ensure that a single report gets a single instance of the metric snapshot
*/
private CachedGauge<T> sigarMetricSnapshot = new CachedGauge<T>(900, TimeUnit.MILLISECONDS) {
@Override
protected T loadValue() {
try {
return loadSnapshot(sigar);
} catch (SigarException e) {
throw new RuntimeException(e);
}
}
};
protected AbstractSigarMetricSet(Sigar sigar) {
this.sigar = sigar;
}
abstract T loadSnapshot(Sigar sigar) throws SigarException;
/**
* Returns a snapshot of {@link T}, which is the same for a single report. The next report returns a different snapshot.
*
* @return a snapshot of {@link T}
*/
public T getSnapshot() {
return sigarMetricSnapshot.getValue();
}
}