Fiecare serviciu AWS înregistrează activitatea sa în fișiere, grupate în jurnale CloudWatch. Aceste grupuri sunt, de regulă, denumite după serviciul în cauză, pentru a facilita identificarea. În mod implicit, mesajele sistemului sau informațiile generale de stare sunt stocate în aceste fișiere jurnal.
Totuși, aveți posibilitatea de a adăuga înregistrări personalizate la aceste jurnale, pe lângă informațiile standard. Dacă aceste jurnale sunt concepute corect, ele pot contribui la crearea unor panouri de bord CloudWatch foarte utile.
Cu ajutorul metricilor și al informațiilor structurate, se pot obține detalii suplimentare despre procesele de lucru. Aceste panouri nu se limitează la afișarea informațiilor standard despre sistem, ci pot fi extinse cu conținut personalizat, agregat în widget-uri sau metrici definite de utilizator.
Interogarea fișierelor jurnal
Sursa: aws.amazon.com
AWS CloudWatch Log Insights vă oferă posibilitatea de a căuta și de a analiza datele jurnalelor din resursele dvs. AWS, în timp real. Este ca și cum ați avea o interfață de bază de date. Interogarea se definește în panoul de bord, iar acesta o va executa ori de câte ori este accesat sau în intervalul de timp specificat.
Pentru căutarea și analiza datelor din jurnale, se utilizează un limbaj de interogare numit CloudWatch Logs Insights. Acest limbaj este bazat pe un subset al limbajului SQL, permițând căutarea, filtrarea și agregarea datelor din jurnale. Astfel, puteți identifica anumite evenimente, cuvinte cheie sau filtra datele în funcție de câmpuri specifice. Funcția cea mai importantă este agregarea datelor din unul sau mai multe fișiere jurnal, generând statistici și vizualizări rezumative.
Când rulați o interogare, CloudWatch Log Insights scanează datele din grupul de jurnale și returnează textele din fișierele care se potrivesc criteriilor definite.
Exemplu de interogare a fișierului jurnal
Pentru a înțelege mai bine conceptul, să analizăm câteva interogări de bază.
În mod implicit, fiecare serviciu înregistrează anumite erori critice. Chiar dacă nu creați un jurnal dedicat pentru aceste evenimente, printr-o simplă interogare, puteți calcula numărul de erori apărute în ultimele ore, în jurnalele aplicației:
fields @timestamp, @message | filter @message like /ERROR/ | stats count() by bin(1h)
Sau, iată cum puteți monitoriza timpul mediu de răspuns al API-ului dvs. în ultima zi:
fields @timestamp, @message | filter @message like /API response time/ | stats avg(response_time) by bin(1d)
Deoarece utilizarea CPU este înregistrată în mod implicit în CloudWatch, puteți agrega și acest tip de informație:
fields @timestamp, @message | filter @message like /CPUUtilization/ | stats avg(value) by bin(1h)
Aceste interogări pot fi adaptate nevoilor specifice și utilizate pentru a crea metrici și vizualizări personalizate în panourile de bord CloudWatch. Pentru a face acest lucru, adăugați widget-ul în panoul de bord și introduceți codul care definește ce date să selecteze.
Iată câteva tipuri de widget-uri care pot fi utilizate în panourile de bord CloudWatch și completate cu date din Log Insights:
- Widget-uri text – Afișează informații sub formă de text, cum ar fi rezultatul unei interogări CloudWatch Insights.
- Widget-uri de interogare în jurnal – Afișează rezultatele unei interogări CloudWatch Insights, cum ar fi numărul de erori din jurnalele aplicației.
Cum să creați informații utile de jurnal pentru panoul de bord
Sursa: aws.amazon.com
Pentru a utiliza eficient interogările CloudWatch Insights în panourile de bord CloudWatch, este recomandabil să urmați anumite practici de bază atunci când creați jurnalele CloudWatch pentru fiecare serviciu din sistem. Iată câteva sfaturi:
#1. Utilizați înregistrarea structurată
Este important să respectați un format de înregistrare care folosește o schemă predefinită, astfel încât datele să fie stocate într-un format structurat. Acest lucru simplifică căutarea și filtrarea datelor, utilizând interogările CloudWatch Insights.
În esență, aceasta presupune standardizarea jurnalele pe diferitele servicii din arhitectura dvs. Definitrea acestui format în standardele de dezvoltare ajută foarte mult.
De exemplu, puteți defini ca fiecare problemă legată de un anumit tabel din baza de date să fie înregistrată cu un mesaj care începe cu: „[TABLE_NAME] Avertisment / Eroare: <mesaj>”.
Sau, puteți separa job-urile de date complete de cele incrementale folosind prefixe precum „[FULL/DELTA]”, pentru a selecta doar mesajele corespunzătoare proceselor de date specifice.
Puteți defini ca, în timpul procesării datelor dintr-un sistem sursă, numele sistemului să fie un prefix al fiecărei înregistrări de jurnal relevante. Ulterior, este mult mai ușor să filtrați aceste mesaje și să construiți metrici.
Sursa: aws.amazon.com
#2. Utilizați formate de jurnal consistente
Utilizați formate de jurnal uniforme în toate resursele dvs. AWS, pentru a simplifica căutarea și filtrarea datelor din jurnale cu interogările CloudWatch Insights.
Acest aspect este strâns legat de punctul anterior. Cu cât formatul jurnalelor este mai standardizat, cu atât este mai ușoară utilizarea datelor. Dezvoltatorii se pot baza pe acest format și îl pot folosi intuitiv.
Din păcate, majoritatea proiectelor nu acordă atenție standardelor de înregistrare a jurnalelor, iar multe nici măcar nu creează jurnale personalizate. Este surprinzător, dar foarte des întâlnit.
Este dificil de înțeles cum se poate lucra fără o abordare corectă a erorilor. Chiar și atunci când se încearcă o tratare a excepțiilor, aceasta este adesea implementată incorect.
Un format de jurnal consistent reprezintă un avantaj major, pe care puține proiecte îl au.
#3. Includeți metadate relevante
Includeți metadate relevante în jurnale, cum ar fi marcajele temporale, ID-urile resurselor și codurile de eroare, pentru a facilita căutarea și filtrarea datelor prin interogări CloudWatch Insights.
#4. Activați rotația jurnalelor
Activați rotația jurnalelor, pentru a preveni acumularea excesivă de date și a facilita căutarea și filtrarea acestora, folosind interogările CloudWatch Insights.
Lipsa datelor de jurnal este o problemă, dar la fel de dificilă este gestionarea unei cantități excesive de date nestructurate. Dacă datele nu pot fi folosite, este ca și cum nu ar exista deloc.
#5. Utilizați agenții CloudWatch Logs
Dacă nu doriți să construiți un sistem de jurnalizare personalizat, utilizați agenții CloudWatch Logs. Aceștia trimit automat datele jurnalelor din resursele AWS către CloudWatch Logs, facilitând căutarea și filtrarea acestora prin interogări CloudWatch Insights.
Exemple de interogări cu statistici mai complexe
Interogările CloudWatch Insights pot fi mult mai complexe decât declarațiile simple.
fields @timestamp, @message | filter @message like /ERROR/ | filter @message not like /404/ | parse @message /.*[(?<timestamp>[^]]+)].*"(?<method>[^s]+)s+(?<path>[^s]+).*" (?<status>d+) (?<response_time>d+)/ | stats avg(response_time) as avg_response_time, count() as count by bin(1h), method, path, status | sort count desc | limit 20
Această interogare efectuează următoarele acțiuni:
- Selectează evenimentele din jurnal care conțin textul „EROARE”, dar nu și „404”.
- Analizează mesajul din jurnal pentru a extrage marca temporală, metoda HTTP, calea, codul de stare și timpul de răspuns.
- Calculează timpul mediu de răspuns și numărul de evenimente din jurnal pentru fiecare combinație de metodă HTTP, cale, cod de stare și interval orar.
- Sortează rezultatele în funcție de număr, în ordine descrescătoare.
- Limitează rezultatul la primele 20 de intrări.
Această interogare identifică cele mai frecvente erori din aplicația dvs. și urmărește timpul mediu de răspuns pentru fiecare combinație de metodă HTTP, cale și cod de stare. Rezultatele pot fi utilizate pentru a crea metrici și vizualizări personalizate în panourile de bord CloudWatch, pentru a monitoriza performanța aplicației web și a rezolva problemele.
Un alt exemplu de interogare a mesajelor serviciului Amazon S3:
fields @timestamp, @message | filter @message like /REST.API.REQUEST/ | parse @message /.*"(?<method>[^s]+)s+(?<path>[^s]+).*" (?<status>d+) (?<response_time>d+)/ | stats avg(response_time) as avg_response_time, count() as count by bin(1h), method, path, status | sort count desc | limit 20
- Interogarea selectează evenimentele din jurnal care conțin textul „REST.API.REQUEST”.
- Apoi, analizează mesajul pentru a extrage metoda HTTP, calea, codul de stare și timpul de răspuns.
- Calculează timpul mediu de răspuns și numărul de evenimente din jurnal pentru fiecare combinație de metodă HTTP, cale și cod de stare, și sortează rezultatele în funcție de număr, în ordine descrescătoare.
- Limitează rezultatul la primele 20 de intrări.
Rezultatul acestei interogări poate fi folosit pentru a crea un grafic liniar într-un panou de bord CloudWatch, care să afișeze evoluția timpului mediu de răspuns, pentru fiecare combinație de metodă HTTP, cale și cod de stare.
Construirea panoului de bord
Pentru a integra metricile și vizualizările din rezultatul interogărilor CloudWatch Insights în panourile de bord CloudWatch, accesați consola CloudWatch și urmați instrucțiunile din asistentul de creare a panoului de bord.
Un exemplu de cod pentru un panou de bord CloudWatch, care include valori generate de interogări CloudWatch Insights, arată astfel:
{ "widgets": [ { "type": "metric", "x": 0, "y": 0, "width": 12, "height": 6, "properties": { "metrics": [ [ "AWS/EC2", "CPUUtilization", "InstanceId", "i-0123456789abcdef0", { "label": "CPU Utilization", "stat": "Average", "period": 300 } ] ], "view": "timeSeries", "stacked": false, "region": "us-east-1", "title": "EC2 CPU Utilization" } }, { "type": "log", "x": 0, "y": 6, "width": 12, "height": 6, "properties": { "query": "fields @timestamp, @message | filter @message like /ERROR/ | stats count() by bin(1h) ", "region": "us-east-1", "title": "Application Errors" } } ] }
Acest panou de bord CloudWatch conține două widget-uri:
- Un widget metric care afișează utilizarea medie a CPU a unei instanțe EC2, în timp. Datele sunt generate de o interogare CloudWatch Insights, care selectează datele de utilizare a procesorului pentru o anumită instanță EC2 și le agregă la intervale de 5 minute.
- Un widget de jurnal care afișează numărul de erori ale aplicației, în timp. Acesta selectează evenimentele din jurnal care conțin textul „EROARE” și le agregă la intervale de o oră.
Este un fișier în format JSON, care definește structura panoului de bord și valorile afișate. Include și interogarea insight, ca proprietate.
Puteți utiliza acest cod în orice cont AWS. Presupunând că serviciile și mesajele jurnalelor sunt consistente în toate conturile și etapele dvs. AWS, panoul de bord va funcționa în toate conturile fără a fi necesară modificarea codului sursă.
Cuvinte finale
Construirea unei structuri solide de jurnalizare a fost întotdeauna o investiție bună în fiabilitatea sistemului. Acum, aceasta poate servi și unui scop mai amplu: să oferiți panouri de bord utile, cu metrici și vizualizări, ca un efect secundar al acestui efort.
Odată implementată corect, cu un efort minim, echipa de dezvoltare, echipa de testare și utilizatorii de producție pot beneficia de aceeași soluție.
Vă recomandăm să analizați cele mai bune instrumente de monitorizare AWS.