package storm.applications.bolt;
import java.util.ArrayList;
import java.util.List;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import static storm.applications.constants.MachineOutlierConstants.*;
import storm.applications.model.scorer.DataInstanceScorer;
import storm.applications.model.scorer.DataInstanceScorerFactory;
import storm.applications.model.scorer.ScorePackage;
public class ObservationScoreBolt extends AbstractBolt {
private long previousTimestamp;
private String dataTypeName;
private DataInstanceScorer dataInstanceScorer;
private List<Object> observationList;
@Override
public void initialize() {
previousTimestamp = 0;
dataTypeName = config.getString(Conf.SCORER_DATA_TYPE);
observationList = new ArrayList<>();
dataInstanceScorer = DataInstanceScorerFactory.getDataInstanceScorer(dataTypeName);
}
@Override
public void execute(Tuple input) {
long timestamp = input.getLongByField(Field.TIMESTAMP);
if (timestamp > previousTimestamp) {
// a new batch of observation, calculate the scores of old batch and then emit
if (!observationList.isEmpty()) {
List<ScorePackage> scorePackageList = dataInstanceScorer.getScores(observationList);
for (ScorePackage scorePackage : scorePackageList) {
collector.emit(new Values(scorePackage.getId(), scorePackage.getScore(),
previousTimestamp, scorePackage.getObj()));
}
observationList.clear();
}
previousTimestamp = timestamp;
}
observationList.add(input.getValueByField(Field.OBSERVATION));
collector.ack(input);
}
@Override
public Fields getDefaultFields() {
return new Fields(Field.ID, Field.DATAINST_ANOMALY_SCORE, Field.TIMESTAMP, Field.OBSERVATION);
}
}