← All posts

Ons het bewys dat elke waarskuwing kon afgaan. Die meeste van hulle kon nie.

Authagonal·July 31, 2026

Monitering het 'n eienskap wat dit uniek gevaarlik maak: dit is die kode wat net tydens 'n ramp loop. Elke ander deel van jou stelsel loop voortdurend, voor gebruikers, en gooi foute wat jy raaksien. Jou waarskuwingstelsel loop op die dag wanneer die databasis volraak, en nie voor dit nie, en as dit stukkend is, kom jy dit agter op presies die oomblik toe jy daarop staatgemaak het, en op presies die manier wat waarborg dat niemand gekyk het nie. 'n Stil waarskuwing is erger as geen waarskuwing nie, want van geen waarskuwing weet jy dat jy dit nie het nie, en van 'n stil een glo jy dat jy dit wel het.

Daarom het ons opgehou glo dat ons waarskuwings werk bloot omdat ons hulle geskryf het, en 'n toetstuig gebou om dit te bewys. Vir elke waarskuwingreël wat ons ontplooi, dryf die toetstuig 'n werklike sein wat dit behoort te laat afgaan, en dan doen dit die ding wat werklik saak maak: dit wag totdat die kennisgewing fisies in 'n vangaflos aankom, 'n klein diens wat die plek inneem van die foon wat andersins sou gons. Om in die moniteringnutsding se eie koppelvlak af te gaan, tel nie. Aflewering tel. Die volle pad van sein tot 'n boodskap in die hand, of dit is 'n mislukking.

Die eerste werklike lopie het die meeste van die reëls laat misluk. Hier is wat agter groen paneelborde weggekruip het.

Die vlagskipwaarskuwing was dood

Die belangrikste reël wat ons besit, is die een wat afgaan wanneer die foutkoers klim: te veel HTTP 500's, roep iemand op. Die toetstuig het vierhonderd en vyftig werklike bedienerfoute daarteen gedryf, bevestig dat minstens negentig persent van hulle werklik 500 teruggegee het, en gewag. Niks het aangekom nie. Die enkele waarskuwing wat ons die graagste sou wou vertrou, het nog nooit een keer afgegaan nie, en sou nie in 'n werklike voorval afgegaan het nie.

Die oorsaak was 'n naam. Ons metrieke kom uit OpenTelemetry, waar name gepunt is, soos http.server.request.duration. Iewers tussen die lees van 'n tutoriaal en die skryf van die navraag het ons aangeneem dat die moniteringagterkant daardie punte na onderstrepe sou normaliseer, soos baie Prometheus-nutsgoed doen, en die waarskuwingnavraag teen die vorm met onderstrepe geskryf. Die agterkant normaliseer nie. Dit hou die gepunte name presies soos gestuur. So het die waarskuwing 'n metriek bevraag wat nie bestaan het nie, niks gepas nie, vir ewig 'n foutkoers van nul bereken, en daar kalm en groen gesit terwyl die werklike metriek, onder sy werklike gepunte naam, elkeen van daardie 500's aangeteken het. Die navraag was nie verkeerd op 'n manier wat fouteer nie. Dit was verkeerd op 'n manier wat stilweg die leë versameling teruggee, wat rekenkunde dan in 'n heeltemal geloofwaardige nul verander.

Die een wat elke logwaarskuwing saam met dit platgetrek het

Dit was die slegte een. Die volgende een was erger, en die toetstuig het dit net gevang omdat dit op aflewering aandring eerder as op die reël wat korrek lyk.

'n Hele kategorie van ons waarskuwings is log-gebaseerd: pas 'n reël in die logs, gaan af. Elke enkele een van hulle het teen niks geëvalueer nie, en die rede het niks met die waarskuwingreëls te doen gehad nie. Dit was 'n behoudsinstelling.

Ons versoen ons logbehoud deur die agterkant se instellings-API. Daardie API het na 'n nuwe weergawe met 'n nuwe versoekvorm geskuif, en ons het steeds die ou vorm gestuur. Die ou liggaam is nie verwerp nie. Die dekodeerder aan die ander kant ignoreer stilweg velde wat dit nie herken nie, so dit het ons nou-onbekende velde as afwesig gelees, die verstekwaarde geneem vir die behoud wat dit nie kon vind nie, en daardie verstekwaarde was nul. Die oproep het 'n vrolike 200 teruggegee. En 'n behoud van nul dae beteken onmiddellike vervaltyd: nuut geskrewe logdata is gestempel om dadelik te verval, so die stoor waarteen die logwaarskuwings navraag doen, was vir alle praktiese doeleindes altyd leeg. Inname het die hele tyd heeltemal gesond gelyk, want logs het aangekom. Hulle het net op die oomblik van aankoms verouder.

Elke van die twee stelsels het iets verdedigbaars gedoen. Die instellings-API het 'n versoek aanvaar wat dit gedeeltelik nie verstaan het nie, eerder as om te misluk, wat 'n algemene en dikwels redelike keuse is. Ons ontplooiing het 'n liggaam gestuur wat verouderd geraak het teen 'n weergawesprong. Nie een van hulle het enigiets laat opduik nie. Die gevolg was dat die enkele mees gevolgryke getal in ons logpyplyn, naamlik hoe lank 'n log leef, stilweg op nul gestel is, en die enigste sigbare simptoom was dat elke logwaarskuwing permanent en gesond-lykend stil was. As ons getoets het dat die reëls reg lyk, het hulle volmaak gelyk. Net die toets dat 'n werklike gelogde gebeurtenis 'n afgelewerde oproep oplewer, kon dit blootlê, want net daardie toets lees werklik terug uit die stoor wat leeggemaak is.

Die waarskuwings wat vir ewig afgegaan het, wat dieselfde is as nooit

'n Derde mislukking het in die teenoorgestelde rigting geloop, en dit is die subtiele een. 'n Handvol ouditwaarskuwings het voortdurend afgegaan. Dit klink soos die teenoorgestelde van 'n stil waarskuwing, maar dit het presies dieselfde uitwerking, en om te verstaan hoekom, is die ompad werd.

Wanneer een van hierdie waarskuwings afgaan, skryf die moniteringagterkant 'n logreël oor die evaluering, 'n broodkrummel, en daardie reël het die waarskuwing se eie filteruitdrukking as teks bevat. Daardie broodkrummel is self as 'n log ingeneem, soos enigiets anders. So die volgende keer toe die reël geëvalueer het, het dit 'n passende reël gevind: sy eie voetspoor van die vorige keer. Die reël het selfonderhoudend geword. Dit het sy eie skaduwee gepas, by elke evaluering, vir ewig.

'n Waarskuwing wat altyd afgaan, gaan nooit oor van nie-afgaan na afgaan nie, en daardie oorgang is die ding wat 'n kennisgewing stuur. So het die waarskuwingslaag, wat 'n toestand gesien het wat reeds waar was en waar gebly het, verdere kennisgewings onderdruk, presies soos ontwerp, om jou te spaar van 'n oproep elke minuut oor iets waarvan jy reeds vertel is. Die gevolg is dat 'n werklike gebeurtenis, 'n opregte ouditaksie wat 'n oproep werd is, by 'n reël aangekom het wat reeds vasgesteek was op aan, en dus niks gesê het nie. 'n Waarskuwing wat permanent op aan vasgesteek is, is net so stom soos een wat permanent op af vasgesteek is. Die oplossing was om daardie reëls te beperk tot logreëls wat deur ons eie dienste uitgestuur word, sodat hulle ophou om die agterkant se gebabbel oor homself te pas, met een doelbewuste uitsondering waarvan die werklike sein regtig van buite ons dienste kom.

Die reël wat 'n pod se eerste asemteug as normaal behandel het

Die laaste een is 'n klein, skerp les oor tempoberekeninge. 'n Waarskuwing wat op die tempo van verandering van 'n metriek gebou is, kan nie 'n tempo bereken uit 'n reeks se heel eerste monster nie, want daar is niks voor dit om teenoor te vergelyk nie. So toe 'n vars pod sy eerste sarsie foute uitgestuur het, het daardie sarsie die basislyn geword eerder as 'n piek, en die reël wat dit moes gevang het, het net 'n beginpunt gesien. Ons het dit in die toetstuig reggemaak deur sulke seine in twee golwe te dryf, 'n klein een om die reeks te vestig en 'n werklike een daarna, wat ook 'n billike beskrywing is van wat produksieverkeer op sy eie doen en wat 'n sintetiese toets doelbewus moet naboots.

Elke mislukking het weggekruip in 'n naat wat jy net kan vind deur dit uit te oefen

Elkeen van hierdie was onsigbaar vir inspeksie. Die navrae het reg gelees. Die reëls was ontplooi. Die paneelborde was groen. Inname was gesond. Elke mislukking het geleef in 'n naat tussen twee dinge wat elkeen afsonderlik reg was: 'n metrieknaam en 'n aanname oor normalisering, 'n versoekliggaam en 'n weergawesprong, 'n waarskuwing en die log wat sy eie afgaan voortbring, 'n tempofunksie en 'n reeks wat pas begin het. Jy kan nie 'n naat lees nie. Jy moet dit uitoefen.

Behandel monitering dus soos wat dit is, naamlik kode, en spesifiek kode waarvan die enigste produksielopie die noodgeval is. Kode wat net in die noodgeval loop, benodig dat sy toetse elke ander dag loop, want daar is geen sagte eerste mislukking om jou te waarsku nie. Dryf 'n werklike sein van end tot end, en bevestig op die artefak heel aan die einde van die ketting, die afgelewerde kennisgewing, nie op die reël wat gesond lyk in die middel nie. Enigiets minder as dit toets dat jy 'n waarskuwing geskryf het, wat jy reeds geweet het, eerder as om te toets dat dit afgaan, wat die enigste ding is wat jy werklik wou hê.

As jy sou verkies dat jou identiteitsverskaffer homself reeds op hierdie manier dophou, Authagonal laat sy eie waarskuwingstelsel deur presies hierdie toetstuig loop, sodat op die dag wanneer iets breek, die oproep wat behoort af te gaan, werklik afgaan.