package storm.applications.bolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import storm.applications.constants.SpikeDetectionConstants.Conf;
import storm.applications.constants.SpikeDetectionConstants.Field;
/**
* Emits a tuple if the current value surpasses a pre-defined threshold.
* http://github.com/surajwaghulde/storm-example-projects
*
* @author surajwaghulde
*/
public class SpikeDetectionBolt extends AbstractBolt {
private double spikeThreshold;
@Override
public void initialize() {
spikeThreshold = config.getDouble(Conf.SPIKE_DETECTOR_THRESHOLD, 0.03d);
}
@Override
public void execute(Tuple input) {
String deviceID = input.getStringByField(Field.DEVICE_ID);
double movingAverageInstant = input.getDoubleByField(Field.MOVING_AVG);
double nextDouble = input.getDoubleByField(Field.VALUE);
if (Math.abs(nextDouble - movingAverageInstant) > spikeThreshold * movingAverageInstant) {
collector.emit(input, new Values(deviceID, movingAverageInstant, nextDouble, "spike detected"));
}
collector.ack(input);
}
@Override
public Fields getDefaultFields() {
return new Fields(Field.DEVICE_ID, Field.MOVING_AVG, Field.VALUE, Field.MESSAGE);
}
}