Naar hoofdinhoud springen

Handleidingen / Monitoringhandleidingen: elk checktype, stap voor stap

Assertion Mode: volledige referentie voor responsvalidatie

Assertion mode vervangt de vaste pass/fail-velden van een monitor door een lijst regels die u zelf schrijft, waarbij elke regel precies benoemt wat waar moet zijn over de respons. De meeste uptimemonitors beoordelen een controle met een handvol vaste velden: een statuscode die als "down" telt, een lijst statussen om te negeren, misschien een trefwoord dat ergens in de body moet voorkomen. Die velden kunnen geen API uitdrukken die legitiem 404 antwoordt voor een ontbrekende resource, een pagina die 200 teruggeeft met een lege schil omdat de database een time-out kreeg, of een reeks redirects die begint te routeren via het domein van iemand anders.

De assertion mode van HostTracker vervangt die vaste velden door een kleine regeltaal die u zelf schrijft, regel voor regel, in de monitoreditor. Elke regel zegt precies wat waar moet zijn over de respons: de status, een stukje van de body, een header, hoe lang het duurde, waar een redirect eindigde. Een controle faalt alleen wanneer één van uw regels faalt. Het is dezelfde taal voor een website, een REST-API, een databasequery, een TCP-poort, een Ping-doel, een SNMP-teller of een generieke Counter-controle: één set onderwerpen, één set predicaten, overal hergebruikt waar de modus voorkomt. Deze handleiding behandelt elk onderwerp, elke operator, reducer, sugar-afkorting en syntaxisvorm die de engine implementeert.

Wat assertion mode vervangt

De klassieke velden voor responsvalidatie zijn er nog gewoon wanneer assertion mode uit staat: een verwacht statusbereik, een lijst te negeren statussen, een trefwoord dat wel (of juist niet) moet voorkomen. De modus is een schakelaar die die vaste set inruilt voor een lijst regels die u zelf opbouwt, en hem weer uitzetten voordat u opslaat, zet de klassieke velden direct terug. Geen enkele monitor zit permanent vast aan één modus.

Eén taal in plaats van een stapel type-specifieke gadgets stelt u in staat te combineren. Een controle "moet JSON zijn en een veld bevatten", een controle "moet nog steeds 'Add to cart' zeggen" en een controle "mag niet trager zijn geworden" zijn drie regels in dezelfde syntaxis, in dezelfde lijst, elk op zichzelf slagend of falend.

Hem inschakelen

Assertion mode zit binnen het onderdeel Response Validation van de monitoreditor, voor HTTP-(website)- en API-monitors. Zet de schakelaar om, en de klassieke velden worden vervangen door een genummerde regellijst met een knop "Add rule" en een live teller die toont hoeveel regels u heeft gebruikt ten opzichte van de limiet van uw abonnement.

Assertion mode ingeschakeld, met de eerste regel opgebouwd en gevalideerd

Elke regel wordt gevalideerd terwijl u hem opbouwt: een regel die nog niet klaar is, draagt een aparte status "unfinished", en een regel die de editor kan evalueren wordt als compleet gemarkeerd. Elke regel heeft ook een klein knopje </> dat de platte-tekstvorm van de bron opent, zodat u de exacte expressie kunt lezen of kopiëren in plaats van alleen de weergave per veld.

Het mentale model: onderwerp, predicaat, waarde

Elke regel heeft dezelfde vorm: een onderwerp (de statuscode, de body, een header, de responstijd), een predicaat (gelijk aan, bevat, bestaat, is kleiner dan) en, bij de meeste predicaten, een waarde om tegen te vergelijken. status eq 200 is onderwerp, predicaat en waarde; body.json exists is een onderwerp en een predicaat zonder waarde, omdat "exists" verder niets nodig heeft.

Een regel opbouwen in de editor begint met kiezen wat u controleert, dan de voorwaarde, dan de waarde:

Een tweede regel opbouwen: de veldkiezer toont elk onderwerp met zijn type en een voorbeeld

Regels in de lijst worden gecombineerd met AND: een controle faalt wanneer één enkele regel faalt en slaagt alleen wanneer elke regel slaagt. Er is nog geen OR, dus om één van meerdere statussen of strings te accepteren, drukt u dat uit binnen één regel (status in [200, 301, 302], body containsAny ["In stock", "Pre-order"]). Een regel die faalt, noemt zichzelf in de waarschuwing, geef elke regel dus waar mogelijk een korte naam en de waarschuwing zal zeggen welke verwachting brak.

Wat u kunt controleren

De kiezer groepeert onderwerpen naar het eigen document van de respons (de body, de headers) en het transport ervan (status, timing, redirects, TLS). Een paar van de belangrijkste onderwerpen, met de volledige lijst in de referentie die volgt:

OnderwerpWat het isVoorbeeld
statusDe HTTP-statuscode van het uiteindelijke antwoord, na het volgen van redirectsstatus isOk
bodyDe responsbody als platte tekstbody contains "Add to cart"
body.json / body.xml / body.html / body.yamlDe body, maar alleen wanneer die daadwerkelijk als dat formaat parset - anders is het onderwerp simpelweg niet aanwezigbody.json exists
body.json.path("$.a")Een JSONPath-query in een JSON-body (dezelfde querytaal werkt ook op YAML, omdat YAML in hetzelfde objectmodel parset)body.json.path("$.status") eq "ok"
body.size / body.hashDe grootte van de respons in bytes, en een vingerafdruk van de inhoud van de bodybody.size gt 1kb
header("Name")Eén responseheader, opgezocht op naamheader("Content-Type") isJson
time en time.connect / time.tls / time.dns / time.headTotale responstijd, en de netwerk-, TLS-handshake-, DNS- en server-denktijdfasen ervantime lt 2s
redirects / requestsDe sprongen die een controle volgde, en de volledige keten (inclusief de uiteindelijke respons)redirects.count eq 0
url en zijn onderdelen (.host, .scheme, .path...)De uiteindelijke URL waar de controle op uitkwamurl.scheme eq "https"
cert.days.leftDagen resterend voordat het TLS-certificaat verlooptcert.days.left gt 14

Getallen accepteren eenheid-achtervoegsels zodat u nooit handmatig hoeft om te rekenen: 2s betekent 2000 milliseconden, 1kb betekent 1024 bytes. Tekstvergelijkingen zijn hoofdlettergevoelig tenzij u nocase aan de regel toevoegt.

De volledige referentie

Hieronder volgt elk onderwerp, elke operator, reducer, sugar-afkorting, filter en syntaxisvorm die de assertion-engine registreert voor HTTP- en API-controles, rechtstreeks uit het eigen register van de engine (dezelfde data die de kiezers en documentatie van de regeleditor voedt). Vermeldingen die nog niet algemeen beschikbaar zijn, dragen een notitie tussen haakjes: gereserveerde velden die de engine nog niet is begonnen te vullen, kandidaten die nog naar agents worden uitgerold, en de stateful-familie die een specifiek abonnement vereist. Alles zonder zo'n notitie is vandaag al live op elk abonnement met assertion mode.

De referentie volgt de eigen groepering van de engine: eerst responsevelden, dan de manieren om in een body te grijpen, dan timing, netwerk en TLS, dan de operatoren, reducers en afkortingen die op al deze werken, en tot slot de controletypen naast HTTP die dezelfde taal spreken.

Respons

De onderwerpen die de respons zelf beschrijven: zijn status, zijn ruwe body, zijn headers, de URL waarop hij daadwerkelijk antwoordde, en de keten verzoeken die daartoe leidde.

NaamWat het isType/waardenVoorbeeld
bodyDe responsbody als gedecodeerde tekst.stringbody contains "Welcome"
headerEén responseheader van de uiteindelijke respons, op naam.stringheader("Content-Type") isJson
redirectsDe gevolgde redirectsprongen - de verzoekketen zonder het laatste element.collectionredirects.count eq 0
statusDe HTTP-statuscode van het uiteindelijke antwoord, na het volgen van redirects.numberstatus isOk
body.sizeDe grootte van de gedownloade body, in bytes.numberbody.size lt 500000
urlDe URL die daadwerkelijk antwoordde, na alle redirects. Een url: vergelijk het als tekst, of lees de onderdelen (url.host, .port, .path, .query, .scheme).urlurl.host eq "www.example.com"
requestsElk verzoek dat deze controle deed, op volgorde - de redirectsprongen en dan het uiteindelijke verzoek.collectionrequests.count le 2
url.hostHet host-onderdeel van de URL.stringurl.host eq "example.com"
url.pathHet pad-onderdeel van de URL.stringurl.path startsWith "/api"
url.portHet poort-onderdeel van de URL.numberurl.port eq 443
url.queryDe querystring van de URL.stringurl.query contains "token"
url.schemeHet schema van de URL (http of https).stringurl.scheme eq "https"
body.hashEen digest van de responsbody - vergelijk met previous.body.hash om inhoudswijzigingen te detecteren.stringbody.hash eq previous.body.hash
httpVersion (gereserveerd - nog niet gevuld)De onderhandelde HTTP-versie.stringhttpVersion eq "HTTP/2"
setCookieDe Set-Cookie-waarden van de uiteindelijke respons, één item per cookie - match er één met contains of matches, tel ze met .count.collectionsetCookie exists
steps (nog niet beschikbaar)De stappen van een meerstapscontrole. Nog niet beschikbaar.collectionsteps.count le 1
url.originalDe URL waarmee de controle was geconfigureerd, vóór enige redirect. Een url zoals url zelf: heeft dezelfde onderdelen (url.original.host, .port, .path, .query, .scheme).urlurl.original.scheme eq "http"
url.original.hostHet host-onderdeel van de URL.stringurl.original.host eq "example.com"
url.original.pathHet pad-onderdeel van de URL.stringurl.original.path startsWith "/start"
url.original.portHet poort-onderdeel van de URL.numberurl.original.port eq 80
url.original.queryDe querystring van de URL.stringurl.original.query contains "utm_"
url.original.schemeHet schema van de URL (http of https).stringurl.original.scheme eq "http"

Twee aliassen: redirectCount is een afkorting voor redirects.count - redirectCount eq 0 leest iets natuurlijker dan de gelijkwaardige lange vorm wanneer u bedoelt "de controle antwoordde direct, geen redirects." En setCookie op het hoogste niveau is de cookielijst van de uiteindelijke respons; dezelfde naam komt terug per sprong binnen requests/redirects (zie Sprong-onderwerpen hieronder), met alleen de cookies van dat ene verzoek.

Waarden uit de body halen

Deze onderwerpen worden alleen opgelost wanneer de body het formaat heeft dat ze benoemen: een JSON-namespace op een HTML-pagina is simpelweg niet aanwezig, geen getypeerde fout. Dat maakt exists de standaardmanier om het formaat te testen, en body.json exists vraagt of de body als JSON parste. De vier formaat-namespaces dragen elk een bijpassende .path(...)-queryfunctie (JSONPath voor json/yaml, XPath voor xml, CSS-selectors voor html) en een bijpassende .regex(...), plus een formaatonafhankelijke body.regex(...) die de ruwe tekst leest ongeacht het formaat. body.html.a, body.html.script en body.html.link zijn kant-en-klare collecties van elke link, elk script en elk <link>-element op de pagina; zie Elementbereiken hieronder voor de velden die per item beschikbaar zijn.

NaamWat het isType/waardenVoorbeeld
body.jsonDe responsbody, maar alleen wanneer die echt JSON is.stringbody.json exists
body.json.pathBevraag de JSON-body met een JSONPath-expressie.jsonbody.json.path("$.status") eq "ok"
body.htmlDe responsbody, maar alleen wanneer die echt HTML is.stringbody.html exists
body.html.pathSelecteer pagina-elementen met een CSS-selector.collectionbody.html.path("h1").first contains "Welcome"
body.regexMatch de tekst met een reguliere expressie en neem wat die vastlegde.stringbody.regex("order-(?<id>\\d+)") exists
body.xmlDe responsbody, maar alleen wanneer die echt XML is.stringbody.xml exists
body.xml.pathBevraag de XML-body met een XPath-expressie.stringbody.xml.path("//item/@id") exists
body.html.aElke link op de pagina.collectionbody.html.a.count gt 0
body.html.linkElk <link> dat de pagina declareert. Een kale vermelding betekent de linkdoelen.collectionbody.html.link.count gt 0
body.html.scriptElk script dat de pagina laadt. Een kale vermelding betekent de scriptbronnen.collectionbody.html.script.count gt 0
body.yamlDe responsbody, maar alleen wanneer die echt YAML is.stringbody.yaml exists
body.yaml.pathBevraag de YAML-body met een JSONPath-expressie.jsonbody.yaml.path("$.services.web.image") contains ":1."
body.html.regexMatch de tekst met een reguliere expressie en neem wat die vastlegde.stringbody.regex("order-(?<id>\\d+)") exists
body.json.regexMatch de tekst met een reguliere expressie en neem wat die vastlegde.stringbody.regex("order-(?<id>\\d+)") exists
body.xml.regexMatch de tekst met een reguliere expressie en neem wat die vastlegde.stringbody.regex("order-(?<id>\\d+)") exists
body.yaml.regexMatch de tekst met een reguliere expressie en neem wat die vastlegde.stringbody.regex("order-(?<id>\\d+)") exists

Een regex-detail dat het vermelden waard is: benoemde capture-groepen ((?<id>...)) binnen een .regex(...)-regel schrijven naar een check-scoped bindingnamespace die een latere regel kan teruglezen met bind("id") of bind[0] op positie - zie Vastgelegde waarden hieronder.

Vastgelegde waarden

Eén onderwerp leeft in zijn eigen registergroep omdat het niet rechtstreeks de respons leest - het leest wat een eerdere regel eruit vastlegde.

NaamWat het isType/waardenVoorbeeld
bindEen waarde vastgelegd door een eerdere regex-regel, op naam of op positie.stringbind("id") gt 1000

Combineer het met een eerdere regex-regel in de lijst: een regel zoals body.regex("order-(?<id>\d+)") exists legt het order-id vast onder de naam id, en een latere regel kan het testen met bind("id") gt 1000 of, voor een positionele (naamloze) capture, bind[0].

Timing

Eén totaal plus een uitsplitsing per fase, zodat een "is trager geworden"-waarschuwing ook kan zeggen welk deel trager werd.

NaamWat het isType/waardenVoorbeeld
timeTotale responstijd: connect + TLS + wachten + download. DNS-resolutie is niet inbegrepen.numbertime lt 2000
ttfb (gereserveerd - nog niet gevuld)Time to first byte.numberttfb lt 200
time.connectTijd om de TCP-verbinding tot stand te brengen.numbertime.connect lt 500
time.dataTijd om de responsbody te downloaden.numbertime.data lt 1000
time.dnsTijd om de domeinnaam op te lossen. Niet inbegrepen in het kale onderwerp time.numbertime.dns lt 200
time.headWachttijd voor de responseheaders.numbertime.head lt 500
time.tlsTijd voor de TLS-handshake.numbertime.tls lt 300

Het kale onderwerp time is connect + TLS + wachten-op-headers + downloaden van de body. DNS-resolutie is uitgesloten en leeft alleen in het naastgelegen time.dns, omdat DNS vaak gecachet wordt en anders hetzelfde endpoint wisselend snel of traag zou doen lijken tussen controles.

Netwerk: DNS en verbinding

dns en conn zijn pure namespaces in het register - een groep zonder eigen waarde, dus een regel kan nooit stoppen op de kale naam (zowel de editor als de engine weigeren een keten die eindigt op alleen dns of conn, en wijzen u naar de echte velden hieronder).

NaamWat het isType/waardenVoorbeeld
connDe netwerkverbinding die de controle maakte - het adres dat de respons leverde en eventuele verbindingsfouten.string-
conn.failedHoeveel van de opgeloste adressen niet konden verbinden.numberconn.failed eq 0
conn.failedIps (kandidaat - wordt uitgerold naar agents)De opgeloste adressen die niet konden verbinden.collectionconn.failedIps.count eq 0
conn.ipHet IP-adres dat de respons daadwerkelijk leverde.stringconn.ip eq "203.0.113.10"
conn.ip.family (kandidaat - wordt uitgerold naar agents)Of de respons via IPv4 of IPv6 werd geleverd.stringconn.ip.family eq "IPv4"
dnsDNS-resolutie van de bewaakte naam - welke adressen die opleverde en welke server antwoordde.string-
dns.ipsAlle IP-adressen waarnaar de domeinnaam tijdens deze controle werd opgelost.collectiondns.ips contains "1.2.3.4"
dns.serverDe DNS-server die de resolutie beantwoordde.stringdns.server eq "8.8.8.8"

TLS en certificaat

Net als dns en conn zijn tls en cert pure namespaces - de certificaat-/handshakefeiten leven één niveau lager.

NaamWat het isType/waardenVoorbeeld
cert.days.leftDagen resterend voordat het sitecertificaat verloopt.numbercert.days.left gt 14
certHet certificaat dat de server presenteerde - dagen tot verloop, uitgever en identiteitsvelden.string-
cert.daysDagen sinds het certificaat werd uitgegeven.numbercert.days gt 0
cert.issuerDe certificeringsautoriteit die het sitecertificaat uitgaf.stringcert.issuer contains "Let's Encrypt"
cert.sanDe domeinnamen waarvoor het certificaat geldig is.collectioncert.san contains "www.example.com"
cert.serialHet serienummer van het certificaat.stringcert.serial exists
cert.subject (gereserveerd - nog niet gevuld)Het subject van het certificaat. Nog niet vastgelegd - komt met een toekomstige agentversie.stringcert.subject contains "example.com"
tlsDe TLS-handshake van de beveiligde verbinding - onderhandelde protocolversie en cipher.string-
tls.cipherDe onderhandelde ciphersuite.stringtls.cipher contains "AES"
tls.protocolDe onderhandelde TLS-versie.stringtls.protocol eq "Tls13"

cert.subject staat hier vermeld voor de volledigheid, maar is nog niet gevuld - zie het onderdeel Eerlijkheid hieronder voor wat "gereserveerd" in de praktijk betekent. De dagelijkse certificaatregel is cert.days.left gt 14, behandeld in het onderdeel met uitgewerkte regels.

Sprong-onderwerpen: velden binnen requests en redirects

requests en redirects zijn collecties, en elk item is een volledig verzoek-/responsrecord met een eigen, beperkte veldenset. Niet elk onderwerp op het hoogste niveau is per sprong zinvol (een sprong heeft geen eigen certificaat), en één veld bestaat alleen per sprong: hstsHeader, de Strict-Transport-Security-header van dat verzoek in de keten.

NaamWat het isType/waardenVoorbeeld
statusDe statuscode van dit verzoek in de keten.numberstatus eq 200
urlDe URL waarnaar dit verzoek ging.urlurl startsWith "https://"
headerEen responseheader van dit verzoek. Een sprong houdt een beperkt, enkelwaardig header-record aan - lijstpredicaten (containsAny, containsAll, unique) gelden alleen op de header van de uiteindelijke respons.stringheader("Content-Type") contains "json"
hstsHeaderDe Strict-Transport-Security-header van dit verzoek.stringrequests[0].hstsHeader exists
setCookieDe Set-Cookie-headerwaarden van dit verzoek.collectionsetCookie exists
url.originalDe URL waarmee de controle was geconfigureerd, vóór enige redirect. Een url zoals url zelf: heeft dezelfde onderdelen (url.original.host, .port, .path, .query, .scheme).urlurl.original.scheme eq "http"
url.hostHet host-onderdeel van de URL.stringurl.host eq "example.com"
url.portHet poort-onderdeel van de URL.numberurl.port eq 443
url.pathHet pad-onderdeel van de URL.stringurl.path startsWith "/api"
url.queryDe querystring van de URL.stringurl.query contains "token"
url.schemeHet schema van de URL (http of https).stringurl.scheme eq "https"
url.original.hostHet host-onderdeel van de URL.stringurl.original.host eq "example.com"
url.original.portHet poort-onderdeel van de URL.numberurl.original.port eq 80
url.original.pathHet pad-onderdeel van de URL.stringurl.original.path startsWith "/start"
url.original.queryDe querystring van de URL.stringurl.original.query contains "utm_"
url.original.schemeHet schema van de URL (http of https).stringurl.original.scheme eq "http"

De header(...) per sprong houdt een beperkt, enkelwaardig record aan: lijstachtige predicaten zoals containsAny of unique zijn alleen zinvol op de volledige headermap van de uiteindelijke respons, dus die gelden daar en niet per sprong. De twee collecties betekenen iets anders. requests is de hele keten inclusief de uiteindelijke respons die antwoordde, dus is nooit leeg, zelfs niet bij een directe 200, terwijl redirects alleen de gevolgde sprongen onderweg zijn, leeg wanneer er niets werd doorgestuurd.

Elementbereiken: velden binnen één collectie-item

Een elementbereik is de veldenset beschikbaar op ÉÉN item van een collectie - na erin te indexeren (requests[0]) of terwijl u filtert met where(current. ...) (zie het volgende onderdeel). Zes collecties dragen een eigen elementbereik: de vier HTML-elementcollecties delen één vorm, en requests/redirects delen de vorm van de sprong-onderwerpen hierboven.

ElementbereikHoe één item eruitziet
body.html.pathEén element gematcht door een body.html.path("selector")-CSS-query.
body.html.aEén <a>-linkelement uit body.html.a.
body.html.scriptEén <script>-element uit body.html.script.
body.html.linkEén <link>-element uit body.html.link.
requestsEén verzoek in de volledige keten (zie de tabel met sprong-onderwerpen hierboven).
redirectsEén gevolgde redirectsprong (dezelfde velden als requests, zie hierboven).

De gedeelde vorm voor body.html.path(...), body.html.a, body.html.script en body.html.link - één rij per link, scripttag of <link>-element:

NaamWat het isType/waardenVoorbeeld
urlHet linkdoel precies zoals de markup het schrijft.stringbody.html.a.url contains "/checkout"
textDe zichtbare tekst van het element.stringbody.html.a.text contains "Sign in"
absoluteHet linkdoel opgelost tegen de pagina-URL tot een absoluut adres - een lijst urls, met de url-onderdelen per element beschikbaar (.host, .path, .port, .query, .scheme).urlbody.html.a.absolute.scheme in ["https"]
relHet rel-attribuut van het element.stringbody.html.a.where(current.rel eq "nofollow").count eq 0
absolute.hostHet host-onderdeel van de URL.stringbody.html.a.absolute.host.unique.count le 3
absolute.portHet poort-onderdeel van de URL.numberbody.html.a.absolute.port in [443]
absolute.pathHet pad-onderdeel van de URL.stringbody.html.a.absolute.path startsWith "/"
absolute.queryDe querystring van de URL.stringbody.html.a.absolute.query not contains "session"
absolute.schemeHet schema van de URL (http of https).stringbody.html.a.absolute.scheme in ["https"]

Twee standaardinstellingen gelden voordat u een regel tegen deze collecties schrijft. Een kale vermelding van body.html.a (of .script/.link) betekent de projectie .url ervan, dus body.html.a.count gt 0 telt hrefs, en een opgeslagen regel leest terug met .url voluit geschreven, omdat een opgeslagen regel altijd precies zegt wat hij evalueert. En .url is het ruwe attribuut href precies zoals de markup het schreef, dus een relatieve link blijft relatief; .absolute is dezelfde link opgelost tegen de eigen URL van de pagina, wat u wilt wanneer u het schema of de host van uitgaande links controleert (body.html.a.absolute.scheme in ["https"]).

Operatoren

De predicaathelft van elke regel: welke test op het onderwerp wordt uitgevoerd. Alle 15 zijn gedeeld over elk controletype, en welke bij een gegeven onderwerp passen, hangt af van het type ervan (een statuscode neemt lt/gt, een body neemt contains, een collectie neemt exists/unique/in).

NaamWat het isGeldt voorVoorbeeld
eqGelijk aan. Tegen een json("…")/xml("…")/yaml("…")-literal is dit een EXACTE structurele match: dezelfde sleutels (in willekeurige volgorde), arrays op volgorde, dezelfde waarden.elk typebody.json eq json("{\"ok\": true}")
ltKleiner dan.getallentime lt 2000
leKleiner dan of gelijk aan.getallencert.days.left le 30
gtGroter dan.getallenbody.size gt 0
geGroter dan of gelijk aan.getallenstatus ge 500
containsBevat de tekst - bij een lijst slaagt dit wanneer de waarde één van de items IS (exacte match; gebruik matches om binnen items te zoeken). Tegen een json("…")/xml("…")/yaml("…")-literal is dit STRUCTURELE bevatting: alles wat de literal stelt, moet aanwezig zijn en overeenkomen; de respons mag meer bevatten.tekst of lijstbody.json contains json("{\"status\": \"ok\"}")
startsWithBegint met de tekst - bij een lijst, wanneer ENIG item dat doet.teksturl.path startsWith "/api"
endsWithEindigt met de tekst - bij een lijst, wanneer ENIG item dat doet.teksturl.path endsWith ".json"
matchesKomt overeen met de reguliere expressie ergens in de tekst - bij een lijst, wanneer ENIG item dat doet.tekstbody matches "order-\\d+"
containsAnyBevat minstens één van de opgesomde waarden (bij een lijst: een item IS GELIJK aan één ervan).lijstbody containsAny ["In stock", "Pre-order"]
containsAllBevat elk van de opgesomde waarden (bij een lijst: elke waarde is gelijk aan een item - de bewijzende items mogen verschillen).lijstbody.html.a.text containsAll ["Home", "Contact"]
inIs één van de opgesomde waarden of bereiken - bij een lijst, elk item is dat.waarde(n) of bereikstatus in [200, 301, 302]
existsHet onderwerp is aanwezig.elk onderwerpheader("ETag") exists
isNumberDe waarde leest als een getal.tekst of allesbind("id") isNumber
uniqueDe lijst bevat geen duplicaten.lijstdns.ips unique

Twee operatoren betekenen iets nauwer dan ze klinken. contains bij een lijst is exact lidmaatschap: de waarde moet gelijk zijn aan één heel item, niet als substring binnen één item voorkomen, grijp dus naar matches wanneer u substringgedrag over de elementen van een collectie wilt. En eq tegen een json(...)/xml(...)/yaml(...)-literal is een volledige structurele match (dezelfde sleutels, arrays in dezelfde volgorde, dezelfde waarden), terwijl contains tegen hetzelfde soort literal structurele bevatting is: alles wat de literal stelt, moet aanwezig zijn, maar de echte respons mag meer bevatten.

Reducers

Een reducer versmelt een collectie tot één waarde en kan alleen aan het einde van een keten staan. De voorbeelden hieronder gebruiken requests.status, de van nature numerieke collectie die HTTP-onderwerpen vormen, als illustratie; dezelfde acht reducers werken op elke numerieke collectie bij elk controletype (de retourtijden van een Ping-controle, een gefilterde set databaserijen).

NaamWat het versmeltGeldt voorVoorbeeld
countHoeveel items de lijst heeft.elke collectierequests.count le 2
minHet kleinste getal in de lijst.numerieke collectierequests.status.min ge 200
maxHet grootste getal in de lijst.numerieke collectierequests.status.max lt 500
sumDe som van de getallen in de lijst.numerieke collectierequests.status.sum gt 0
avgHet gemiddelde van de getallen in de lijst.numerieke collectierequests.status.avg lt 300
firstHet eerste item van de lijst.elke collectieredirects.status.first eq 301
lastHet laatste item van de lijst.elke collectierequests.status.last eq status
uniqueDe lijst met duplicaten verwijderd.elke collectiedns.ips.unique.count le 3

unique is overladen, en de spelling maakt het onderscheid tussen de twee betekenissen. Geschreven als operator zonder punt (x unique) is het een predicaat, "deze collectie heeft geen duplicaten", en het faalt door de herhaling te benoemen. Geschreven als reducer met een punt (x.unique) is het een transformatie, de gededupliceerde collectie zelf, die nog steeds iets erna nodig heeft (x.unique.count eq 1). Een loshangende x.unique zonder iets erna is een syntaxisfout, omdat de engine niet kan raden welke van de twee u bedoelde.

Sugar

Sugar-predicaten zijn afkortingen die de engine uitbreidt naar gewone kernpredicaten voordat de regel ooit naar een agent wordt gestuurd - een sugar-predicaat kost niets extra om toe te voegen (geen agentbundel, geen versievloer) omdat het tegen de tijd dat het op de lijn komt er al uitziet als een gewone regel. Geef de voorkeur aan sugar wanneer het bestaat: het leest beter, en het is exact gelijkwaardig aan de lange vorm met de hand uitschrijven.

NaamWat het betekentGeldt voorVoorbeeld
isOkDe status is een succescode (200-299).status-
isRedirectDe status is een redirectcode (300-399).statusstatus isRedirect
isClientErrorDe status is een clientfout (400-499).statusstatus isClientError
isServerErrorDe status is een serverfout (500-599).statusstatus isServerError
isJsonDe inhoud is echt JSON.document of media-type tekstheader("Content-Type") isJson
isXmlDe inhoud is echt XML - de body parset als XML, of een header noemt een XML-mediatype.document of media-type tekstbody isXml
isHtmlDe inhoud is echt HTML - de body parset als HTML, of een header noemt een HTML-mediatype.document of media-type tekstbody isHtml
isFormEen mediatype noemt een formuliercodering: application/x-www-form-urlencoded of multipart/form-data. In tegenstelling tot isJson/isXml/isHtml bestaat er geen bijpassende body-namespace, dit geldt dus alleen voor een media-type-waarde zoals een Content-Type-header.alleen media-type tekstheader("Content-Type") isForm
isEmptyNiets aanwezig: een lege tekst, een grootte nul of een lege lijst.tekst, grootte of lijstbody isEmpty
isNullDe waarde is null.elke waardebody.json.path("$.deletedAt") isNull
absentHet onderwerp is helemaal niet aanwezig.elk onderwerpheader("X-Debug") absent
betweenEen getal binnen een inclusief bereik.getallen (2 operanden)body.size between 50 and 500kb

isJson/isXml/isHtml zijn opzettelijk contextgevoelig, en waarop u ze schrijft, bepaalt welke betekenis geldt. Geschreven op het document zelf (body isJson) betekenen ze "parst dit als dat formaat", hetzelfde als body.json exists. Geschreven op een tekstwaarde die een mediatype noemt, zoals een header (header("Content-Type") isJson), betekenen ze "noemt dit die MIME-familie van dat formaat"; zie MIME-families hieronder voor welke mediatypen kwalificeren. isForm heeft alleen de tweede betekenis, omdat er geen body.form-namespace bestaat om naar te parsen, dus body isForm is een statische fout in plaats van een regel die nooit waar zou kunnen zijn.

Het filter where(...)

Behoud alleen de elementen die overeenkomen, en ga daar verder. Het is het enige filterconstruct in de taal, en het heeft precies één vorm: where(current.<veld> <voorwaarde> <waarde>).

Filteren verschilt van projecteren: requests.url contains "cart" vraagt of zo'n sprong ergens in de keten bestaat, terwijl requests.where(current.url contains "cart").status vraagt wat die sprong teruggaf. Filteren versmelt de lijst niet, sluit dus af met .first, een in [...]-check, of .count. Het gaat maar één niveau diep, en neemt precies één voorwaarde.

OnderdeelWat het benoemtOpmerkingen
current.<veld>Een veld van elk element dat gefilterd wordt, geschreven na current.Dit is de helft die mensen fout doen: current.url is de URL van de individuele sprong, niet die van de uiteindelijke respons. Alleen de eigen velden van het element kunnen na current. volgen.
de voorwaardeElk gewoon predicaat, inclusief not en nocaseElke voorwaarde die op het hoogste niveau van een regel werkt, werkt ook hier.
de waardeWaartegen het veld van elk element wordt vergelekenMeestal een gewone waarde. Een hier geschreven onderwerp wordt gelezen uit de BUITENSTE respons, niet uit het element - where(current.url eq url.original) vergelijkt elke sprong met de URL waarmee de controle was geconfigureerd, en daarom moet de elementkant current. hardop zeggen.

Voorbeeld: requests.where(current.url contains "cart").status.first eq 301 - behoud alleen de sprongen waarvan de URL "cart" bevat, en bekijk dan de status van de eerste die matchte.

Nog twee beperkingen, beide afgedwongen door de parser met een eigen foutmelding: where kan niet genest worden binnen een andere where, en het argument is precies één voorwaarde, zonder and/or erbinnen. Het geldt alleen voor een collectie waarvan de elementen benoemde velden dragen (requests, body.html.a), niet voor een gewone geprojecteerde lijst zoals dns.ips, waar er niets is dat current. kan benoemen.

Syntaxisreferentie

Al het overige dat de grammatica definieert: hoe u een regel benoemt, hoe u bereiken en lijsten schrijft, wat een kaal onderwerp betekent, en de kleine interpunctievormen die in veel regels terugkomen.

VormWat het doetSoortVoorbeeld
whereBehoud alleen de elementen die overeenkomen, en ga daar verder.collectiefilterrequests.where(current.url contains "cart").status.first eq 301
notKeert de voorwaarde die erop volgt om.flagbody not contains "error"
nocaseVergelijk tekst zonder rekening te houden met hoofd- en kleine letters.flagbody contains "welcome" nocase
currentBinnen where(…), benoemt het ene element dat gefilterd wordt.elementverwijzing (binnen where)requests.where(current.status eq 301)
rangeEen bereik van getallen, beide uiteinden INBEGREPEN.getallenbereikstatus in [200..299]
listEen lijst waarden om tegen te vergelijken.waardelijststatus in [200, 301, 302]
docLiteralEen getypeerde documentwaarde voor structurele vergelijking: de tekst tussen aanhalingstekens wordt geparst als JSON, XML of YAML wanneer de regel wordt opgeslagen.json/xml/yaml-tekstbody.json contains json("{\"user\": {\"active\": true}}")
implicitExistsEen regel die alleen een onderwerp benoemt, controleert of het aanwezig is: alleen body.json schrijven slaat op als body.json exists.kale onderwerpregelbody.json
indexKiest ÉÉN item van een lijst op positie, tellend vanaf 0.0-gebaseerd geheel getalrequests[0].status
labelEen optionele naam voor de regel, geschreven voor een dubbele punt.naam voor een dubbele punt"json ok": body.json exists
commentAlles na # is een notitie voor uzelf; het heeft geen invloed op de controle.volgtekst na #status isOk # the happy path

Een paar verdienen een woordje uitleg. label geeft een regel een naam die in de waarschuwing verschijnt in plaats van de weergegeven expressie; schrijf hem voor een dubbele punt, zoals in "json ok": body.json exists. implicitExists betekent dat een regel die alleen een onderwerp noemt en geen predicaat, een afkorting is voor exists: body.json schrijven slaat op als body.json exists, en de regel opnieuw openen toont de voluit geschreven vorm. range en list zijn de twee vormen die een waarde kan aannemen na in: een bereik ([200..299], beide uiteinden inbegrepen) of een expliciete lijst ([200, 301, 302]), en een waarde kan aan één kant open zijn ([400..]). docLiteral is de wrapper json(...)/xml(...)/yaml(...) gebruikt voor structurele vergelijking tegen de body (behandeld onder Operatoren hierboven en in de uitgewerkte regels hieronder). index kiest één item uit een collectie op positie, 0-gebaseerd, op dezelfde manier waarop bind[0] een positionele capture leest. current heeft alleen betekenis binnen een where(...)-filter, behandeld in het eigen onderdeel hierboven.

Wrappers: previous, delta en delta2

Drie vormen die achteruitkijken in plaats van alleen naar de huidige respons - elk is afgeschermd tot abonnementen met stateful assertions, en elk wordt volledig uitgelegd in "Vergelijken met de vorige controle" hieronder.

NaamWat het isType/waardenVoorbeeld
delta (vereist een abonnement met stateful assertions)Hoeveel een numerieke waarde veranderde sinds de vorige controle - optioneel als een snelheid per ms/s/m/h.numberdelta(body.size, h) lt 1mb
delta2 (vereist een abonnement met stateful assertions)De verandering van de verandering - versnelt een waarde?numberdelta2(time) gt 0
previous (vereist een abonnement met stateful assertions)De waarde die dit onderwerp had bij de vorige controle.allesstatus eq previous.status

Flags: not en nocase

Twee modifiers die zich aan een regel hechten in plaats van zelf als onderwerp of predicaat te staan.

FlagWat het doetSoortVoorbeeld
notKeert de voorwaarde die erop volgt om.flag (hecht zich aan een regel)body not contains "error"
nocaseVergelijk tekst zonder rekening te houden met hoofd- en kleine letters.flag (hecht zich aan een regel)body contains "welcome" nocase

not combineert met het predicaat dat erop volgt in plaats van de hele regel als geheel te ontkennen - x not != y leest als x eq y, niet als een dubbele ontkenning. Wanneer een onderwerp volledig afwezig kan zijn, geef dan de voorkeur aan de sugar absent boven not exists: beide betekenen precies hetzelfde, maar absent zegt het direct. nocase verandert alleen iets bij een echt tekstuele vergelijking; de editor (en deze referentie) laten u het overal schrijven, maar het is stilzwijgend betekenisloos bij een numerieke test zoals status eq 200 nocase.

MIME-families

De opzoektabellen achter isJson, isXml, isHtml en isForm wanneer die worden toegepast op een media-type-waarde zoals een header. Elke familie matcht het voor de hand liggende mediatype op het hoogste niveau plus, voor JSON en XML, elk type dat eindigt op het bijbehorende structured-syntax-achtervoegsel - wat maakt dat header("Content-Type") isJson correct slaagt op application/problem+json of application/vnd.api+json en niet alleen op het gewone application/json.

FamilieMatchtBijbehorende sugarVoorbeeld
jsonapplication/json, text/json, of elk mediatype eindigend op +json (application/problem+json, application/vnd.api+json, application/ld+json, ...).sugar: isJsonheader("Content-Type") isJson
xmlapplication/xml, text/xml, of elk mediatype eindigend op +xml (image/svg+xml, application/atom+xml, ...).sugar: isXmlheader("Content-Type") isXml
htmltext/html of application/xhtml+xml.sugar: isHtmlheader("Content-Type") isHtml
formapplication/x-www-form-urlencoded of multipart/form-data.sugar: isFormheader("Content-Type") isForm

Matching negeert alles vanaf de eerste ; (dus application/json; charset=utf-8 matcht nog steeds) en is niet hoofdlettergevoelig.

Onderwerpen voor database-, counter-, SNMP-, port- en ping-controles

Elke operator, reducer, sugar-afkorting en syntaxisvorm hierboven is identiek voor deze vijf controletypen: de engine registreert dezelfde 15 operatoren, 8 reducers, 12 sugar-predicaten en 11 syntaxisvormen voor alle zes typen zonder uitzondering. Wat per type verschilt, is de onderwerpenlijst. Elk type geeft een kleine set onderwerpen bloot, uniek voor wat het meet, plus een subset van de netwerk-/timing-/TLS-onderwerpen die hierboven al zijn gedocumenteerd, waarbij de betekenis zich aanpast aan het type (de time van een Database-controle is connect-plus-query in plaats van connect-plus-TLS-plus-download, omdat er geen HTTP-respons is om te downloaden).

Databasecontroles

Deelt time, time.connect en time.dns met de hierboven gedocumenteerde onderwerpen (opnieuw geschaald naar een databaseverbinding: connect-plus-query, DNS-resolutie van de databasehost). Uniek voor databasecontroles:

NaamWat het isType/waardenVoorbeeld
scalarDe ene waarde die de query teruggaf (Scalar-modus).alles-
rowsDe rijen die de query beïnvloedde of teruggaf (NonQuery-modus).collection-
time.queryTijd die de query zelf kostte.number-

Een uitgewerkt voorbeeld staat in het volgende onderdeel: gebruik rows.count om te controleren hoeveel rijen een query beïnvloedde of teruggaf, en scalar om een enkele teruggegeven waarde direct te controleren.

Counter-controles

Deelt time met de hierboven gedocumenteerde onderwerpen - als een candidate-status veld specifiek voor Counter-controles (retourtijd van het counter-verzoek; zie het onderdeel Eerlijkheid voor wat "kandidaat" betekent). Uniek voor counter-controles:

NaamWat het isType/waardenVoorbeeld
valueDe gemeten tellerwaarde.number-

SNMP-controles

Deelt time en time.dns met de hierboven gedocumenteerde onderwerpen (hostnaamresolutie plus het SNMP-verzoek zelf). Uniek voor SNMP-controles:

NaamWat het isType/waardenVoorbeeld
time.requestTijd die het SNMP-verzoek kostte.number-
valueDe waarde die de OID teruggaf.alles-
value.type (kandidaat - wordt uitgerold naar agents)De naam van het SNMP-gegevenstype van de teruggegeven waarde.string-

value.type heeft candidate-status; zie het onderdeel Eerlijkheid. Opmerking over beschikbaarheid: de Response Validation-schakelaar voor assertion mode heeft de SNMP-monitoreditor nog niet bereikt. Die toont een paneel "Coming soon" dat deze twee onderwerpen noemt in plaats van een werkende regellijst. De onderwerpen en de evaluator eronder zijn al geregistreerd; alleen de SNMP-editor-UI staat nog uit.

Port-controles

De grootste gedeelde lijst van elk niet-HTTP-type. Een TCP-portcontrole draagt in essentie dezelfde verbindings-, DNS-, TLS- en certificaatonderwerpen als een HTTP-controle, omdat een portcontrole ook TLS kan onderhandelen: bind, cert en de zes subvelden ervan, conn en de vier subvelden ervan, dns en de twee subvelden ervan, time/time.connect/time.dns/time.tls, en tls/tls.cipher/tls.protocol - allemaal gedocumenteerd in de bovenstaande onderdelen, met dezelfde betekenissen. Uniek voor port-controles:

NaamWat het isType/waardenVoorbeeld
bannerDe data gelezen van de socket na connect.string-
banner.hash (kandidaat - wordt uitgerold naar agents)Een digest van de banner - vergelijk met previous.banner.hash om dienstwijzigingen te detecteren.string-
banner.regexMatch de tekst met een reguliere expressie en neem wat die vastlegde.stringbody.regex("order-(?<id>\\d+)") exists
banner.size (kandidaat - wordt uitgerold naar agents)De grootte van de banner, in bytes.number-

banner.hash en banner.size hebben candidate-status - zie het onderdeel Eerlijkheid. banner.regex is vandaag live en werkt precies zoals body.regex(...) op een HTTP-controle: benoemde captures voeden dezelfde bind(...)-namespace.

Ping-controles

Deelt de verbindings- en DNS-onderwerpen met de bovenstaande onderdelen: conn, conn.failed, conn.failedIps, conn.ip, conn.ip.family, dns, dns.ips, dns.server, time (hier de gemiddelde retourtijd van de geslaagde antwoorden) en time.dns. Uniek voor ping-controles:

NaamWat het isType/waardenVoorbeeld
lossHet percentage echoverzoeken dat geen antwoord kreeg.numberloss eq 0
replyDe geslaagde echo-antwoorden.collection-
sentCount (kandidaat - wordt uitgerold naar agents)Hoeveel echoverzoeken werden verstuurd.number-
time.maxDe retourtijd van het traagste antwoord.number-
time.minDe retourtijd van het snelste antwoord.number-
ttlDe TTL van het eerste geslaagde antwoord - vergelijk met previous.ttl om routewijzigingen op te sporen.number-

sentCount heeft candidate-status - zie het onderdeel Eerlijkheid. ttl is er één die het waard is te kennen, ook buiten een strikte pass/fail-regel om: hem koppelen aan previous.ttl (zie Wrappers hierboven) signaleert een routewijziging tussen controles, omdat de time-to-live van een pakket bij aankomst weerspiegelt hoeveel hops het doorkruiste.

Regels die mensen echt willen schrijven

De pagina is bereikbaar en zegt ook echt het juiste

Een statuscode alleen kan u niet vertellen dat een pagina correct rendert - een 200-met-lege-schil-respons is het klassieke stille falen dat een controle op alleen status mist.

status isOk
body contains "Add to cart"

Een API antwoordt met JSON en het verwachte veld

Controleer dat het endpoint nog steeds JSON spreekt, en grijp er dan in. De eerste regel betrapt een HTML-foutpagina die wordt geserveerd waar JSON zou moeten staan, een veelvoorkomende storingsvorm achter een proxy; de tweede controleert de eigen gerapporteerde gezondheid van de API, niet alleen de transportstatus.

body isJson
body.json.path("$.status") eq "ok"

De respons werd trager dan hij zou moeten zijn

Splits het uit wanneer u wilt weten wát u moet oplossen in plaats van alleen dát iets traag is - time.connect, time.tls, time.dns en time.head scheiden netwerk-, handshake-, resolver- en applicatietijd.

time lt 2s

Een redirect stuurde bezoekers van uw eigen domein af

Vergelijkt waar de controle op uitkwam met de URL die u configureerde - hij faalt zodra een redirectketen, gekaapt, verkeerd geconfigureerd, of simpelweg gewijzigd door een deploy, ergens anders terechtkomt dan bedoeld.

url.host eq url.original.host

De pagina is veranderd sinds de laatste controle

Nuttig bij inhoud die stabiel zou moeten zijn tussen controles - prijzen, voorwaarden, een gepubliceerd beleid - en dient tegelijk als een eenvoudig defacement-signaal.

previous.body.hash eq body.hash

Een getal binnen een bereik, kort geschreven

Betrapt zowel een afgeslankte pagina als een op hol geslagen pagina in één regel, zonder een expliciet bereik uit te schrijven.

body.size between 50 and 500kb

Een certificaat dat bijna verloopt

De meest voorkomende TLS-controle, en één die een gewone up/down-monitor helemaal niet kan uitdrukken - een certificaat dat vandaag nog wel valideert maar volgende week verloopt, geeft geen ander waarschuwingssignaal. Combineer het met cert.issuer als u ook een certificaat wilt betrappen dat stilletjes door de verkeerde autoriteit is uitgegeven.

cert.days.left gt 14

Een databasequery die het verkeerde aantal rijen teruggeeft

Bij een Database-controle is rows de collectie die een query beïnvloedde of teruggaf - hem tellen betrapt een query die precies één accountrecord zou moeten teruggeven, die stilletjes nul begint terug te geven (verwijderd, of een kapotte join) of meer dan één (een duplicaat dat niet zou moeten bestaan).

rows.count eq 1

Een SNMP-waarde die buiten bereik drift

Een SNMP-apparaat dat ook maar antwoordt, is niet hetzelfde als een gezond apparaat - een bewaakte OID (schijfgebruik, wachtrijdiepte, temperatuur) kan ruim voorbij een veilige drempel klimmen terwijl het apparaat zelf perfect bereikbaar blijft. De opgevraagde value tegen een bereik vergelijken betrapt wat een simpele bereikbaarheidscontrole niet kan.

value lt 90

Een TCP-dienst die met de verkeerde banner antwoordt

Een poort die verbindingen accepteert, is niet hetzelfde als de juiste dienst die erop luistert - een vastgelopen proces, een verkeerd geconfigureerde proxy, of een vervangen/gedowngrade dienst kunnen allemaal nog steeds een TCP-handshake voltooien. De begroetingstekst lezen die een dienst direct na connect stuurt (een SMTP-, FTP- of vergelijkbare banner) betrapt wat een kale poort-open-controle niet kan.

banner contains "220"

Vergelijken met de vorige controle

Een handvol onderwerpen kijkt terug in plaats van alleen naar de huidige respons: zet previous. voor een onderwerp om te lezen wat het was bij de laatste controle, of wikkel het in delta(...) om het verschil tussen toen en nu te krijgen, of in delta2(...) om de verandering van die verandering te krijgen - nuttig om een waarde te betrappen die versnelt in plaats van drift (een responstijd die met elke controle sneller stijgt). previous.body.hash eq body.hash hierboven is precies dit - "komt de vingerafdruk van de body overeen met wat hij de vorige keer was." delta(body.size, h) leest de verandering als een snelheid per uur in plaats van een ruw verschil, voor waarden waarvan u verwacht dat ze gestaag groeien in plaats van springen.

De eerste keer dat zo'n regel draait, heeft hij niets om mee te vergelijken, dus slaat hij over in plaats van te falen: de controle wordt gemarkeerd als "warming up", niet als kapot, en de regel toevoegen veroorzaakt geen valse waarschuwing. Warming geldt alleen wanneer de huidige lezing gezond is en de baseline ontbreekt. Faalt de huidige lezing zelf (bijvoorbeeld, de body is deze keer geen geldige JSON), dan faalt de regel precies zoals de gewone, niet-previous.-versie ervan zou doen. Zo'n regel heeft ook nodig dat de waarde tussen controles verandert, wat hem betekenisloos maakt bij een controlemethode die nooit staat vooruitbrengt, bijvoorbeeld een HEAD-verzoek.

Vergelijken met de vorige controle vereist een abonnement van een hoger niveau; zonder dat verschijnen die onderwerpen grijs in de editor, met een toelichting.

Limieten, en wat bewust ontbreekt

Hoeveel regels u kunt toevoegen, hangt af van uw abonnement, getoond als een live teller naast "Add rule." De engine handhaaft ook een absoluut plafond op elke controle, ongeacht het abonnement, een beveiliging tegen misbruik eerder dan een limiet op gewoon gebruik: een controle met ook maar in de buurt van zoveel regels zou al ongewoon groot zijn.

Er is geen manier om aangepaste JavaScript voor een regel te schrijven, en die zal er ook nooit komen. Elke regel is opgebouwd uit een vaste, benoemde woordenschat van onderwerpen en predicaten in plaats van een open scriptingsandbox, wat een regel in één oogopslag leesbaar houdt en veilig om op elke monitoringagent wereldwijd uit te voeren.

Niet elke regel werkt overal zodra hij geschreven is: sommige nieuwere voorwaarden vereisen een recente versie van de monitoringagent die uw controle uitvoert, dus een nieuwe mogelijkheid heeft tijd nodig om elke controle op uw account te bereiken terwijl agents op de achtergrond updaten. Regels gebouwd op de stabiele kern van de taal ondervinden hier geen invloed van.

Een handvol vermeldingen in deze referentie is nog niet volledig live, en elk daarvan is in de tabel hierboven gelabeld:

  • Gereserveerd (gedeclareerd, nog niet gevuld door enige agent): ttfb, httpVersion, cert.subject.
  • Kandidaat (al aan het uitrollen, nog niet op elke agent): conn.ip.family en conn.failedIps bij HTTP-, Port- en Ping-controles, value.type bij SNMP-controles, banner.hash en banner.size bij Port-controles, sentCount bij Ping-controles, en de eigen time van de Counter-controle.
  • Nog niet beschikbaar: steps, gereserveerd voor een toekomstig meerstapscontroletype.
  • Vereist een abonnement met stateful assertions: de hele familie wrappers previous / delta / delta2, bij elk controletype.

Al het overige in deze referentie is vandaag al live op elk abonnement met assertion mode.

Waar assertion mode vandaag werkt

De Response Validation-schakelaar voor assertion mode verschijnt bij HTTP-(website)- en API-monitors, die dezelfde regeleditor en syntaxis delen. Dezelfde taal en evaluator draaien al onder Database-, Counter-, Port-, Ping- en SNMP-controles op protocolniveau: het register hierboven bedient alle zes controletypen, en een regel opgeslagen voor het ene leest hetzelfde als de modus later de editor van een ander type bereikt.

SNMP toont de duidelijkste preview: de editor ervan heeft al een paneel Assertion rules dat value en value.type noemt, gelabeld "Coming soon", zonder werkende regellijst erachter. Database-, Counter- en Ping-controles tonen helemaal geen assertion-mode-paneel, ook al zijn hun onderwerpen even live in de engine eronder.

Een echte controle instellen

Valideert u een REST-API in plaats van een gewone webpagina, begin dan bij API-responsvalidatie, die de uptime, responstijd en body van uw eigen API samen behandelt. Voor een pagina of site die overal waar uw gebruikers zich bevinden online moet blijven en correct moet antwoorden, is wereldwijde uptimemonitoring vanaf 300+ locaties het bredere plaatje waar assertion mode op aansluit. Om regels via code in te stellen in plaats van via het paneel, maakt en werkt de eigen API v2 van HostTracker de assertieregels van een monitor bij op dezelfde manier als de editor. Voor de certificaatverloopregel hierboven en al het overige rond TLS behandelt domein- en TLS-certificaatmonitoring het controletype waarop cert.days.left en de andere TLS-onderwerpen leven. Om nu, zonder account, te zien hoe één regel evalueert tegen een echte URL, gebruikt u de gratis HTTP-controletool. Voor de statuscodes waarmee het onderwerp status vergelijkt, begint u bij 200 OK, en de monitoringhandleidingen behandelen het instellen van elk controletype waarop deze taal draait.

Veelgestelde vragen

Wat gebeurt er met mijn oude statuscode- en trefwoordinstellingen als ik assertion mode inschakel?

Ze worden vervangen door de regellijst zolang de modus aan staat. Hem weer uitschakelen voordat u opslaat, herstelt de klassieke velden precies zoals ze waren: er wordt niets verwijderd, de twee modi kunnen alleen niet allebei actief zijn.

Kan ik meerdere voorwaarden combineren in één monitor?

Ja: elke regel in de lijst moet slagen. Er is nog geen "OR" tussen aparte regels, dus om één van meerdere waarden te accepteren, gebruikt u één regel met in [...] of containsAny [...].

Zal assertion mode mij ooit mijn eigen script laten schrijven?

Nee. Elke regel is samengesteld uit de vaste set onderwerpen en predicaten van de taal. Er is bewust geen aangepaste JavaScript.

Wat gebeurt er de eerste keer dat ik een regel toevoeg die vergelijkt met de vorige controle?

Er is dan nog niets om mee te vergelijken, dus wordt hij gemarkeerd als warming up en overgeslagen in plaats van als mislukt. Een "is dit veranderd"-regel toevoegen veroorzaakt op zichzelf nooit een valse waarschuwing.

Heb ik een specifiek abonnement nodig om assertion mode te gebruiken?

De modus zelf en de dagelijkse regels (status, body, headers, timing, redirects) zijn breed beschikbaar; hoeveel regels u tegelijk kunt toevoegen, hangt af van uw abonnement en wordt live getoond in de editor. Regels die vergelijken met een vorige controle (previous, delta, delta2) vereisen een abonnement van een hoger niveau en staan grijs, met een toelichting.

Werkt assertion mode bij API-monitors op dezelfde manier als bij website-monitors?

Ja. HTTP- en API-monitors delen dezelfde regeleditor, onderwerpen en predicaten, en een regel geschreven voor de ene leest identiek bij de andere.

Wat doet where(...) precies, en wanneer heb ik het nodig?

Het filtert een collectie terug tot de elementen die aan een voorwaarde voldoen, voordat u een veld van het resultaat leest. Gebruik het wanneer een gewone projectie zoals requests.status niet specifiek genoeg is en u één bepaalde sprong, link of element nodig heeft in plaats van de hele collectie (zie het onderdeel hierboven).

Kan ik vandaag al een regel schrijven tegen een databasequery, een SNMP-waarde, een portbanner of een pingresultaat?

De taal en de evaluator ondersteunen ze allemaal, en de onderwerptabellen hierboven behandelen elk ervan. De regeleditor doet dat niet: alleen HTTP- en API-monitors tonen vandaag de Response Validation-schakelaar. SNMP toont een preview "Coming soon" van zijn twee onderwerpen, en Database-, Counter- en Ping-controles tonen helemaal geen assertion-mode-paneel.

Waarom staat er bij sommige onderwerpen in deze referentie "gereserveerd" of "kandidaat" in plaats van ze gewoon normaal te vermelden?

"Gereserveerd" betekent dat het veld in het register is gedeclareerd maar nog door geen enkele agent wordt gevuld; "kandidaat" betekent dat het naar agents wordt uitgerold maar nog niet elke agent heeft bereikt. Beide worden vermeld waar ze in deze referentie voorkomen en in de samenvattende lijst in het onderdeel Limieten hierboven.

Nu controleren

Voer de gratis check uit op je eigen site, zonder account.

Web api validation

Dit permanent monitoren

Ontvang een melding zodra er iets misgaat: HostTracker controleert vanaf meer dan 300 locaties en waarschuwt je via e-mail, sms, Slack, Telegram en meer.

HostTracker-functies

Meer in dit onderdeel: Monitoringhandleidingen: elk checktype, stap voor stap