Սյունակ

Դաշբորդը մեկ օրում ստեց երկու անգամ՝ հակառակ ուղղություններով

Մեկ տուփ, մեկ կեսօր. մոդել, որը HTTP 200-ի տակ դատարկ պատասխաններ է վերադարձնում, և երկու առողջ կոնտեյներ, որոնց սխալ պորտին ուղղված զոնդը unhealthy է հայտարարել։ «Կանաչ, բայց փչացած»-ը և «կարմիր, բայց առողջ»-ը նույն հիվանդությունն են, և դեղը նույնն է։

կարծիք 20 օգոստոսի, 2026 թ.

Սա կարծիք-սյունակ է, ոչ թե լաբորատորիայի արդյունք։ Թվերն այստեղ հեղինակի աշխատանքային օրագրից և մեջբերված արտաքին աղբյուրներից են (նշված են տեքստում), երբեք՝ claim-երի ռեեստրից։ Չափված, ապացույցներով արդյունքներն ապրում են /claims/.

Օգոստոսի կեսին գնացինք ստուգելու երկու թարմ տեղակայված թեստային մոդել լաբի տուփերից մեկի վրա։ Սովորական ստուգում՝ docker ps, լոգեր, մի երկու smoke-հարցում։ Մեկ ժամվա ընթացքում տուփն արտադրեց մոնիտորինգի երկու դասական սուտն էլ՝ մեկական յուրաքանչյուր ուղղությամբ, և զույգն այնքան մաքուր ստացվեց, որ չգրառելը մեղք էր։

Կարմիր, բայց առողջ

Երկու կոնտեյներն էլ ցույց էին տալիս unhealthy։ Այնպիսի unhealthy, որի համար restart են անում ու գիշերվա կեսին մարդ արթնացնում։ Դրանց հետևում կանգնած մոդելներն ամբողջ այդ ընթացքում հարցումներ էին սպասարկում։

Պատճառը գտնելու համար բավական էր մեկ docker inspect։ Image-ը բերում է լռելյայն healthcheck, որը զոնդում է localhost:8080/health-ը։ Սերվերները գործարկված էին 8090 և 8091 պորտերի վրա։ Զոնդը թակում էր դատարկ միջանցքի մի դուռ, եզրակացնում, որ շենքում ոչ ոք չի ապրում, և վճիռը դրոշմում ստատուսի սյունակի մեջ — մինչդեռ իսկական սերվերները մեկ դուռ այն կողմ պատասխանում էին ամեն իրական հարցումի։

Հիվանդ ոչինչ չկար։ Հիվանդը չափումն էր։ Իսկ ստատուսի սյունակը «զոնդը սխալ է կարգավորված» գույն չունի; նա ունի միայն «մեռած»-ի գույն։

Կանաչ, բայց փչացած

Նույն տուփը, նույն կեսօրը։ Մոդելներից մեկը ծանր reasoning-մոդել է։ Ուղարկեցինք տրիվիալ հարց՝ զրո temperature-ով և սովորական թոքեն-բյուջեով — այնպիսին, ինչպիսին կվերցներ ցանկացած կլիենտ հավելված։ Այն պատասխանեց HTTP 200։

HTTP 200-ի ներսում՝ դատարկ content դաշտ։ Մոդելն ամբողջ բյուջեն ծախսել էր մտորման վրա — մտորման հոսքը լիքն էր տեքստով, կիսատ նախադասության վրա, երբ բյուջեն սպառվեց, — և պատասխանի ոչ մի թոքեն այդպես էլ դուրս չէր տվել։ Տրանսպորտի մակարդակի ամեն ազդանշան հաջողություն էր հաղորդում։ Ցանկացած կլիենտ, որը կարդում է content-ը և վստահում ստատուս-կոդին, օգտատիրոջը ցույց կտար դատարկ հաղորդագրություն, կգրանցեր հաջողված հարցում ու կանցներ առաջ։

Հենց այս խափանման ռեժիմը մենք չափել էինք սառեցված workload-ի վրա և հրապարակել որպես հաշվետվություն answerless HTTP 200-ի մասին։ Տարօրինակ էր նույն շաբաթում այն դիմավորել վայրի բնության մեջ. ոչ սադրված, ոչ կառուցված, պարզապես նստած կանաչ ստատուսի հետևում՝ առողջ տուփի վրա։

Նույն հիվանդությունը

Երկու սուտն ուղղված են հակառակ կողմերը, և հենց դա է զույգը դարձնում ուսուցանելի։ Մի համակարգը ձախողում էր հաղորդում հաջողության փոխարեն; մյուսը՝ հաջողություն ձախողման փոխարեն։ Ոչ մի բաղադրիչ չէր խափանվել։ Երկու զոնդն էլ ճշգրտորեն պատասխանում էին հենց այն հարցին, որի համար կարգավորված էին — «8080-ի վրա որևէ բան պատասխանո՞ւմ է», «HTTP հարցումն ավարտվե՞ց», — և այդ հարցերից ոչ մեկը այն չէր, որ մենք կարծում էինք, թե տալիս ենք, այն է՝ այս մոդելն իր գործն անո՞ւմ է։

Ստատուսի լույսը պնդում է չափման մասին։ Եթե զոնդի կոնֆիգուրացիան չի համընկնում այն համակարգի հետ, որը նա հավակնում է նկարագրել — սխալ պորտ, սխալ մետրիկա, սխալ բյուջե, — ուրեմն դու մոնիտորինգում ես ուրիշ համակարգ, որը քո համակարգի հետ պատահաբար կիսում է hostname-ը։ Դաշբորդը չարությունից չի ստում։ Այն պատասխանում է ճշգրիտ՝ հենց այն ուղղությամբ, որով դու ես այն ուղղել։

Երկու սուտն էլ կիսում են նաև գոյատևման նույն ռազմավարությունը. ստատուսի սյունակից այն կողմ ոչ ոք չի կարդում։ Կարմիրին restart են անում, ինչը ոչինչ չի փոխում, որովհետև վերագործարկված կոնտեյները ժառանգում է նույն զոնդը։ Կանաչին անտեսում են, ինչն ավելի վատ է, որովհետև անտեսվելը հենց կանաչի իմաստն է։ Երկու ուղղությամբ էլ խափանումն անտեսանելի է հենց այնտեղ, ուր մարդիկ նայում են, և ակնհայտ՝ մեկ շերտ ավելի խորը — լոգերում, պատասխանի մարմնում, — ուր ոչ ոք չի նայում, քանի դեռ սյունակը գույն ունի։

Ինչ սա փոխեց մեր պրակտիկայում

Լաբի չափման կանոնները գոյություն ունեն հենց այսպիսի նմուշների պատճառով, և այս զույգը դրանցից երեքը սրեց։

Գնահատեք բովանդակությունը, երբեք՝ տրանսպորտը։ Մեր gate-երը կարդում են պատասխանի տեքստը — ասվե՞ց արդյոք ընդհանրապես որևէ բան, ճի՞շտ լեզվով, առանց ցիկլերի, — իսկ առաջին թոքենի մեր մետրիկան պատասխանի առաջին թոքենը տարբերում է ինչ-որ բանի առաջին թոքենից՝ մտորումը ներառյալ։ Այս երկու սահմանումների արանքում է թաքնվում «կանաչ, բայց փչացած» դեպքը; TTFA-ի հաշվետվությունը հենց այդ ճեղքի մասին է։

Զոնդեք այն, ինչ դուք եք սպասարկում, ոչ թե այն, ինչ ենթադրում է image-ը։ Մեր harness-ի healthcheck-երը թիրախավորում են հենց այն endpoint-ն ու պորտը, որոնց վրա բջիջը կարգավորված է, և արագ են ընկնում, երբ պատասխան չկա. մեռած կոնտեյները պետք է արժենա վայրկյաններ, ոչ թե timeout-ի բյուջե։

Իսկ երբ կասկածյալը հենց տելեմետրիան է — երկաթի վրա, որտեղ ստանդարտ GPU ստեկը ընդհանրապես ոչինչ չի հաղորդում, — կոլեկտորն ինքն է կրում իր հնացման ահազանգը։ Դեղը պետք է գործի նաև հենց դեղի վրա, այլապես մոնիտորինգի խողովակը դառնում է ևս մեկ համակարգ, որը կարող է խափանվել կանաչ գույնով։

Իսկ տուփը, արձանագրենք, ամբողջ ընթացքում կարգին էր։ Կոտրված էին հարցերը — և հարցերը մերն էին։ Ուղղեք զոնդն այն բանի վրա, որն իրականում շահագործում եք, և գույնից մեկ շերտ ավելի խորը կարդացեք գոնե մեկ անգամ ամեն տեղակայման հաշվով։ Դաշբորդը կպատասխանի ցանկացած հարցի, որ կտաք։ Տվեք ճիշտ հարցը։

← Բոլոր սյունակները