com.bigdata.counters.Instrument Maven / Gradle / Ivy
/*
Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. All rights reserved.
Contact:
SYSTAP, LLC DBA Blazegraph
2501 Calvert ST NW #106
Washington, DC 20008
[email protected]
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Created on Mar 14, 2008
*/
package com.bigdata.counters;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
/**
* Abstract class for reporting instrumented values supporting some useful
* conversions.
*
* @author Bryan Thompson
* @version $Id$
*/
abstract public class Instrument implements IInstrument {
protected static Logger log = Logger.getLogger(Instrument.class);
/** N/A
*/
protected static final transient String NA = "N/A";
/**
* Converts an event count whose durations were measured in elapsed
* nanoseconds to an event rate per second.
*
* @param counter
* The event count.
* @param nanos
* The elapsed nanoseconds for the events.
*
* @return Either {@value #NA} if nanos is ZERO (0) or the rate per
* second for the event.
*
* @todo move to a util class? deprecate and remove in favor of Double counters?
*/
public final String nanosToPerSec(long counter, long nanos) {
long secs = TimeUnit.SECONDS.convert(nanos, TimeUnit.NANOSECONDS);
if (secs == 0L)
return NA;
return "" + counter / secs;
}
/**
* Take a sample, setting the current value and timestamp using either
* {@link #setValue(Object)} or {@link #setValue(Object, long)}.
*/
abstract protected void sample();
/**
* Set the value.
*
* @param value
* The value, which will be associated with the current time as
* reported by {@link System#currentTimeMillis()}.
*/
final public void setValue(T value) {
setValue(value, System.currentTimeMillis());
}
/**
* Set the value.
*
* @param value
* The value.
* @param timestamp
* The timestamp for that value.
*/
final public void setValue(T value,long timestamp) {
if(log.isInfoEnabled())
log.info("value="+value+", timestamp="+timestamp);
this.value = value;
this.lastModified = timestamp;
}
final public T getValue() {
sample();
return value;
}
/**
* Return the current value without taking another {@link #sample()}
*/
public T getCurrentValue() {
return value;
}
final public long lastModified() {
return lastModified;
}
/**
* The current value -or- null
if there is no current value.
*/
protected T value;
/**
* The timestamp associated with {@link #value}.
*/
protected long lastModified;
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy