Sviluppo della piattaforma dei servizi cloud di base per il data center TIX UTILIZZO DI DOCUMENTI XML E FONTI DATI JDBC COME INPUT PER LOGSTASH/ELASTICSEARCH Redazione Tommaso Anzidei 23/05/2016 AlmavivA Silvana Ciampi, Verifica Marco Giolo AlmavivA Approvazione Versione 1 Vincenzo Martiello Regione Toscana 1.0 Sommario 1. Introduzione......................................................................................3 2. XML..................................................................................................4 3. JDBC................................................................................................6 2 1. Introduzione In questo documento descriviamo l'introduzione, all'interno della piattaforma Saas-plat, di modalità di input dati che estendono gli attuali. Regione Toscana (RT) ha infatti richiesto di verificare la possibilità di utilizzare come input alla piattaforma sia documenti XML conservati su disco, sia tabelle di database raggiungibili via JDBC. In particolare RT ha chiesto: 1. JDBC: E' di interesse verificare la disponibilità e approfondire la modalità d'uso del modulo di Logstash che consente di acquisire dati da database con interfaccia JDBC. Questa possibilità consentirebbe ad esempio di georeferenziare e rappresentare con Kibana 4 i log di accesso ad una vasta gamma di applicazioni di cui l'infrastruttura di autenticazione ARPA mette già a disposizione i log per indirizzo ip (a tale riguardo è possibile fornire maggiori dettagli tecnici in sede operativa). 2. XML: E' possibile memorizzare dati XML in ELK? Entrambe le richieste sono state analizzate ed in entrambi i casi si è verificata positivamente la fattibilità della richiesta. Questo documento descrive operativamente entrambe le modalità di input. 3 2. XML Sia data una cartella nel file system contente file XML. L'esigenza dell'utente è caricare tali documenti in Elasticsearch in modo da poterli sia conservare che ricercare. Esistono due modalità per raggiungere tale obiettivo. 2.1 Approccio Logstash Logstash offre una modalità nativa di caricamento di documenti XML. Infatti è sufficiente utilizzare il plugin XML di Logstash (che è disponibile nell'installazione standare di Logstash). Vediamo un esempio di configurazione. input { file { type => "file" path => "/some folder/*.xml" } } output { elasticsearch { host => "localhost" protocol => "http" } } In questo esempio gli xml presenti in un folder vengono caricati da Logstash, convertiti in formato json e memorizzati in elasticsearch. Il vantaggio di questo approccio è che immediatamente disponibile out-of-the-box. rappresenta una soluzione Lo svantaggio è che il documento XML non viene memorizzato in elasticsearch. Se lo si vuole recuperare da elasticsearch è necessario eseguire un parsing json → xml che non restituisce con certezza il documento originale. 4 2.2 Approccio Java Per ovviare al limitazione dell'approccio logstash è stata sviluppata una libreria Java denominata XML2ES. La libreria è costituita da un unico jar chiamato XML2ES.jar (i binari e i sorgenti sono disponibili su OSCAT). La libreria carica i documenti XML congiuntamente con i file XML originali. su elasticsearch in formato json La libreria fornisce un demone che rimane in ascolto sulla creazione/modifica di documenti XML presenti in una data cartella. La libreria è facilmente modificabile per adattarsi a scenari personalizzati. Per utilizzare la libreria è sufficiente lanciare il comando: java -jar XML2ES.jar path_dei_file_XML serverES:portaES/indice/tipo dove: path_dei_file_XML = cartella che contiene i documenti XML da caricare serverES = indirizzo del servizio elasticsearch portaES = porta di elasticsearch indice = indice elasticsearch nel quale memorizzare i documenti tipo = tipo elasticsearch dove risiederanno i documenti XML Per esempio: java -jar XML2ES.jar /home/xmls/ http://10.228.16.9:9200/xml/xml/ 5 3. JDBC Il caricamento di tabelle di database relazionali è immediatamente disponibile il Logstash tramite il plugin JDBC. Vediamo un semplice esempio. Si supponga di avere una tabella, per esempio ESTABLE, conservata in un database DB/2. Si vuole caricare i dati della tabella su di un indice elasticsearch, per esempio un indice di nome “jdbc”. Il file di configurazione di Logstash sarà simile al seguente: input { jdbc { jdbc_driver_library => "/path driver db2/db2jcc.jar" jdbc_driver_class => "com.ibm.db2.jcc.DB2Driver" jdbc_connection_string => "jdbc:db2://ip:port/DB" jdbc_user => "username" jdbc_password => "password" schedule => "* * * * *" statement => "SELECT * FROM ESTABLE" } } output { elasticsearch { hosts => ["es_ip:es_port"] index => "jdbc" } } Come si vede dall'esempio è sufficiente comunicare a Logstash le seguenti informazioni: jdbc_driver_library = path che contiene la libreria JDBC del database 6 jdbc_driver_class = la classe del driver jdbc_connection_string = la definizione della connessione JDBC jdbc_user = utente che ha accesso alla tabella jdbc_password = password dell'utente schedule = rappresenta, in formato Cron, la periodicità del caricamento statement = istruzione SQL che seleziona i dati da caricare. Spesso, nella WHERE, contiene un filtro temporale che, unitamente al parametro schedule, permette di caricare i soli record più recenti. Il caricamento può essere raffinato attraverso parametri aggiuntivi, si veda la pagina: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html per maggiori dettagli. Il caricamento può essere eseguito una tantum o periodicamente. Kibana potrà interrogare dati geografici provenienti dalla tabella caricata: la prossima versione di questo documento conterrà un esempio significativo. 7