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