Blog ·
Offline naast een kop die online zegt
Een veilige beginwaarde klopt op zichzelf en is fout naast een feit. Een agentpagina herbouwen als kaarten maakte twee van die tegenspraken tegelijk zichtbaar.
Door Provibr
Of een agent verbonden is, is geen kolom. Het is een sleutel in Redis met een levensduur, ververst door de gateway en naar de browser geduwd over een WebSocket. De databasekolom ernaast bevat iets heel anders: of de agent ingeschreven, in afwachting of ingetrokken is, en dat is administratie en geen aanwezigheid.
Het component dat de verbindingsaanduiding tekent begint daarom pessimistisch. Zonder beginwaarde toont het "offline", en het wordt pas groen zodra de momentopname van de gateway binnen is. Dat is bewust zo en het is op zichzelf de juiste beginwaarde: "verbonden" zeggen voordat je het weet is erger dan het een tel te laat zeggen.
Dat "op zichzelf" is het belangrijke deel.
Twee beweringen over één feit
De agentdetailpagina herbouwen als een raster van kaarten bracht verschillende dingen die op losse tabbladen stonden in één beeld samen, en dat is waar een veilige beginwaarde ophoudt veilig te zijn.
De gezondheidsband bovenaan de pagina leest de aanwezigheidssleutel op de server en kleurt zichzelf groen voor een verbonden agent. De chip naast de agentnaam toont hetzelfde feit vanuit de browser, en zonder beginwaarde zei die offline. Verderop stond een paneel over de hostmachine dat met zoveel woorden zei dat er niets gemeten werd omdat de agent offline was, onder een kop die zei dat de agent online was.
Geen van die drie is op zichzelf fout. Twee ervan lezen dezelfde Redis-sleutel, één leest hem in de browser, en op het eerste moment na het laden heeft de een een antwoord terwijl de ander nog wacht. Zet ze op drie verschillende tabbladen en niemand merkt het. Zet ze in één scherm en de pagina spreekt zichzelf hardop tegen.
Hetzelfde was al een keer gebeurd op de agentlijst, waar een statistiekband online agents telde uit diezelfde sleutels en boven kaarten stond die allemaal offline zeiden tot de socket landde. Dat was de ronde waarin het component een beginwaarde leerde aannemen, en de les is toen opgeschreven: van twee beweringen over hetzelfde feit, uit dezelfde bron, in hetzelfde beeld, is er altijd één fout.
Hoe de reparatie eruitziet is saai. De aanwezigheidssleutel wordt één keer gelezen, op de server, en als beginwaarde aan de kopchip, de gezondheidsband en het hostpaneel gegeven. De live opslag wint nog steeds zodra er iets binnenkomt. De regel eronder is niet "geef beginwaarden door"; hij is dat een veilige beginwaarde een uitspraak is over een component in isolatie, en dat hij op het moment dat een tweede element in hetzelfde beeld het antwoord kent de leugen is geworden.
Wat de pagina toont, in de volgorde die iemand nodig heeft
De rest van de ronde was rangschikking, wat ander werk is maar geen minder werk. Zes rijen, in de volgorde van iemand die deze pagina opent omdat er iets aan de hand is.
- Is er iets aan de hand, met de vier feiten die dat bepalen.
- De live cijfers: processor, geheugen, vertraging, bedrijfstijd.
- Wat voor machine dit is, wat de agent kan, en waar je verder kunt.
- Het laatste uur verbruik, als grafieken met hun tabellen ernaast.
- Wat er gebeurd is, wat er gemeten is, en waar de schijfruimte in zit.
- Versie en licentie, het beheer eronder.
Oordeel, dan cijfers, dan context, dan geschiedenis, dan beheer. De rangschikking staat in een eigen bestand, en het paginabestand blijft de datalaag met alleen de vraag welke leesactie bij welk tabblad hoort. Door die scheiding raakt de volgende ronde die één kaart toevoegt precies één plek, en de ronde die één query toevoegt de andere.
De ontwerpschets vroeg om een schijftegel in de tweede rij. Die staat er niet, want het telemetriepunt dat de agent stuurt draagt processor, geheugen, bedrijfstijd en retourtijd en verder niets. De enige schijfcijfers op de pagina gaan over de artefactcache, en die staan op de kaart van de artefactcache. Een getal onder een opschrift zetten waar het niet bij hoort is hoe een dashboard langzaam begint te liegen.
Zes dingen die eraf bleven, met redenen
Er zijn meer besluiten gaan zitten in wat er niet op deze pagina staat dan in wat er wel staat, en de redenen komen allemaal uit dezelfde familie: een knop die zijn belofte niet kan waarmaken is erger dan geen knop.
Een bereikkiezer op de grafieken. De grafieken tonen het laatste uur, uit een live venster. Alles wat langer is komt uit voorgeaggregeerde rollups, en die op een overzichtspagina lezen is precies wat onze eigen regels verbieden, want een rollup is niet dezelfde meting op een andere zoomstand. Er is in plaats daarvan een route naar een pagina die het netjes doet.
Ping, herstart en reboot als knoppen. Een diagnose draaien vraagt een doel, en de regels over welk gereedschap in welke toestand geblokkeerd is staan bewust bij elkaar op één plek in plaats van per knop herhaald te worden. De snelle acties zijn dus links naar de pagina die allebei heeft.
Knoppen voor update, licentie en token. Het licentiebestand draagt een geheim, en een geheim hoort op één scherm en niet op elk scherm dat het noemt.
Een link naar de changelog van de geïnstalleerde versie. Het manifest dat de agent meldt draagt geen URL, en er een verzinnen uit het versienummer levert een link op die breekt zodra een release anders genoemd wordt.
Een link naar het volledige log. De activiteitenpagina filtert niet op agent, dus de link zou een lijst opleveren die de klant daarna met het oog moet doorzoeken. Dat is een belofte die de bestemming niet kan waarmaken.
Vriendelijke namen voor de mogelijkheden van de agent. Ze staan er als de woorden die het protocol gebruikt, volgens een eerder besluit. Een vriendelijke naam moet in negen talen onderhouden worden en houdt op te kloppen met het woord in de logs op de dag dat iemand een mogelijkheid hernoemt.
Er staat ook een gereserveerd gat. Een kaart met het automatische updateschema werd parallel gebouwd, en die is op het instellingentabblad terechtgekomen, want het is een formulier, en hetzelfde formulier op twee plekken op één pagina is precies de tweede waarheid die deze hele indeling moest wegnemen. Het gat blijft staan, met een notitie die zegt dat als de kaart hierheen verhuist, hij van instellingen áf gaat en er niet naast komt.
De melding die op een klantdomein niet mag bestaan
Eén kaart toont een aansporing wanneer de bedrijfsgegevens voor facturatie ontbreken. Drie dingen daaraan zijn nagekeken in plaats van aangenomen.
Ze gebruikt het bestaande predicaat van het dashboard voor "zijn de factuurgegevens compleet" en geen tweede dat hier geschreven is. Twee predicaten voor één vraag lopen uit elkaar, en op de dag dat ze het oneens zijn ziet de klant de aansporing op de ene pagina en niet op de andere.
Ze verschijnt alleen voor iemand die er werkelijk iets mee kan, en dat betekent de juiste rol en het juiste oppervlak.
En ze mag helemaal niet bestaan op een accountdomein, de vermerkte host waar de klanten van onze klant inloggen. Dat is gemeten met een echte sessie in plaats van beredeneerd: op het accountdomein geeft de agentpagina een 404, want dat hele oppervlak is daar per constructie afwezig, en op de paneelhost geeft hij 200. Die 404 is geen toegangscontrole die iets tegenhoudt; de pagina is er niet.
De drie pixels die een volgende ronde werden
De indeling is op drie breedtes gemeten, en op de smalste in alle negen talen. Op 390 en op 1440 liep er niets over.
Op 768 was elke paneelpagina in het product drie pixels breder dan het venster. Niet deze pagina: elke pagina. Dat is één meting, in één taal en één muntschrijfwijze; de ronde die de kopbalk uit elkaar haalde veegde negen talen in twee en vond acht tot achtendertig pixels. De oorzaak zat in de gedeelde kopbalk, en het eerlijke was dat als eigen taak op te schrijven in plaats van hem te repareren binnen een ronde over een ander scherm, want een kopbalk die op één breedte in één taal overloopt is nooit een probleem van drie pixels. Het bleek een categoriefout te zijn over welke breedte de kopbalk las, en dat staat in een balk smaller dan zijn venster.
Wat we zouden opschrijven
- Een veilige beginwaarde is een uitspraak over één component alleen. Naast een tweede element dat het antwoord kent, wordt hij de onware.
- Twee elementen die één feit tonen moeten dezelfde beginwaarde delen. Lees hem één keer op de server en geef hem door.
- Aanwezigheid is geen status. Het een is een sleutel met een levensduur, het ander is administratie; een kolom die "ingeschreven" zegt, zegt niets over nu.
- Houd rangschikking uit de datalaag. Eén bestand voor wat er gelezen wordt, één voor waar het heen gaat, en elke ronde raakt er één.
- Zet geen getal onder een opschrift waar het niet bij hoort. Vraagt de schets om een tegel die de telemetrie niet kan vullen, dan is het antwoord: geen tegel.
- Een knop waarvan de bestemming de belofte niet kan waarmaken is erger dan geen knop. Een loglink die niet kan filteren, een changeloglink zonder URL.
- Meet afwezigheid met een echte sessie. "Deze pagina bestaat op die host niet" is een bewering die een verzoek verdient in plaats van een blik in de code.
Voor de duidelijkheid over wat dit is: de pagina is gebouwd en draait, gemeten met een toegankelijkheidsronde en een browsersweep in beide hoststanden. Ze is alleen tegen een ontwikkelserver gedraaid, dus hier staat niets over layoutverschuiving op een productiebuild, en de live socket was tijdens het meten geblokkeerd, dus het aanwezigheidspad is vanaf de serverkant bewezen en niet van begin tot eind.
Uit het platformwerk aan Provibr. Het kopbalkdefect dat deze pagina blootlegde staat in een balk smaller dan zijn venster, en hoe agents zichzelf bijwerken zonder dat iemand op iets drukt staat in bijgewerkt om drie uur 's nachts.