import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import org.elasticsearch.common.xcontent.XContentBuilder; import org.wso2.siddhi.core.SiddhiManager; import org.wso2.siddhi.core.config.SiddhiConfiguration; import org.wso2.siddhi.core.event.Event; import org.wso2.siddhi.core.query.output.callback.QueryCallback; import org.wso2.siddhi.core.stream.input.InputHandler; import backtype.storm.task.TopologyContext; import backtype.storm.topology.BasicOutputCollector; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseBasicBolt; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; import backtype.storm.tuple.Values; import com.produban.openbus.siddhiCep.MediaCondicionadaAggregatorFactory; import com.produban.openbus.siddhiCep.MediaCondicionadaAnteriorAggregatorFactory; import com.produban.openbus.siddhiCep.SumadorCondicionalConReinicioAggregatorFactory; public class SiddhiBoltMetricaOnlineRadius4 extends BaseBasicBolt { /** * */ private static final long serialVersionUID = 296651450802350256L; private transient SiddhiManager siddhiManager; private BasicOutputCollector collector; @SuppressWarnings("rawtypes") public void init(){ //SiddhiConfiguration configuration = new SiddhiConfiguration(); SiddhiConfiguration conf = new SiddhiConfiguration(); List<Class> ext = new ArrayList<Class>(); ext.add(SumadorCondicionalConReinicioAggregatorFactory.class); ext.add(MediaCondicionadaAggregatorFactory.class); ext.add(MediaCondicionadaAnteriorAggregatorFactory.class); conf.setSiddhiExtensions(ext); siddhiManager = new SiddhiManager(conf); /* gestionaStream("define stream streamPostfix (MSGID string, USERFROM string, TOUSER string,DSN string, SIZE int);","insert",""); String query1ID=gestionaQuery( "from streamPostfix[DSN=='2.0.0' or DSN=='2.6.0' or DSN=='2.4.0']#window.time(20000) as resp "+ "join "+ "streamPostfix[ USERFROM != 'null' and SIZE >0 ]#window.time(20000) as tam "+ "on resp.MSGID==tam.MSGID "+ "insert all-events into respuestasOK "+ "tam.MSGID,resp.DSN,sum(tam.SIZE) as TAMANO group by tam.MSGID,tam.DSN;" , "insert", "", true);*/ gestionaStream("define stream radius2 (Authentication_Status string,timestamp string, User_Name string);","insert",""); gestionaQuery( "from radius2[not(User_Name contains 'host/')]#window.time(20000) "+ "select timestamp,agregacion:mediaCondIntPorcentaje(Authentication_Status,'Failed',10000) as media, agregacion:mediaCondAnteriorIntPorcentaje(Authentication_Status,'Failed',10000) as mediaAnterior " + "insert into mediaFallos for all-events "+ ";" , "insert", "", false); gestionaQuery( "from mediaFallos#window.time(20000) "+ "select timestamp,media, media - mediaAnterior as incrementoMedia " + "insert into mediaIncremento for all-events "+ ";" , "insert", "", true); } public SiddhiBoltMetricaOnlineRadius4(){ init(); } @Override public void execute(Tuple arg0, BasicOutputCollector arg1) { // TODO Auto-generated method stub collector=arg1; String[] campos=arg0.getString(0).split("�"); if(siddhiManager==null){ init(); } //recuperamos el Stream para pasarle la tupla InputHandler inputHandler = siddhiManager.getInputHandler("radius2"); //Adaptamos los campos al formato definido por el stream try { //Pasamos los valores relevantes de latupla al Stream de WSO2 if (campos[32]==null) campos[32]=""; inputHandler.send(new Object[]{campos[32],campos[3],campos[10]}); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } /* try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { // TODO Auto-generated method stub //declarer.declare(new Fields("streamID", "datos")); declarer.declare(new Fields("index","type","id","document")); } @Override public void prepare(Map stormConf, TopologyContext context) { super.prepare(stormConf, context); } /** * <p>M�todo para a�adir o eliminar Streams del Siddhi-CEP</p> * @param streamDefinition Definici�n del STREAM a crear/eliminar * @param opcion Valores: *<p>      - insert: Crea el Stream indicado</p> *<p>      - delete: Elimina el Stream indicado</p> * @param streamID Nombre del STREAM si ha si ha sido creado. Si streamID no est� informado, se permite la creaci�n. * Si streamID est� informado se permite el borrado. * */ public void gestionaStream(String streamDefinition, String opcion,String streamID){ if(streamID!=null ){ if(opcion.equals("insert")){ //creamos siddhiManager.defineStream(streamDefinition); } }else{ System.out.println("El STREAM: "+streamID+" no existe"); if(opcion.equals("delete")){ //eliminamos siddhiManager.removeStream(streamID); } } } /** * <p>M�todo para a�adir o eliminar Queries del Siddhi-CEP</p> * <p>En la creaci�n/actualizaci�n adem�s se generar�n las funciones callback. * </p> * @param queryDef Nombre de la QUERY a crear/eliminar * @param opcion Valores: *<p>      - insert: Crea la QUERY indicada</p> *<p>      - delete: Elimina la QUERY indicada</p> * @param queryID Identificador de la query insertada en el Siddhi-CEP. * Si el ID no est� especificado solo se permite la inserci�n. * Si est� especificada permitimos el borrado y la inserci�n pasa a ser una actualizaci�n. * @param callback * <p>      - true: Genera la salida de los eventos al siguiente BOLT</p> * <p>      - false: No se genera callback</p> */ public String gestionaQuery(String queryDef, String opcion,String queryID,boolean callback){ String queryReference=queryID; if(opcion.equals("delete")){ //borramos la query del ID especificado siddhiManager.removeQuery(queryID); /*�Como tratamos las excepciones quepuedan llegar? - QueryID nulo - QueryID inv�lido */ } else if(opcion.equals("insert")){ if(queryID!=null){ //queryAntigua=siddhiManager.getQuery(queryID); //Si existe el ID y es v�lido, borramos la regla //if (queryAntigua!=null){ siddhiManager.removeQuery(queryID); /*�Como tratamos las excepciones quepuedan llegar? - QueryID nulo - QueryID inv�lido */ //} } //a�adimos la nueva Query queryReference=siddhiManager.addQuery(queryDef); /*�Como tratamos las excepciones quepuedan llegar? - queryDef nulo - queryDef inv�lido */ //actualizamos en la metadatael queryID devuelto por la creaci�n //Generamos callback si es necesario if(callback){ siddhiManager.addCallback(queryReference, new QueryCallback() { @Override public void receive(long timeStamp, Event[] inEvents, Event[] removeEvents) { // EventPrinter.print(timeStamp, inEvents, removeEvents); //generar la emisi�n de la tupla /*habr�a que generarun formato com�n de sailda a todas las reglas para pasar al Bolt de escrituraa ElasticSearch */ if(inEvents!=null){ for(Event e:inEvents){ System.out.println("++"+Arrays.toString(e.getData())); //collector.emit(new Values(e.getStreamId(), Arrays.toString(e.getData()))); String id=e.getData(0).toString(); try { XContentBuilder dataBuilder=jsonBuilder().startObject() .field("@timestamp",e.getData(0).toString()) .field("media",((int)e.getData(1))) .field("incrementoMedia",(e.getData(2))) .endObject(); collector.emit(new Values("ob_src_postfix","media",id,dataBuilder.string())); } catch (NumberFormatException | IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } if(removeEvents!=null){ for(Event e:removeEvents){ System.out.println("--"+Arrays.toString(e.getData())); //collector.emit(new Values(e.getStreamId(), Arrays.toString(e.getData()))); //----collector.emit(new Values(e.getStreamId(), e.getData())); //para la poc /*String id=e.getData(0).toString()+"-"+e.getData(1).toString(); String docum="{\"MSGID\":\""+e.getData(0).toString()+"\","+ "\"DSN\":\""+e.getData(1)+"\","+ "\"tamano\":"+Long.parseLong(e.getData(2).toString())+ "}"; System.out.println("gg"); collector.emit(new Values("indiceprueba","typeprueba",id,docum,e.getStreamId(), e.getData())); */ } } } }); } } return queryReference; } }