Tutorial Logstash: Utilizarea Logstash pentru a eficientiza notificările prin e-mail
Publicat: 2022-03-11Aplicațiile care folosesc e-mailurile ca mecanism principal de raportare a erorilor și excepțiilor par întotdeauna o idee bună la început. În calitate de dezvoltatori Java ne gândim: „hei, voi afla imediat când ceva nu merge bine!”
Cu toate acestea, la un moment dat sunteți obligat să vă dați seama că e-mailurile de eroare se îndepărtează de dvs. și trebuie să curățați căsuța de e-mail. Puteți ignora 404s (de cele mai multe ori) și poate fi plăcut să primiți notificări cu privire la noile înscrieri, dar la sfârșitul zilei poate deveni puțin prea agitat sau consuma mult timp.
Mai devreme sau mai târziu, distingerea e-mailurilor „acționabile” de notificările inutile devine dificilă. Puteți configura reguli și filtre pentru e-mailul dvs., dar chiar și acestea pot începe să devină imposibil de gestionat.
Acest tutorial Java va analiza posibilitatea de a utiliza Logstash pentru a recâștiga controlul și a curăța căsuța de e-mail și a face e-mailurile de eroare gestionabile din nou, totul fără a schimba nimic în aplicația dvs.
Configurare și introducere Logstash
Primul pas în tutorialul nostru Logstash este să ne asigurăm că toate e-mailurile pe care le primiți de la sistemul dvs. ajung într-un singur folder. Deoarece mutăm toate sortările și gestionarea din căsuța dvs. de e-mail, nu va mai conta că este un dosar mare. Continuați și eliminați toate folderele și filtrele pe care le-ați configurat deja și reduceți-le la un folder și un filtru.
Mutați toate e-mailurile din „[email protected]” în folderul „MyAwesomeAppEmails”. Dacă aveți o cutie poștală separată pentru aceste e-mailuri, atunci va fi și mai ușor.
Acum putem configura Logstash să interogheze acel folder și să analizăm e-mailurile folosind pluginul IMAP. Versiunea 1.4.2 acceptă doar extragerea de e-mailuri din Inbox, dar există o remediere relativ simplă care a fost aplicată în versiunea 1.5 pentru a permite interogarea unui anumit folder. Dacă nu aveți o cutie poștală separată, vă rugăm să aplicați patch-ul pluginului IMAP din instanța dvs. Logstash înainte de a continua.
# /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 } }
Aceasta va începe să verifice noile e-mailuri și să le analizeze în evenimente Logstash.
Filtrul Logstash
O mulțime de date utile sunt analizate din e-mailuri în diferite proprietăți ale evenimentului - observați că marcajul de timp al e-mailului este folosit ca „@timestamp” pentru eveniment. Chiar și mai mult, numai din anteturi putem face lucruri precum identificarea gazdei de la care a provenit eroarea:
filter { mutate { replace => [ "received", "%{[received][-1]}" ] } grok { match => [ "received", "from %{HOSTNAME:hostname} \(%{HOSTNAME:full_hostname} \[%{IP:ip}\]\)" ] } mutate { remove_field => [ "received" ] } }
Acest lucru, însă, nu este suficient pentru a vă îmblânzi e-mailurile de eroare. Avem nevoie de ceva mai mult, în special de următorii trei pași care descriu:
- Tipul erorii
- Severitatea erorii
- Orice detalii despre eroare incluse în e-mail
Să presupunem că ați plasat numele erorii, de exemplu „Widget Failed”, precum și gravitatea erorii „EROARE” în subiectul e-mailului astfel: „EROARE: Widget Failed în /var/www/myapp/foobar .php 20”.

Vom folosi aceasta pentru a seta mai multe proprietăți ale evenimentului:
filter { grok { match => [ "subject", "%{WORD:severity}: %{DATA:type} in %{PATH:path} %{POSINT:line}" ] } }
Logstash vine cu o serie de modele predefinite pe care vă puteți aștepta să le vedeți în jurnale și în alte locuri diferite. Folosiți-le pentru a vă construi modelele Grok și pentru a le face mai ușor de citit. Am folosit „WORD” (un singur cuvânt), „DATA” (catchall non-lacom), „PATH” (o cale de fișier Unix sau Windows) și „POSINT” (un număr întreg pozitiv). De asemenea, puteți utiliza Grok Debugger pentru a vă depana modelele Grok. Mesajele care nu se potrivesc cu modelul vor fi etichetate cu eticheta „_grokparsefailure”.
Acesta are grijă de tipul, gravitatea, fișierul sursă și linia erorii - practic toate metadate relevante ale evenimentului. Acum trecem la detalii.
Reglare fină Logstash
Este posibil să fi adăugat anterior un antet sau o semnătură de subsol drăguță la e-mailul tău, fiind persoana politicoasă care ești, dar acum este în cale. Să-l eliminăm din mesaj, precum și orice spațiu alb în urmă, astfel încât să putem analiza restul e-mailului pentru urmărirea stivei de eroare:
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" ] } }
Mutația „gsub” folosește obiectul standard Ruby Regexp, astfel încât toate opțiunile și caracteristicile sunt disponibile și în logstash.
Ieșire prin Elasticsearch și Amazon SNS
Să aplicăm acest lucru instanței noastre Elasticsearch folosind rezultatul Logstash Elasticsearch, astfel încât să putem căuta și cuantifica cu ușurință datele pe care le colectăm:
output { if "_grokparsefailure" not in [tags] { elasticsearch { } } }
Excludem toate mesajele care nu au folosit Grok corect, verificând eticheta „_grokparsefailure”. Presupunerea este că numai e-mailurile al căror subiect se potrivește cu subiectul specificat ar trebui interpretate ca e-mailuri de eroare. În rest, este simplu și direct.
Logstash vine cu o multitudine de rezultate, așa că haideți să îmbunătățim acest lucru și mai mult folosind ieșirea SNS pentru a ne anunța despre erori semnificative folosind Serviciul de notificare simplă (SNS) de la Amazon. Vom presupune că toate erorile de tip „notificabil” trebuie să genereze o notificare. Dacă nu vă aflați pe o instanță EC2, va trebui să specificați o cheie și un secret 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 } } }
Etichetarea erorilor ca „de notificare” depinde de dvs. Puteți face asta analizând fie gravitatea erorii, fie tipul erorii.
Acum puteți citi din nou e-mailuri importante și puteți fi sigur că nu veți rata e-mailurile de eroare importante. De asemenea, puteți lua decizii informate cu privire la erorile de remediat, deoarece puteți vedea cât de des apare o eroare și când a apărut ultima dată. Căutarea unei anumite erori este, de asemenea, mai ușoară și mai rapidă, datorită puterilor uimitoare de căutare ale Elasticsearch prezentate în acest tutorial Logstash.