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.SumadorCondicionalConReinicioAggregatorFactory;
public class SiddhiBoltMetricTest1 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);
conf.setSiddhiExtensions(ext);
siddhiManager = new SiddhiManager(conf);
gestionaStream("define stream streamPostfix (MSGID string, USERFROM string, USERTO 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 select tam.MSGID as MSGID,resp.DSN as DSN,sum(tam.SIZE) as TAMANO "
+ "group by tam.MSGID,tam.DSN "
+ "insert into respuestasOK for all-events"
, "insert", "", true);
}
public SiddhiBoltMetricTest1() {
// TODO Auto-generated constructor stub
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("radius");
//Adaptamos los campos al formato definido por el stream
//podr�amos recuperar el formato de los campos desde la metadata
/* if(campos[12]==null) campos[12]="null";
if(campos[15]==null) campos[15]="null";
if(campos[20]==null) campos[20]="null";
if(campos[13].equals("null")) campos[13]="-1";*/
try {
//Pasamos los valores relevantes de latupla al Stream de WSO2
inputHandler.send(new Object[]{campos[2],campos[12],campos[15],campos[20],Integer.parseInt(campos[13])});
//inputHandler.send(new Object[]{campos[3],Integer.parseInt(campos[1].trim()),campos[10],campos[16],campos[32],campos[21]});
} 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()+"-"+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()));*/
/*
eventtimestamp
idHost,
ID ,
usuario,
maquina,
mac,
status,
motivo
agregacion:sumConReset(1L,status,'Passed') as errorsConsecutivos
*/
String id=e.getData(0).toString()+"-"+e.getData(3).toString();
try {
XContentBuilder dataBuilder=jsonBuilder().startObject()
.field("@timestamp",e.getData(0).toString())
.field("idHost",e.getData(1))
.field("ID",Long.parseLong(e.getData(2).toString()))
.field("usuario",e.getData(3))
.field("maquina",e.getData(4))
.field("mac",e.getData(5))
.field("status",e.getData(6))
.field("motivo",e.getData(7))
.field("erroresCons",Long.parseLong(e.getData(8).toString()))
.field("tamano",Double.parseDouble(e.getData(9).toString()))
.endObject();
System.out.println(dataBuilder.string());
collector.emit(new Values("ob_src_postfix","test2",id,dataBuilder.string()));
} catch (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;
}
}