Tutorial Logstash: utilizzo di Logstash per semplificare le notifiche e-mail
Pubblicato: 2022-03-11Le app che utilizzano le e-mail come meccanismo principale per segnalare errori ed eccezioni all'inizio sembrano sempre una buona idea. Come sviluppatori Java pensiamo, "hey, saprò immediatamente quando qualcosa va storto!"
Tuttavia, a un certo punto ti rendi conto che le e-mail di errore ti stanno allontanando e devi ripulire la tua casella di posta elettronica. Puoi ignorare i 404 (il più delle volte) e può essere bello ricevere notifiche di nuove iscrizioni, ma alla fine della giornata potrebbe diventare un po' troppo frenetico o richiedere molto tempo.
Prima o poi, diventa difficile distinguere le email "azionabili" dalle notifiche inutili. Puoi impostare regole e filtri sulla tua posta, ma anche questi possono iniziare a diventare ingestibili.
Questo tutorial Java esaminerà la possibilità di utilizzare Logstash per riprendere il controllo e ripulire la posta in arrivo e rendere nuovamente gestibili le e-mail di errore, il tutto senza modificare nulla nella tua app.
Configurazione e input di Logstash
Il primo passaggio nel nostro tutorial su Logstash è assicurarsi che tutte le email che ricevi dal tuo sistema vadano in una cartella. Dal momento che stiamo spostando tutto l'ordinamento e la gestione dalla tua casella di posta, non importa più che si tratti di una grande cartella. Vai avanti e rimuovi tutte le cartelle e i filtri che hai già impostato e riducilo a una cartella e un filtro.
Sposta tutte le email da "[email protected]" alla cartella "MyAwesomeAppEmails". Se hai una casella di posta separata per queste e-mail, sarà ancora più semplice.
Ora possiamo impostare Logstash per eseguire il polling di quella cartella e analizzare i messaggi di posta utilizzando il plug-in IMAP. La versione 1.4.2 supporta solo il pull di e-mail dalla Posta in arrivo, ma nella versione 1.5 è stata applicata una correzione relativamente semplice per consentire il polling di una cartella specifica. Se non hai una casella di posta separata, applica la patch al plug-in IMAP nella tua istanza Logstash prima di continuare.
# /etc/logstash/conf.d/01-imap-input.conf input { imap { host => "imap.yourmailserver.com" user => "username" password => "password" secure => true fetch_count => 15 folder => "MyAwesomeAppEmails" # This line will only work if you apply the above mentioned patch } }
Questo inizierà a controllare le nuove e-mail e ad analizzarle negli eventi Logstash.
Filtro Logstash
Molti dati utili vengono analizzati dalle e-mail in diverse proprietà dell'evento: si noti che il timestamp dell'e-mail viene utilizzato come "@timestamp" per l'evento. Inoltre, dalle sole intestazioni possiamo fare cose come identificare l'host da cui ha avuto origine l'errore:
filter { mutate { replace => [ "received", "%{[received][-1]}" ] } grok { match => [ "received", "from %{HOSTNAME:hostname} \(%{HOSTNAME:full_hostname} \[%{IP:ip}\]\)" ] } mutate { remove_field => [ "received" ] } }
Questo, tuttavia, non è sufficiente per domare le tue email di errore. Abbiamo bisogno di qualcosa in più, in particolare i seguenti tre passaggi che descrivono:
- Il tipo di errore
- La gravità dell'errore
- Eventuali dettagli di errore inclusi nell'e-mail
Supponiamo che tu abbia inserito il nome dell'errore, ad es. "Widget non riuscito", nonché la gravità dell'errore "ERRORE" nell'oggetto dell'e-mail in questo modo: "ERRORE: Widget non riuscito in /var/www/myapp/foobar .php 20”.

Lo useremo per impostare diverse proprietà dell'evento:
filter { grok { match => [ "subject", "%{WORD:severity}: %{DATA:type} in %{PATH:path} %{POSINT:line}" ] } }
Logstash viene fornito con una serie di modelli predefiniti che puoi aspettarti di vedere nei registri e in altri vari luoghi. Usali per costruire i tuoi schemi Grok e renderli più facili da leggere. Abbiamo usato "WORD" (una singola parola), "DATA" (non avido), "PATH" (un percorso di file Unix o Windows) e "POSINT" (un numero intero positivo). Puoi anche usare Grok Debugger per eseguire il debug dei tuoi pattern Grok. I messaggi che non corrispondono al modello verranno contrassegnati con il tag "_grokparsefailure".
Ciò si occupa del tipo, della gravità, del file di origine e della riga dell'errore, in pratica tutti i metadati rilevanti dell'evento. Ora sui dettagli.
Logstash di ottimizzazione fine
Potresti aver precedentemente aggiunto una bella firma di intestazione o piè di pagina alla tua email, essendo la persona cortese che sei, ma ora è d'intralcio. Rimuoviamolo dal messaggio, così come qualsiasi spazio bianco finale in modo da poter analizzare il resto dell'e-mail per lo stacktrace di errore:
filter { mutate { # gsub takes 3 elements per substitution: field, regular expression and substitution gsub => [ "message", "Your Dev Team", "", "message", "More error details:", "" ] } mutate { strip => "message" } # Split the message into an array of lines, each containing a line of the stacktrace mutate { split => [ "message", "\n" ] } }
La mutazione "gsub" utilizza l'oggetto standard Ruby Regexp, quindi tutte le opzioni e le funzionalità sono disponibili anche in logstash.
Output tramite Elasticsearch e Amazon SNS
Applichiamo questo alla nostra istanza Elasticsearch utilizzando l'output di Logstash Elasticsearch in modo da poter cercare e quantificare facilmente i dati che stiamo raccogliendo:
output { if "_grokparsefailure" not in [tags] { elasticsearch { } } }
Stiamo escludendo tutti i messaggi che non hanno inviato correttamente Grok controllando il tag "_grokparsefailure". Il presupposto è che solo le email il cui oggetto corrisponde all'oggetto specificato debbano essere interpretate come email di errore. Altrimenti, è semplice e diretto.
Logstash viene fornito con una miriade di output, quindi miglioriamo questo ancora di più utilizzando l'output SNS per notificarci errori significativi utilizzando Simple Notification Service (SNS) di Amazon. Assumiamo che tutti gli errori di tipo "notificabile" debbano generare una notifica. Se non sei su un'istanza EC2, dovrai specificare una chiave e un segreto AWS.
output { if "notifiable" in [tags] { sns { region => "us-east-1" arn => "arn:aws:sns:us-east-1:1234567890123456:mytopic" access_key_id => "AWS ACCESS_KEY" # Only specify these if you're not on an EC2 instance secret_access_key => "AWS ACCESS SECRET" # Only specify these if you're not on an EC2 instance } } }
Contrassegnare gli errori come "notificabili" dipende da te. Puoi farlo osservando la gravità dell'errore o guardando il tipo di errore.
Ora puoi effettivamente leggere di nuovo e-mail importanti e puoi essere sicuro di non perdere importanti e-mail di errore. Puoi anche prendere decisioni informate su quali errori correggere, in quanto puoi vedere la frequenza con cui si verifica un errore e quando si è verificato l'ultima volta. Anche la ricerca di un errore specifico è più facile e veloce, grazie agli straordinari poteri di ricerca di Elasticsearch descritti in questo tutorial di Logstash.