500 Internal Server Error

500 Internal Server Error

Hneď ráno som sa od Incident manažéra dozvedel, že nefunguje Úverová ponuka. Je to webová aplikácia banky poskytujúca rozhranie pre jej zmluvných partnerov, ktorým má táto aplikácia uľahčiť predaj úverov.

„Čo nefunguje?“ bola prvá otázka, ktorá mi skrsla v hlave. Aplikácia môže nefungovať rôznymi spôsobmi, ale keď niekto povie, že nefunguje, spontánne to evokuje totálny výpadok, čo zvyčajne, jemne povedané, nie je výstižné. Získať dobré zadanie problému, ktorý treba riešiť, je niekedy polovica jeho riešenia. V mnohých systémoch sme sa to už ako firma naučili, ale pri aplikáciách, kde je výpadkov málo alebo kde ide o nekritickú aplikáciu a z rôznych dôvodov sme sa na to zatiaľ nepozreli, nám chýbajú skúsenosti. Preto sú nahlásené informácie často vágne a neprofesionálne. A tak moja otázka bola úplne na mieste. „Nefunguje čiastková funkcionalita, nezobrazuje sa samotný web alebo v ňom klienti vidia nekorektné údaje?“ pýtal som sa svojich chalanov v tíme, ktorí na probléme už od včera, popri štyroch ďalších veciach, robili.

Dostal som odpoveď, že partnerom sa web zobrazuje, ale nevedia sa do neho prihlásiť. Ukázali mi ako to vyzerá. Do browsera hodili link webu, načítala sa stránka vo firemných farbách, ale po zadaní prihlasovacích údajov sa ani po niekoľkých desiatkach sekúnd nič nestalo. Asi až po minúte sa na stránke zobrazila chyba „500 Internal server error“.

„Ok.“ pomyslel som si a sám pre seba som si v tom okamihu definoval tento problém ako výzvu. V mojom tíme spravujeme cez sto aplikácií a priznám sa, že túto som doteraz vnímal len okrajovo. Bol som síce členom projektového tímu, ktorý vyberal riešenie, ale to som už niekoľko rokov skoro pri každom projekte, ktorý má dopad na IT. Chalani dodané riešenie naimplementovali bez mojej väčšej účasti a okrem pravidelného patchovania sa z môjho pohľadu na aplikácii nedialo nič, čomu by som mal venovať svoju pozornosť. Preto tá výzva.

Chalani už prezreli logy, spravili testy aplikácie, skúsili reštarty, ale niž nepomohlo. Vyzeralo to naozaj netypicky. Ak totižto pristupovali na web aplikácie lokálne, teda priamo na web servery, nie z internetu, všetko fungovalo ako hodinky. Z pohľadu infraštruktúry by mal byť teda problém niekde nad nami. Typicky na sieti. Za posledný týždeň sa na aplikáciu nenasadzovalo nič, takže aplikačne je bez zmien, čo by tiež potvrdzovalo domnieku, že je problém naozaj niekde mimo aplikácie.

Kým sa totiž požiadavka užívateľa dostane na server, kde sa spracuje aplikáciou, musí prísť z internetu cez pár firewallov, loadbalancerov, proxín a API rozhraní. No a niekde tam bol zrejme zdroj nášho problému.

Áno, nášho problému. Lebo tak to už chodí. My spravujeme aplikácie, ktoré majú svoje mená. Siete, infraštruktúra a v podstate ani databázy svoje mená nemajú. Rozprestierajú sa okolo nás ako bezmenné platformy, nad ktorými aplikácie fungujú. Preto, ak nefunguje nejaká služba, ktorá má tiež svoje meno, ide sa po mene a preto sme prví, ktorí problém riešia aj poslední, ktorí problém uzatvárajú. Anonymita infraštruktúry nás vynáša do tejto prvej línie a z tohto pohľadu sme v mojom tíme najfiremnejší z celej IT Ops časti firmy.

„Boli sme už za sieťarmi? Pozerali sa na to v DMZ-ke?“ boli moje ďalšie otázky. Boli, ale spätné info zatiaľ nemáme. Nejako som to aj chápal. V týchto týždňoch všetku pozornosť celého IT spotrebovával iný projekt a takáto odbočka bola tak trochu ako vyrušenie zadumeného vedca, aby uvolnil miesto upratovačke, ktorá raz za týždeň príde upratať. Zobral som si to na seba.

Zašiel som za novým kolegom v sieťovom tíme. Pohotovo mi ukázal jasnú a stručnú informáciu, za čo som mu v duchu poďakoval. Nie vždy sa stretnem s podobnou ústretovosťou.

„Aplikačné Apache vracajú na F5-ku 500 Internal server error.“ povedal. Na to sa ozval jeho seniornejší kolega: „Ja to už riešim v incidente.“

Trochu neochotne som si presadol k nemu, lebo jeho štýl práce aj senioritu som už dobre poznal. Stručne povedané, nespoľahlivý vo vyjadreniach aj vo výkone. Ukázal mi na svojom monitore v podstate to isté a skonštatoval, že za nich viac pomôcť nevedia. Tým zo mňa tá vďačnosť aj nadšenie opadlo. Odišiel som od nich, ale vonkoncom som nebol presvedčený, že problém nie je u nich. Ak bude treba vrátim sa.

Moji chalani skontrolovali našu časť F5-ky a API vrstvu nad aplikáciou. Až na to, že na oboch vrstvách boli vidieť znížené štatistické krivky záťaží, všetko vyzeralo v poriadku. Znížená záťaž len logicky potvrdzozvala, že máme výpadok.

Nakreslili sme si na tabuľu schému, aby sme vizualizovali problém a zapojili všetky mozgové bunky. Z browsera cez F5, kde sa pravidlom, ktoré som videl prvýkrát, vytvárala rozbočka. Jedna časť ďalej smeruje do API vrstvy a druhá na Reverse Proxy. Obe sa ale opäť spájajú na jednom a tom istom aplikačnom serveri. Pozeral som na to, ale nedávalo mi to zmysel.

„Môže byť problém v tejto výhybke?“ uvažoval som. Sotva. Tam sa žiadne zmeny nerobili a ani podľa logov tu problém nebol. Neskôr som zistil od kolegu z vývoja, že táto výhybka je tam kvôli požiadavke IT Security. Keďže táto aplikácia nepoužíva Federated Login, musí byť prihlasovanie riešené mimo API vrstvu. Do nej sa môže dostať len overený užívateľ, čo sa dnes zabezpečuje tou výhybkou. Pripadalo mi to ako poriadne harakiri. Žiaľ skoro všetky požiadavky IT Security od IT Operations mi pripadajú také, ale zrealizovať ich musíme.

Chalani niekoľkokrát skúsili znovu reštartnúť aplikačný server, na ktorom bežia tri aplikácie vrátane webu. Robili to už včera a skúšali to aj dnes, ale chcel som to vidieť na vlastné oči. Ak mám posunúť investigáciu ďalej, potrebujem si byť čo najistejší každým argumentom, ktorý tu padne. Reštart nepomohol.

„Skúsme iný browser.“ navrhol som. IE sa občas správa ako stará dáma. Niektoré zmeny, ktoré idú úplne mimo IT Ops, zvyčajne práve od IT Security majú vplyv na prostredie prehliadačov. Importujú pre ne rôzne politiky, ktoré zrazu vytvoria problém, ktorý napokon my riešime.

Vo Firefoxe aj v Chrome sa to ale správalo rovnako. Navyše lokálne stále všetko funguje, z internetu nie. Keby som sa správal ako ľudia, čo majú na starosti platformy, rovno by som dal ruky od stola s tým, že moja aplikácia funguje a problém u mňa nie je, riešte si to. Toto ale nie je môj štýl. Rád burcujem ľudí v iných tímoch, aby sa zapojili do riešenia problémov a toto si naozaj užívam. Teraz som ale veľmi nemal koho. Bola to situácia ako, keď človek pozerá na spojené nádoby a nechápe, prečo je v jednej z nich vyššia hladina. Odporuje to zdravému rozumu.

Zavolal som teda znovu kolegovi na vývoji, aby nám sem poslal človeka od dodávateľa aplikácie. Nebol z toho nadšený, ale priznal som mu svoje pocity, že nevieme čo s tým a každý nápad bude dobrý.

Medzičasom som pátral po argumentoch, ktoré by nás ako tím mali očistiť z incidentu z minulého týždňa. Hovoril som s kolegami, ktorí nemohli mať nič spoločné so súčasným problémom a bolo to pre mňa celkom osviežujúce, ako vyvetranie si hlavy. Keď som sa vrátil k mojim chalanom, práve mi volali z recepcie, že ma tam čaká pán od dodávateľa.

Bol tu do pol hodiny. Šikovná reakcia. Prišiel mladý chalan. Už vo dverách som tušil, že jeho skúsenosti budú silno viazané na aplikáciu, ktorú vyvíja a okolitý svet ho veľmi zaujímať nebude. Asi nám veľmi neporadí.

Odskočil som si zatiaľ na obednú prestávku a keď som sa vrátil, už tu nebol. „Z jeho pohľadu ide o problém mimo aplikáciu.“ tlmočili mi chalani. Aspoň zase s väčšou istotou vieme, že hľadáme problém mimo aplikáciu.

„Ok. Čo môžeme ďalej spraviť?“ hľadal som v duchu možnosti.

„Redeployneme aplikáciu.“ Je to síce výstrel do tmy, ale občas sme sa už aj v tme trafili. Navyše si budeme istí, že máme aktuálne verzie, že tam nechýba žiaden súbor alebo sa nejaký zbytočný znak nedostal nedopatrením do konfigurácie. Hlavne tie majú obrovskú moc vytvoriť komplexný problém z fatálne triviálnej zmeny.

Redeploy zbehol celkom rýchlo. Po ňom nám už ale web vôbec nenabehol. Nastala mrazivá chvíľka. Možno sme to pokazili ešte viac než to bolo. Nanešťastie aplikácia skoro nič neloguje, takže je to ako opravovať auto tým, že ho prestriekame. Skúsili sme aplikáciu ešte raz reštartnúť a po pár minútach už nabehla. Týmto webovým aplikáciám to niekedy trvá dlhšie. Redeploy teda fakt nepomohol.

„Redeployneme predposlednú produkčnú verziu.“ ďalší slepý pokus. Na to, aby sme to ale mohli spraviť, treba už trochu viac. Treba preveriť, či je ju vôbec možné nasadiť kvôli závislostiam na ostatných systémoch. Bola ale malá šanca, že je tam nejaká závislosť, lebo je to pomerne jednoduché riešenie. A je aj pomerne malá šanca, že to pomôže. Aplikácia sa začala správať nekorektne v pondelok, aspoň od vtedy máme incident.

Posledné zmeny sa robili naposledy v piatok pri dorovnávaní performačných nastavení do produkcie, ale táto aplikácia tam nefigurovala. Navyše v piatok ešte fungovala. Redeploy bude asi naozaj výstrel na slepo, lebo ním by sme fixli len aplikačnú chybu a všetko poukazuje na to, že aplikácia ako taká je naozaj v poriadku.

Kým išli chalani preveriť možnosť redeployu, odskočil som si na pravidelný status s iným dodávateľom, kde sme si prešli aktuálny stav riešenia našich požiadaviek, ale zase som mal pocit, že nedostávame to za čo si platíme. Nevidím to ako problém v kolegoch, ktorí pre nás u dodávateľa robia. Sú to všetko šikovní chalani. Skôr je to obchodný problém, s čím ja veľa nespravím. Tu môžem nanajvýš eskalovať. Dohodol si ešte Webex s Account Executive u ďalšieho dodávateľa na budúci týždeň a bežal som za chalanmi, ako to vyzerá s našou webkou.

Redeploy robiť nebudeme. Všetko ukazuje na to, že to bude zbytočné, zdĺhavé a navyše riskantné. Na tabuľu k schéme sme si napísali zmeny, ktoré sme robili v piatok. A tu mi napadlo, že niektoré zmeny, ktoré sme robili na API vrstve by mohli mať dopad aj na aplikáciu, ktorá nás celkom slušne práve trápila. API vrstva sa v piatok rekonfigurovala. Nie síce kvôli tejto aplikácii, ale stále je to jedna API vrstva a niektoré nastavenia ovplyvňujú všetko, čo cez ňu ide. Vybavili sa mi len zmeny týkajúce sa HTTP 1.0 na HTTP 1.1, ktoré nám dosť pomohli pri performance testoch, ale s určitosťou som vedel, že to nebola zďaleka jediná zmena.

„Skúsme spraviť revert zmien, ktoré sme robili v piatok na API vrstve.“ navrhol som.

Toto sa ľahko povie, ale ťažšie vykoná. Keďže API vrstva je spoločná pre viacero aplikácií, zmena by ovplyvnila aj ostatné, čo sme nechceli ani nemohli spraviť. Jediná možnosť je to spraviť najprv v testovacom prostredí. V žiadnom prípade nemôžeme ohroziť prioritný projekt.

„Poďme s tým najprv do testov.“ povedal som chalanom. Neriešil som žiadosť o rekonfiguračné okno v testovacom prostredí od vlastníka prostredia a Riadenia testovacích prostredí, čo by som podľa bežiacich procesov mal. Riešil som produkčný incident, ktorý má vždy voči testom vyššiu prioritu, čo mi dávalo mandát aj na takéto rozhodnutia. V tomto je krása týchto výpadkov. Všetko sa deje trochu ľahšie a bez byrokracie, ktorá má niekedy vie poriadne frustrovať.

Ďalší admin z môjho tímu, čo mal na starosti API vrstvu, zmenil HTTP 1.1 na pôvodné HTTP 1.0. Veľa vecí si vieme spraviť samy, čo je super. Vyskúšali sme aplikáciu. Nepomohlo to. Pre istotu sme ešte zreštartovali aplikáciu. Nepomohlo to. Ostal som tak trochu ako omráčený. Naozaj som sa cítil ako ten vedec pred spojenými nádobami. Mal som pocit, že som vystrieľal už všetky náboje a všetko mimo. Z tej tmy sa na mňa rútil ozrutný medveď a ja nie a nie trafiť. Čas tikal, banke sa zvyšujú straty a my tu stojíme zaseknutí v tme. Úžasné. V tomto biznise je ale riešenie vždy, len ho treba nájsť. Toto živí môj entuziamus pri každom výpadku. V duchu som si sumarizoval stav veci, ale okrem redeployu staršej verzie sme už fakt nemali nič po ruke.

Potom sa ozval znovu admin čo robil rekonfiguráciu, že to ešte nemôže fungovať, lebo ešte neskončil s konfiguráciou API vrstvy pre našu aplikáciu. Ako keby niekto zazvonil na zvon. Boli sme premotivovaní a trochu netrpezliví. To sa stáva. Znovu sa všetko rozhýbalo. Zmenil to. Vyskúšali sme aplikáciu z internetu a ako kolega zvykne hovoriť: „Zahralo to!“

„Super! Vieme, kde je príčina.“

Veľký applaus. Tento pocit na mojej robote mám fakt najradšej. To, keď po dlhých hodinách bádania sa to konečne podarí. Toto si skutočne vychutnávam a dáva mi to energiu aj niekoľko dní potom. Funguje to skoro ako dobrá dovolenka. Nie je toho ale veľa. Zvyčajne sa okolo problémov, ktoré riešime neváľa na nás strašne veľa byrokracie a špiny, z ktorej sa očistiť je namáhavejšie ako vyriešiť samotný problém.

Potom mi kolega povedal ešte jednu dobrú správu. API vrstvu vie nakonfigurovať tak, že náš prioritný projekt bude stále používať HTTP 1.1 a naša Úverová ponuka HTTP 1.0, čo nám dáva možnosť s tým ísť rovno do produkcie. Inak by sme v podstate boli pred dilemou, ktorú by sme už mi asi nevyriešili a museli by sa o riešení rozhodnúť vyšší manažéri a hlavne biznis – znížený výkon prioritnej aplikácie vs. dostupnosť menej kritickej aplikácie?

Boli presne tri hodiny, kedy začína Velín. Bežal som rovno tam, aby som si dal schváliť rekonfiguráciu do produkcie ešte dnes. Odkomunikoval som, čo chceme nasadiť a dohodol som termín na 24:00. Stále tam bol totiž možný dopad na prioritný projekt, takže takúto vec si môžeme dovoliť robiť len v noci.

Problém bol fixnutý, ale Workaroundom. Aby sme sa dostali na štandard, budeme musieť nájsť riešenie ako naučiť aj starú dámu pracovať s HTTP 1.1. Sú tu len dve možnosti. Jedna je dlhá, byrokratická a aj drahá, druhá je rýchla ale stojí viac námahy mojich ľudí, ktorí už beztak toho majú dosť veľa. Ale takí je dnes u nás IT život. Jednoduché riešenia už neexistujú. Majú ale vždy riešenia.