package nl.us2.cloudpelican.stormprocessor; /** * Created by robin on 07/06/15. */ import backtype.storm.task.OutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseRichBolt; import backtype.storm.tuple.Tuple; import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; /** * * @author robin */ public class OutlierCollectorBolt extends BaseRichBolt { OutputCollector _collector; private Settings settings; private static final Logger LOG = LoggerFactory.getLogger(OutlierCollectorBolt.class); public OutlierCollectorBolt(Settings settings) { super(); this.settings = settings; } public void prepare(Map conf, TopologyContext context, OutputCollector collector) { _collector = collector; } public void execute(Tuple tuple) { String filterId = tuple.getStringByField("filter_id"); long ts = tuple.getLongByField("timestamp"); double score = tuple.getDoubleByField("score"); String jsonDetails = tuple.getStringByField("json_details"); LOG.info(filterId + " " + ts + " " + score + " " + jsonDetails); // Send to supervisor try { HttpClient client = HttpClientBuilder.create().build(); String url = settings.get("supervisor_host") + "filter/" + filterId + "/outlier?timestamp=" + ts + "&score=" + score; HttpPost req = new HttpPost(url); req.setEntity(new StringEntity(jsonDetails)); String token = new String(Base64.encodeBase64((settings.get("supervisor_username") + ":" + settings.get("supervisor_password")).getBytes())); req.setHeader("Authorization", "Basic " + token); HttpResponse resp = client.execute(req); int status = resp.getStatusLine().getStatusCode(); if (status >= 400) { throw new Exception("Invalid status " + status); } } catch (Exception e) { LOG.error("Failed to write data to supervisor", e); } _collector.ack(tuple); } public void declareOutputFields(OutputFieldsDeclarer declarer) { } }