tl;dr Každý kód spústený na produkcii sa skôr či neskôr rozbije. Preto je dobré software nielen testovať, ale aj monitorovať a mať prehľad o tom, čo sa v ňom deje. Naše RESTFUL API monitorujeme pomocou nástrojov z Elastic Stack-u: LogStash, ElasticSearch, Heartbeat, Kibana na vizualizáciu a ElastAlert (nástroj tretej strany) na alerting.

Začnime analógiou. Vo výrobnej hale na mačacie žrádlo skončila poobedňajšia smena. Zo spŕch pracovníkov sa ozývajú nevkusné vtipy a teta upratovačka s naštvaným výrazom umyla aj posledný kus dlážky vo výrobnej hale, ktorý teraz pomaly schne. Keď sa všetci rozpŕchnu domov, vo fabrike sa udeje niečo nepredpokladané. Napríklad: Chalanisko, každý ho volal Fero, zabudne vypnúť rychlovarnú kanvicu. Tá je zhodou okolností pokazená – začne horieť. Z malého požiaru je odrazu veľký. Kusy žeravého mačacieho žrádla lietajú okolým ako projektily, plechovky to pod náporom tepla prestávajú zvládať…no proste pohroma. V tom sa zapne alarm, zo stropu vytryskne prúd vody, na 112-ke sú automaticky informovaní a akcia môže začať. Do 5 minút na mieste zasahuje „armáda“ záchranárov a do raná je minimálne časť fabriky natoľko v pohode, že mačky v okolí môžu žiť bez strachu o to, že budú mať prázdne brušká.

this is fine GIF

Vysvetlime si analógiu. Fabrika je náš web, appka alebo akýkoľvek iný soft. Požiar je problém, ktorému sa možno dalo predísť, možno nie. Systém alarmov je monitoring, ktorý budem v ďalšej časti opisovať a ten zvyšok, ten je tam len na okorenenie.

Na akcii FrontendMasters 11  a v článku na našom blogu sme písali a rozprávali o testovaní ako o jednej z praktík ako tvoriť kód, ktorý bude robiť to čo má čo najdlhšie. Ak si však chceme byť úplne istý, že to, čo sme vytvorili naozaj funguje a najmä, že funguje dlhodobo, musíme náš soft monitorovať.

Dôvodov ako sa môže niečo pokaziť je milión:

  • od nepredpokladaných okolností, ktoré nemohli byť zahrnuté do testovacích scenárov
  • až po situácie, kedy sa vyčerpajú systémové prostriedky

Monitoring aplikácie v produkcii nám pomôže okrem katastrofických scenárov riešiť aj problémy s výkonom a odhaliť rôzne drobné nedostatky.

Čo chceme sledovať?

V našom prípade bolo cieľom začať čo najlepšie sledovať funkčnosť HTTP RESTFUL API, ktoré tvorí srdce celého systému. Ak nejde API, nejde nič. Rozhodli sme sa pre zber, vizualizovanie a následný monitoring týchto vstupov:

  • access logy
  • error logy
  • uptime
  • APM
  • monitoring systémových prostriedkov
  • monitoring stavu služieb, ktoré API potrebuje na svoj beh – Mongo, Redis, Elastic, Nginx

Ako sledovať?

Na trhu je viacero nástrojov, ktoré nám umožnia sledovať čo sa deje s našou aplikáciou. My sme sa však snažili vybrať kombináciu, ktorá by nám umožňovala:

  • zbierať dáta z rôznych zdrojov a následne ich vizualizovať na jednom mieste
  • na rovnakom mieste mať aj APM (Application Performance Monitoring)
  • ideálne by sa mohlo jednať o nástroj, ktorý by sme na server inštalovali tak či onak a zároveň ho dobre poznáme
  • a ak by to bolo možné, bol by to Open Source, aby sme zvyšné chechtáky minuly na pivo

V našom prípade sme sa rozhodli pre skupiny nástrojov okolo ElasticStack-u plus ElastAlert, čo vysvetlím neskôr.

Od logu k Elastic-u 📈

Na to aby sme vôbec mohli začať niečo sledovať a vizualizovať potrebujeme mať k tomu adekvátne dáta. Access logy a error logy sú u nás vytvárané pomocou Winston-u, ktorý ich zapisuje do samostatných súborov. To, ako na API vznikne access log sa môže meniť. Napríklad, môžeme vytváranie access logu prenechať na NGINX alebo na Apache Web Server. Na konci dňa nám tak či tak vznikne súbor, ktorý môže obsahovať buď JSON alebo štandardný Apache Access Log.

Tieto dáta chceme dostať do podoby, ktorá by nám ich umožnila jednoducho vizualizovať. Na túto úlohu sme si pozvali LogStash. Jedná sa o službu, ktorá umožňuje spracovanie, transformáciu a prenos logov. Teda na jednej strane stojí napríklad súbor s plain textom a na strane druhej stoja štruktúrované dáta, napríklad JSON, ktoré obsahujú možno aj nejaké tie informácie navyše. Výhodou LogStash-u je to, že dáta dokáže uložiť priamo do ElasticSearch-u.

Toto samotné je podľa mňa už veľký krok vpred, oproti klasickému pohľadu na access log, ktorý sa často len tak hala-bala povaľuje na serveri a raz za čas do neho niekto nakukne. Za pomoci zopár konfigurácií máme zrazu dáta na mieste, z ktorého s nimi môžeme pohodlne pracovať.

Kibana 👀

Keď som použil Kibanu prvý krát mal som pocit, že sa jedná o developerský nástroj k Elastic-u. Aktuálne sa však Kibana pre nás stala „oknom“ do prevádzky nášho API. Kibana nám umožnila vizualizovať všetky dáta, ktoré do Elasticu prichádzajú. Umožňuje nám vytvárať si vlastné prehľady a je to súhrnné miesto, kde sa môžeme kedykoľvek vrátiť a zistiť, kde nastal problém. Takto to u nás na www.pricemania.sk vyzerá v Kibane:

 

Alerting 🔔

Ak dôjde k nepredpokladanej udalosti, chceme byť o nej okamžite informovaní. ElasticStack samotný poskytuje alerting. Táto funkcionalita je ale dostupná až v spoplatnenej verzii a preto sme sa rozhodli sa poobhliadnuť po open source riešení, ktoré by sme aspoň otestovali. Rozhodli sme sa pre ElastAlert, ktorý pododne ako LogStash stačí jednoducho nakonfigurovať. Za ElastAlertom stojí Yelp a pomerne veľká komunita. Teda aj napriek tomu, že sa jedná o komunitný software, nebáli sme sa ho použiť. Krása takto vyskladaného riešenia spočíva navyše v tom, že v momente, v ktorom sa rozhodneme ElastAlert vymeniť, môžeme tak urobiť úplne jednoducho.

Záver

Ak si chcete byť istý funkčnosťou vašej appky, určite monitorujte aspoň jej kľúčové časti. Ak sa chcete dozvedieť viac o našom monitoringu tak sledujte dátum konania ďalšieho frontend masters.

Chcete sa dozvedieť viac o našej práci?