Sviluppo della piattaforma dei servizi cloud di base per il data center TIX ALCUNI MIGLIORAMENTI NEL CARICAMENTO E NELL'INTERROGAZIONE DEI LOG SANITÀ Sommario 1. INTRODUZIONE............................................................................................................................3 2. CONFIGURAZIONE ELASTICSEARCH......................................................................................4 3. CONFIGURAZIONE LOGSTASH.................................................................................................5 4. CARICAMENTO OFFLINE DEI DATI..........................................................................................7 5. PREDISPOSIZIONE AMBIENTE ESERCIZIO.............................................................................8 1. INTRODUZIONE In questo documento presentiamo alcuni miglioramenti da apportare alla piattaforma SAAS-plat per raggiungere i seguenti obiettivi: Caricamento informazioni geografiche: nei log dei frontend sanità è presente il campo remote-ip. Attraverso questo campo è possibile associare alla riga di log cui appartiene le coordinate geografiche del client che ha eseguito la request verso il frontend sanità. Purtroppo è però necessario rivedere la definizione dell'indice elasticsearch, chiamato syslog, che contiene i log del frontend sanità. Si propone di creare, in ambiente di esercizio, un nuovo indice, syslogfe, e popolarlo a partire dal primo maggio. I dati di aprile, comprensivi di georeferenziazione, verranno caricati offline sulla macchina bigtop. In questo documento presentiamo la nuova configurazione di elasticsearch e logstash per procedere al caricamento. Interrogazione più semplice del campo url: attualmente il campo url è analizzato da elasticsearch. Questo comporta che, per esempio, l'url '/sis/FSE/templates/diario/dati_personali.html' venga scomposto nell'array [sis, FSE, templates, diario, dati_personali.html] col risultato che una ricerca dell'url '/sis/FSE/' in elasticsearch restituisca anche le righe di log contenenti '/sis/FSE/templates/diario/dati_personali.html'. Proponiamo quindi una modifica dei mapping elasticsearch per impedire esplicitamente l'analisi del campo. Caricamento campo Time: il campo time dei log sanità, a causa di problemi di configurazione non superati all'avvio iniziale del sistema, non è mai stato caricato. Proponiamo qui una modifica della configurazione di elasticsearch che ne permette il caricamento. Ricordiamo che il campo time corrisponde all'istante nel quale la riga di log è stata generata sul frontend sanità. La sua mancanza non è stata finora un problema grazie alla presenza del campo @timestamp di elasticsearc (istante nel quale il log arriva su elasticsearch). E' però ovvio che la sua mancanza crea un problema nel caso di caricamento offline. Caricamento offline dei dati: presentiamo un programma Python per il caricamento di log offline. 2. CONFIGURAZIONE ELASTICSEARCH A partire dallo 01/05/2016 proponiamo di caricare, in ambiente di produzione, i log del frontend sanità in un nuovo indice, syslogfe. Questo indice può essere così caricato: curl -XPUT http://<ip-elasticsearch>:<port-elasticsearch>/syslogfe -d ' { "mappings":{ "syslog":{ "properties":{ "geoip":{ "type":"object", "properties":{ "coordinates":{ "type":"geo_point", "geohash":"true", "geohash_prefix":"true" } } }, "time":{ "type":"date", "format":"yyyy-MM-dd HH:mm:ss" }, "url":{ "type":"string", "index":"not_analyzed" } } } } } ' Si notino, nell'ordine, la presenza del campo geoip, di quello time e la redifinizione dei quello url. 3. CONFIGURAZIONE LOGSTASH Per il corretto caricamento dei nuovi campi sono necessarie alcune modifiche alla configurazione di logstash: 1) è necessario eliminare o commentare la rimozione del campo time: #mutate { # remove => [ 'time' ] #} 2) è necessario caricare il campo geoip all'interno della sezione filter: filter { ... if[remote-ip]{ geoip { database => "/home/geolitecity/GeoLiteCity.dat" source => "remote-ip" target => "geoip" add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] } mutate { convert => [ "[geoip][coordinates]", "float" ] } } ... } 3) è necessario cambiare l'indice di output di elasticsearch: output { stdout { codec => rubydebug } elasticsearch{ hosts => "<ip-elasticsearch>:<port-elasticsearch>" index => "syslogfe" }} Si noti che la configurazione di logstash fa riferimento al database GeoLiteCity.dat. Questo database accoppia range di ip con coordinate geografiche. E' presente di default in logstash ma se si vuole, come nella configurazione, riferirsi ai dati più aggiornati, è necessario scaricare il database dall'indirizzo http://dev.maxmind.com/geoip/legacy/geolite/ in una cartella e poi riferire il path nella configurazione. 4. CARICAMENTO OFFLINE DEI DATI E' stato predisposto un programma Python per il caricamento offline di dati. Il programma va eseguito nella macchina dove logstash è eseguito. Il codice sorgente del programma è il seguente (<logpath> rappresenta la cartella nella quale sono stati deposti i log che si vogliono caricare). import os import telnetlib path = '<logpath>' logstash = telnetlib.Telnet("localhost", "4444") for filename in os.listdir(path): print(filename) with open(path+"/"+filename) as fp: for line in fp: logstash.write(line) 5. PREDISPOSIZIONE AMBIENTE ESERCIZIO Si seguano i seguenti passi (in ambiente di produzione): 1) Si crei il nuovo indice syslogfe 2) Si modifichi la configurazione di logstash 3) Si scheduli il riavvio del servizio logstash alle 00:00 dello 01/05/2016