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.

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:

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:
| Onderwerp | Wat het is | Voorbeeld |
|---|---|---|
status | De HTTP-statuscode van het uiteindelijke antwoord, na het volgen van redirects | status isOk |
body | De responsbody als platte tekst | body contains "Add to cart" |
body.json / body.xml / body.html / body.yaml | De body, maar alleen wanneer die daadwerkelijk als dat formaat parset - anders is het onderwerp simpelweg niet aanwezig | body.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.hash | De grootte van de respons in bytes, en een vingerafdruk van de inhoud van de body | body.size gt 1kb |
header("Name") | Eén responseheader, opgezocht op naam | header("Content-Type") isJson |
time en time.connect / time.tls / time.dns / time.head | Totale responstijd, en de netwerk-, TLS-handshake-, DNS- en server-denktijdfasen ervan | time lt 2s |
redirects / requests | De 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 uitkwam | url.scheme eq "https" |
cert.days.left | Dagen resterend voordat het TLS-certificaat verloopt | cert.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.
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
body | De responsbody als gedecodeerde tekst. | string | body contains "Welcome" |
header | Eén responseheader van de uiteindelijke respons, op naam. | string | header("Content-Type") isJson |
redirects | De gevolgde redirectsprongen - de verzoekketen zonder het laatste element. | collection | redirects.count eq 0 |
status | De HTTP-statuscode van het uiteindelijke antwoord, na het volgen van redirects. | number | status isOk |
body.size | De grootte van de gedownloade body, in bytes. | number | body.size lt 500000 |
url | De URL die daadwerkelijk antwoordde, na alle redirects. Een url: vergelijk het als tekst, of lees de onderdelen (url.host, .port, .path, .query, .scheme). | url | url.host eq "www.example.com" |
requests | Elk verzoek dat deze controle deed, op volgorde - de redirectsprongen en dan het uiteindelijke verzoek. | collection | requests.count le 2 |
url.host | Het host-onderdeel van de URL. | string | url.host eq "example.com" |
url.path | Het pad-onderdeel van de URL. | string | url.path startsWith "/api" |
url.port | Het poort-onderdeel van de URL. | number | url.port eq 443 |
url.query | De querystring van de URL. | string | url.query contains "token" |
url.scheme | Het schema van de URL (http of https). | string | url.scheme eq "https" |
body.hash | Een digest van de responsbody - vergelijk met previous.body.hash om inhoudswijzigingen te detecteren. | string | body.hash eq previous.body.hash |
httpVersion (gereserveerd - nog niet gevuld) | De onderhandelde HTTP-versie. | string | httpVersion eq "HTTP/2" |
setCookie | De Set-Cookie-waarden van de uiteindelijke respons, één item per cookie - match er één met contains of matches, tel ze met .count. | collection | setCookie exists |
steps (nog niet beschikbaar) | De stappen van een meerstapscontrole. Nog niet beschikbaar. | collection | steps.count le 1 |
url.original | De 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). | url | url.original.scheme eq "http" |
url.original.host | Het host-onderdeel van de URL. | string | url.original.host eq "example.com" |
url.original.path | Het pad-onderdeel van de URL. | string | url.original.path startsWith "/start" |
url.original.port | Het poort-onderdeel van de URL. | number | url.original.port eq 80 |
url.original.query | De querystring van de URL. | string | url.original.query contains "utm_" |
url.original.scheme | Het schema van de URL (http of https). | string | url.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.
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
body.json | De responsbody, maar alleen wanneer die echt JSON is. | string | body.json exists |
body.json.path | Bevraag de JSON-body met een JSONPath-expressie. | json | body.json.path("$.status") eq "ok" |
body.html | De responsbody, maar alleen wanneer die echt HTML is. | string | body.html exists |
body.html.path | Selecteer pagina-elementen met een CSS-selector. | collection | body.html.path("h1").first contains "Welcome" |
body.regex | Match de tekst met een reguliere expressie en neem wat die vastlegde. | string | body.regex("order-(?<id>\\d+)") exists |
body.xml | De responsbody, maar alleen wanneer die echt XML is. | string | body.xml exists |
body.xml.path | Bevraag de XML-body met een XPath-expressie. | string | body.xml.path("//item/@id") exists |
body.html.a | Elke link op de pagina. | collection | body.html.a.count gt 0 |
body.html.link | Elk <link> dat de pagina declareert. Een kale vermelding betekent de linkdoelen. | collection | body.html.link.count gt 0 |
body.html.script | Elk script dat de pagina laadt. Een kale vermelding betekent de scriptbronnen. | collection | body.html.script.count gt 0 |
body.yaml | De responsbody, maar alleen wanneer die echt YAML is. | string | body.yaml exists |
body.yaml.path | Bevraag de YAML-body met een JSONPath-expressie. | json | body.yaml.path("$.services.web.image") contains ":1." |
body.html.regex | Match de tekst met een reguliere expressie en neem wat die vastlegde. | string | body.regex("order-(?<id>\\d+)") exists |
body.json.regex | Match de tekst met een reguliere expressie en neem wat die vastlegde. | string | body.regex("order-(?<id>\\d+)") exists |
body.xml.regex | Match de tekst met een reguliere expressie en neem wat die vastlegde. | string | body.regex("order-(?<id>\\d+)") exists |
body.yaml.regex | Match de tekst met een reguliere expressie en neem wat die vastlegde. | string | body.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.
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
bind | Een waarde vastgelegd door een eerdere regex-regel, op naam of op positie. | string | bind("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.
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
time | Totale responstijd: connect + TLS + wachten + download. DNS-resolutie is niet inbegrepen. | number | time lt 2000 |
ttfb (gereserveerd - nog niet gevuld) | Time to first byte. | number | ttfb lt 200 |
time.connect | Tijd om de TCP-verbinding tot stand te brengen. | number | time.connect lt 500 |
time.data | Tijd om de responsbody te downloaden. | number | time.data lt 1000 |
time.dns | Tijd om de domeinnaam op te lossen. Niet inbegrepen in het kale onderwerp time. | number | time.dns lt 200 |
time.head | Wachttijd voor de responseheaders. | number | time.head lt 500 |
time.tls | Tijd voor de TLS-handshake. | number | time.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).
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
conn | De netwerkverbinding die de controle maakte - het adres dat de respons leverde en eventuele verbindingsfouten. | string | - |
conn.failed | Hoeveel van de opgeloste adressen niet konden verbinden. | number | conn.failed eq 0 |
conn.failedIps (kandidaat - wordt uitgerold naar agents) | De opgeloste adressen die niet konden verbinden. | collection | conn.failedIps.count eq 0 |
conn.ip | Het IP-adres dat de respons daadwerkelijk leverde. | string | conn.ip eq "203.0.113.10" |
conn.ip.family (kandidaat - wordt uitgerold naar agents) | Of de respons via IPv4 of IPv6 werd geleverd. | string | conn.ip.family eq "IPv4" |
dns | DNS-resolutie van de bewaakte naam - welke adressen die opleverde en welke server antwoordde. | string | - |
dns.ips | Alle IP-adressen waarnaar de domeinnaam tijdens deze controle werd opgelost. | collection | dns.ips contains "1.2.3.4" |
dns.server | De DNS-server die de resolutie beantwoordde. | string | dns.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.
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
cert.days.left | Dagen resterend voordat het sitecertificaat verloopt. | number | cert.days.left gt 14 |
cert | Het certificaat dat de server presenteerde - dagen tot verloop, uitgever en identiteitsvelden. | string | - |
cert.days | Dagen sinds het certificaat werd uitgegeven. | number | cert.days gt 0 |
cert.issuer | De certificeringsautoriteit die het sitecertificaat uitgaf. | string | cert.issuer contains "Let's Encrypt" |
cert.san | De domeinnamen waarvoor het certificaat geldig is. | collection | cert.san contains "www.example.com" |
cert.serial | Het serienummer van het certificaat. | string | cert.serial exists |
cert.subject (gereserveerd - nog niet gevuld) | Het subject van het certificaat. Nog niet vastgelegd - komt met een toekomstige agentversie. | string | cert.subject contains "example.com" |
tls | De TLS-handshake van de beveiligde verbinding - onderhandelde protocolversie en cipher. | string | - |
tls.cipher | De onderhandelde ciphersuite. | string | tls.cipher contains "AES" |
tls.protocol | De onderhandelde TLS-versie. | string | tls.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.
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
status | De statuscode van dit verzoek in de keten. | number | status eq 200 |
url | De URL waarnaar dit verzoek ging. | url | url startsWith "https://" |
header | Een 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. | string | header("Content-Type") contains "json" |
hstsHeader | De Strict-Transport-Security-header van dit verzoek. | string | requests[0].hstsHeader exists |
setCookie | De Set-Cookie-headerwaarden van dit verzoek. | collection | setCookie exists |
url.original | De 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). | url | url.original.scheme eq "http" |
url.host | Het host-onderdeel van de URL. | string | url.host eq "example.com" |
url.port | Het poort-onderdeel van de URL. | number | url.port eq 443 |
url.path | Het pad-onderdeel van de URL. | string | url.path startsWith "/api" |
url.query | De querystring van de URL. | string | url.query contains "token" |
url.scheme | Het schema van de URL (http of https). | string | url.scheme eq "https" |
url.original.host | Het host-onderdeel van de URL. | string | url.original.host eq "example.com" |
url.original.port | Het poort-onderdeel van de URL. | number | url.original.port eq 80 |
url.original.path | Het pad-onderdeel van de URL. | string | url.original.path startsWith "/start" |
url.original.query | De querystring van de URL. | string | url.original.query contains "utm_" |
url.original.scheme | Het schema van de URL (http of https). | string | url.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.
| Elementbereik | Hoe één item eruitziet |
|---|---|
body.html.path | Eén element gematcht door een body.html.path("selector")-CSS-query. |
body.html.a | Eén <a>-linkelement uit body.html.a. |
body.html.script | Eén <script>-element uit body.html.script. |
body.html.link | Eén <link>-element uit body.html.link. |
requests | Eén verzoek in de volledige keten (zie de tabel met sprong-onderwerpen hierboven). |
redirects | Eé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:
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
url | Het linkdoel precies zoals de markup het schrijft. | string | body.html.a.url contains "/checkout" |
text | De zichtbare tekst van het element. | string | body.html.a.text contains "Sign in" |
absolute | Het 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). | url | body.html.a.absolute.scheme in ["https"] |
rel | Het rel-attribuut van het element. | string | body.html.a.where(current.rel eq "nofollow").count eq 0 |
absolute.host | Het host-onderdeel van de URL. | string | body.html.a.absolute.host.unique.count le 3 |
absolute.port | Het poort-onderdeel van de URL. | number | body.html.a.absolute.port in [443] |
absolute.path | Het pad-onderdeel van de URL. | string | body.html.a.absolute.path startsWith "/" |
absolute.query | De querystring van de URL. | string | body.html.a.absolute.query not contains "session" |
absolute.scheme | Het schema van de URL (http of https). | string | body.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).
| Naam | Wat het is | Geldt voor | Voorbeeld |
|---|---|---|---|
eq | Gelijk aan. Tegen een json("…")/xml("…")/yaml("…")-literal is dit een EXACTE structurele match: dezelfde sleutels (in willekeurige volgorde), arrays op volgorde, dezelfde waarden. | elk type | body.json eq json("{\"ok\": true}") |
lt | Kleiner dan. | getallen | time lt 2000 |
le | Kleiner dan of gelijk aan. | getallen | cert.days.left le 30 |
gt | Groter dan. | getallen | body.size gt 0 |
ge | Groter dan of gelijk aan. | getallen | status ge 500 |
contains | Bevat 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 lijst | body.json contains json("{\"status\": \"ok\"}") |
startsWith | Begint met de tekst - bij een lijst, wanneer ENIG item dat doet. | tekst | url.path startsWith "/api" |
endsWith | Eindigt met de tekst - bij een lijst, wanneer ENIG item dat doet. | tekst | url.path endsWith ".json" |
matches | Komt overeen met de reguliere expressie ergens in de tekst - bij een lijst, wanneer ENIG item dat doet. | tekst | body matches "order-\\d+" |
containsAny | Bevat minstens één van de opgesomde waarden (bij een lijst: een item IS GELIJK aan één ervan). | lijst | body containsAny ["In stock", "Pre-order"] |
containsAll | Bevat elk van de opgesomde waarden (bij een lijst: elke waarde is gelijk aan een item - de bewijzende items mogen verschillen). | lijst | body.html.a.text containsAll ["Home", "Contact"] |
in | Is één van de opgesomde waarden of bereiken - bij een lijst, elk item is dat. | waarde(n) of bereik | status in [200, 301, 302] |
exists | Het onderwerp is aanwezig. | elk onderwerp | header("ETag") exists |
isNumber | De waarde leest als een getal. | tekst of alles | bind("id") isNumber |
unique | De lijst bevat geen duplicaten. | lijst | dns.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).
| Naam | Wat het versmelt | Geldt voor | Voorbeeld |
|---|---|---|---|
count | Hoeveel items de lijst heeft. | elke collectie | requests.count le 2 |
min | Het kleinste getal in de lijst. | numerieke collectie | requests.status.min ge 200 |
max | Het grootste getal in de lijst. | numerieke collectie | requests.status.max lt 500 |
sum | De som van de getallen in de lijst. | numerieke collectie | requests.status.sum gt 0 |
avg | Het gemiddelde van de getallen in de lijst. | numerieke collectie | requests.status.avg lt 300 |
first | Het eerste item van de lijst. | elke collectie | redirects.status.first eq 301 |
last | Het laatste item van de lijst. | elke collectie | requests.status.last eq status |
unique | De lijst met duplicaten verwijderd. | elke collectie | dns.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.
| Naam | Wat het betekent | Geldt voor | Voorbeeld |
|---|---|---|---|
isOk | De status is een succescode (200-299). | status | - |
isRedirect | De status is een redirectcode (300-399). | status | status isRedirect |
isClientError | De status is een clientfout (400-499). | status | status isClientError |
isServerError | De status is een serverfout (500-599). | status | status isServerError |
isJson | De inhoud is echt JSON. | document of media-type tekst | header("Content-Type") isJson |
isXml | De inhoud is echt XML - de body parset als XML, of een header noemt een XML-mediatype. | document of media-type tekst | body isXml |
isHtml | De inhoud is echt HTML - de body parset als HTML, of een header noemt een HTML-mediatype. | document of media-type tekst | body isHtml |
isForm | Een 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 tekst | header("Content-Type") isForm |
isEmpty | Niets aanwezig: een lege tekst, een grootte nul of een lege lijst. | tekst, grootte of lijst | body isEmpty |
isNull | De waarde is null. | elke waarde | body.json.path("$.deletedAt") isNull |
absent | Het onderwerp is helemaal niet aanwezig. | elk onderwerp | header("X-Debug") absent |
between | Een 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.
| Onderdeel | Wat het benoemt | Opmerkingen |
|---|---|---|
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 voorwaarde | Elk gewoon predicaat, inclusief not en nocase | Elke voorwaarde die op het hoogste niveau van een regel werkt, werkt ook hier. |
| de waarde | Waartegen het veld van elk element wordt vergeleken | Meestal 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.
| Vorm | Wat het doet | Soort | Voorbeeld |
|---|---|---|---|
where | Behoud alleen de elementen die overeenkomen, en ga daar verder. | collectiefilter | requests.where(current.url contains "cart").status.first eq 301 |
not | Keert de voorwaarde die erop volgt om. | flag | body not contains "error" |
nocase | Vergelijk tekst zonder rekening te houden met hoofd- en kleine letters. | flag | body contains "welcome" nocase |
current | Binnen where(…), benoemt het ene element dat gefilterd wordt. | elementverwijzing (binnen where) | requests.where(current.status eq 301) |
range | Een bereik van getallen, beide uiteinden INBEGREPEN. | getallenbereik | status in [200..299] |
list | Een lijst waarden om tegen te vergelijken. | waardelijst | status in [200, 301, 302] |
docLiteral | Een getypeerde documentwaarde voor structurele vergelijking: de tekst tussen aanhalingstekens wordt geparst als JSON, XML of YAML wanneer de regel wordt opgeslagen. | json/xml/yaml-tekst | body.json contains json("{\"user\": {\"active\": true}}") |
implicitExists | Een regel die alleen een onderwerp benoemt, controleert of het aanwezig is: alleen body.json schrijven slaat op als body.json exists. | kale onderwerpregel | body.json |
index | Kiest ÉÉN item van een lijst op positie, tellend vanaf 0. | 0-gebaseerd geheel getal | requests[0].status |
label | Een optionele naam voor de regel, geschreven voor een dubbele punt. | naam voor een dubbele punt | "json ok": body.json exists |
comment | Alles 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.
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
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. | number | delta(body.size, h) lt 1mb |
delta2 (vereist een abonnement met stateful assertions) | De verandering van de verandering - versnelt een waarde? | number | delta2(time) gt 0 |
previous (vereist een abonnement met stateful assertions) | De waarde die dit onderwerp had bij de vorige controle. | alles | status 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.
| Flag | Wat het doet | Soort | Voorbeeld |
|---|---|---|---|
not | Keert de voorwaarde die erop volgt om. | flag (hecht zich aan een regel) | body not contains "error" |
nocase | Vergelijk 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.
| Familie | Matcht | Bijbehorende sugar | Voorbeeld |
|---|---|---|---|
json | application/json, text/json, of elk mediatype eindigend op +json (application/problem+json, application/vnd.api+json, application/ld+json, ...). | sugar: isJson | header("Content-Type") isJson |
xml | application/xml, text/xml, of elk mediatype eindigend op +xml (image/svg+xml, application/atom+xml, ...). | sugar: isXml | header("Content-Type") isXml |
html | text/html of application/xhtml+xml. | sugar: isHtml | header("Content-Type") isHtml |
form | application/x-www-form-urlencoded of multipart/form-data. | sugar: isForm | header("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:
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
scalar | De ene waarde die de query teruggaf (Scalar-modus). | alles | - |
rows | De rijen die de query beïnvloedde of teruggaf (NonQuery-modus). | collection | - |
time.query | Tijd 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:
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
value | De 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:
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
time.request | Tijd die het SNMP-verzoek kostte. | number | - |
value | De 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:
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
banner | De 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.regex | Match de tekst met een reguliere expressie en neem wat die vastlegde. | string | body.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:
| Naam | Wat het is | Type/waarden | Voorbeeld |
|---|---|---|---|
loss | Het percentage echoverzoeken dat geen antwoord kreeg. | number | loss eq 0 |
reply | De geslaagde echo-antwoorden. | collection | - |
sentCount (kandidaat - wordt uitgerold naar agents) | Hoeveel echoverzoeken werden verstuurd. | number | - |
time.max | De retourtijd van het traagste antwoord. | number | - |
time.min | De retourtijd van het snelste antwoord. | number | - |
ttl | De 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.familyenconn.failedIpsbij HTTP-, Port- en Ping-controles,value.typebij SNMP-controles,banner.hashenbanner.sizebij Port-controles,sentCountbij Ping-controles, en de eigentimevan 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.