Přejít na hlavní obsah

Návody / Návody k monitoringu: každý typ kontroly krok za krokem

Assertion Mode: úplná reference ověření odpovědi

Assertion mode nahrazuje pevná pole monitoru pro úspěch/neúspěch seznamem pravidel, která si napíšete sami, přičemž každé pravidlo pojmenovává přesně to, co musí o odpovědi platit. Většina monitorů dostupnosti posuzuje kontrolu podle hrstky pevných polí: stavový kód, který se počítá jako "down", seznam stavů k ignorování, možná klíčové slovo, které se musí někde v těle objevit. Tato pole nedokážou vyjádřit API, které legitimně odpovídá 404 na chybějící zdroj, stránku, která vrací 200 s prázdnou kostrou, protože databázi vypršel časový limit, nebo řetězec přesměrování, který začne vést přes cizí doménu.

Assertion mode HostTracker nahrazuje tato pevná pole malým jazykem pravidel, který si napíšete sami, pravidlo po pravidlu, přímo v editoru monitoru. Každé pravidlo přesně říká, co musí o odpovědi platit: stav, kus těla, hlavičku, jak dlouho to trvalo, kam přesměrování skončilo. Kontrola selže jen tehdy, když selže některé z vašich pravidel. Je to stejný jazyk pro web, REST API, databázový dotaz, TCP port, cíl Ping, čítač SNMP nebo obecnou kontrolu Counter: jedna sada subjektů, jedna sada predikátů, znovu použitá všude, kde se tento režim objevuje. Tento návod pokrývá každý subjekt, operátor, reduktor, sugar zkratku a formu syntaxe, kterou engine implementuje.

Co assertion mode nahrazuje

Klasická pole Ověření odpovědi zůstávají na místě, když je assertion mode vypnutý: očekávaný rozsah stavu, seznam stavů k ignorování, klíčové slovo, které se musí (nebo nesmí) objevit. Tento režim je přepínač, který danou pevnou sadu vymění za seznam pravidel, jenž si sestavíte sami, a jeho opětovné vypnutí před uložením vrátí klasická pole přesně zpátky. Žádný monitor není v jednom režimu uzamčen natrvalo.

Jeden jazyk místo hromady gadgetů pro jednotlivé typy se skládá dohromady. Kontrola "musí to být JSON a obsahovat pole", kontrola "musí to pořád říkat Add to cart" a kontrola "nesmělo to zpomalit" jsou tři pravidla ve stejné syntaxi, ve stejném seznamu, každé prochází nebo selhává samostatně.

Jak ho zapnout

Assertion mode žije uvnitř sekce Ověření odpovědi editoru monitoru, u monitorů HTTP (webová stránka) a API. Přepněte spínač a klasická pole nahradí číslovaný seznam pravidel s tlačítkem "Přidat pravidlo" a živým počítadlem ukazujícím, kolik pravidel jste využili z limitu vašeho plánu.

Assertion mode zapnutý, s prvním sestaveným a ověřeným pravidlem

Každé pravidlo se ověřuje průběžně, jak ho sestavujete: pravidlo, které ještě není dokončené, nese zřetelný stav "nedokončeno", a pravidlo, které editor dokáže vyhodnotit, je označeno jako kompletní. Každé pravidlo má také malé tlačítko </>, které otevře jeho čistě textovou zdrojovou podobu, takže si můžete přesný výraz přečíst nebo zkopírovat místo pohledu jen po jednotlivých polích.

Mentální model: subjekt, predikát, hodnota

Každé pravidlo má stejný tvar: subjekt (stavový kód, tělo, hlavička, doba odezvy), predikát (rovná se, obsahuje, existuje, je menší než) a u většiny predikátů hodnotu, se kterou se porovnává. status eq 200 je subjekt, predikát a hodnota; body.json exists je subjekt a predikát bez hodnoty, protože "exists" nic dalšího nepotřebuje.

Sestavení pravidla v editoru začíná výběrem toho, co kontrolovat, pak podmínky, pak hodnoty:

Sestavování druhého pravidla: výběr pole uvádí každý subjekt s jeho typem a příkladem

Pravidla v seznamu se kombinují pomocí AND: kontrola selže, když selže byť jediné pravidlo, a projde jen tehdy, když projdou úplně všechna. OR zatím neexistuje, takže pro přijetí jednoho z několika stavů nebo řetězců to vyjádřete uvnitř jednoho pravidla (status in [200, 301, 302], body containsAny ["In stock", "Pre-order"]). Pravidlo, které selže, se v upozornění pojmenuje samo, takže každému dejte krátký popisek, kde to jde, a upozornění pak uvede, které očekávání se porušilo.

Co lze kontrolovat

Výběr řadí subjekty do vlastního dokumentu odpovědi (tělo, hlavičky) a jejího transportu (stav, časování, přesměrování, TLS). Několik nejdůležitějších subjektů, s úplným seznamem v referenci níže:

SubjektCo to jePříklad
statusHTTP stavový kód finální odpovědi, po následování přesměrovánístatus isOk
bodyTělo odpovědi jako prostý textbody contains "Add to cart"
body.json / body.xml / body.html / body.yamlTělo, ale jen když se skutečně dá zpracovat jako daný formát - jinak subjekt jednoduše není přítomenbody.json exists
body.json.path("$.a")Dotaz JSONPath do JSON těla (stejný dotazovací jazyk funguje i nad YAML, protože YAML se zpracuje do stejného objektového modelu)body.json.path("$.status") eq "ok"
body.size / body.hashVelikost odpovědi v bajtech a otisk obsahu tělabody.size gt 1kb
header("Name")Jedna hlavička odpovědi, vyhledaná podle jménaheader("Content-Type") isJson
time a time.connect / time.tls / time.dns / time.headCelková doba odezvy a její síťová fáze, fáze TLS handshake, DNS a přemýšlecí čas serverutime lt 2s
redirects / requestsSkoky, které kontrola následovala, a celý řetězec (včetně finální odpovědi)redirects.count eq 0
url a jeho části (.host, .scheme, .path...)Finální URL adresa, na které kontrola skončilaurl.scheme eq "https"
cert.days.leftPočet dní, které zbývají do vypršení TLS certifikátucert.days.left gt 14

Čísla přijímají jednotkové přípony, takže je nikdy nemusíte ručně převádět: 2s znamená 2000 milisekund, 1kb znamená 1024 bajtů. Textová porovnání rozlišují velikost písmen, pokud do pravidla nepřidáte nocase.

Úplná reference

Následuje úplně každý subjekt, operátor, reduktor, sugar zkratka, filtr a forma syntaxe, kterou assertion engine registruje pro kontroly HTTP a API, převzato přímo z vlastního registru enginu (stejných dat, která napájejí výběry v editoru pravidel i jeho dokumentaci). Položky, které ještě nejsou obecně dostupné, nesou poznámku v závorce: rezervovaná pole, která engine zatím nezačal plnit, kandidáti, kteří se teprve dostávají k agentům, a stavová rodina, která vyžaduje konkrétní plán. Cokoli bez takové poznámky je dnes živé na každém plánu, který má assertion mode.

Reference následuje vlastní řazení enginu: nejdřív pole odpovědi, pak způsoby, jak sáhnout do těla, pak časování, síť a TLS, pak operátory, reduktory a zkratky, které fungují nad nimi všemi, a nakonec typy kontrol mimo HTTP, které mluví identickým jazykem.

Odpověď

Subjekty, které popisují samotnou odpověď: její stav, syrové tělo, hlavičky, URL adresu, ze které skutečně odpověděla, a řetězec požadavků, který k ní vedl.

NázevCo to jeTyp/hodnotyPříklad
bodyTělo odpovědi jako dekódovaný text.stringbody contains "Welcome"
headerJedna hlavička finální odpovědi, podle jména.stringheader("Content-Type") isJson
redirectsPřeskoky přesměrování, které byly následovány - řetězec požadavků bez svého posledního prvku.collectionredirects.count eq 0
statusHTTP stavový kód finální odpovědi, po následování přesměrování.numberstatus isOk
body.sizeVelikost staženého těla v bajtech.numberbody.size lt 500000
urlURL adresa, která skutečně odpověděla, po všech přesměrováních. URL: porovnejte ji jako text, nebo přečtěte její části (url.host, .port, .path, .query, .scheme).urlurl.host eq "www.example.com"
requestsKaždý požadavek, který tato kontrola provedla, v pořadí - přeskoky přesměrování a pak finální požadavek.collectionrequests.count le 2
url.hostČást URL adresy s hostitelem.stringurl.host eq "example.com"
url.pathČást URL adresy s cestou.stringurl.path startsWith "/api"
url.portČást URL adresy s portem.numberurl.port eq 443
url.queryŘetězec dotazu URL adresy.stringurl.query contains "token"
url.schemeSchéma URL adresy (http nebo https).stringurl.scheme eq "https"
body.hashOtisk těla odpovědi - porovnejte ho s previous.body.hash pro zjištění změny obsahu.stringbody.hash eq previous.body.hash
httpVersion (rezervováno - zatím neplněno)Vyjednaná verze HTTP.stringhttpVersion eq "HTTP/2"
setCookieHodnoty Set-Cookie finální odpovědi, jedna položka na cookie - shodu hledejte pomocí contains nebo matches, spočítejte je pomocí .count.collectionsetCookie exists
steps (zatím nedostupné)Kroky vícekrokové kontroly. Zatím nedostupné.collectionsteps.count le 1
url.originalURL adresa, se kterou byla kontrola nastavena, před jakýmkoli přesměrováním. URL jako samotné url: má stejné části (url.original.host, .port, .path, .query, .scheme).urlurl.original.scheme eq "http"
url.original.hostČást URL adresy s hostitelem.stringurl.original.host eq "example.com"
url.original.pathČást URL adresy s cestou.stringurl.original.path startsWith "/start"
url.original.portČást URL adresy s portem.numberurl.original.port eq 80
url.original.queryŘetězec dotazu URL adresy.stringurl.original.query contains "utm_"
url.original.schemeSchéma URL adresy (http nebo https).stringurl.original.scheme eq "http"

Dva aliasy: redirectCount je zkratka za redirects.count - redirectCount eq 0 se čte o něco přirozeněji než rovnocenný dlouhý tvar, když máte na mysli "kontrola odpověděla přímo, bez přesměrování." A setCookie na nejvyšší úrovni je seznam cookies finální odpovědi; stejné jméno se opakuje i na úrovni jednotlivého skoku uvnitř requests/redirects (viz Subjekty skoků níže), kde drží cookies jen daného jednoho požadavku.

Extrakce hodnot z těla

Tyto subjekty se vyhodnotí jen tehdy, když je tělo ve formátu, který pojmenovávají: JSON namespace na HTML stránce jednoduše není přítomen, ne že by to byla typovaná chyba. To dělá z exists standardní způsob, jak zjistit formát, a body.json exists se ptá, zda se tělo zpracovalo jako JSON. Každý ze čtyř formátových namespaců nese odpovídající dotazovací funkci .path(...) (JSONPath pro json/yaml, XPath pro xml, CSS selektory pro html) a odpovídající .regex(...), plus formátově neutrální body.regex(...), které čte syrový text bez ohledu na formát. body.html.a, body.html.script a body.html.link jsou hotové kolekce každého odkazu, skriptu a prvku <link> na stránce; pole dostupná u každého z nich najdete v sekci Rozsahy prvků níže.

NázevCo to jeTyp/hodnotyPříklad
body.jsonTělo odpovědi, ale jen když je to skutečně JSON.stringbody.json exists
body.json.pathDotaz do JSON těla výrazem JSONPath.jsonbody.json.path("$.status") eq "ok"
body.htmlTělo odpovědi, ale jen když je to skutečně HTML.stringbody.html exists
body.html.pathVýběr prvků stránky pomocí CSS selektoru.collectionbody.html.path("h1").first contains "Welcome"
body.regexShoda textu s regulárním výrazem a převzetí zachyceného.stringbody.regex("order-(?<id>\\d+)") exists
body.xmlTělo odpovědi, ale jen když je to skutečně XML.stringbody.xml exists
body.xml.pathDotaz do XML těla výrazem XPath.stringbody.xml.path("//item/@id") exists
body.html.aKaždý odkaz na stránce.collectionbody.html.a.count gt 0
body.html.linkKaždý <link>, který stránka deklaruje. Holá zmínka znamená cíle odkazů.collectionbody.html.link.count gt 0
body.html.scriptKaždý skript, který stránka načítá. Holá zmínka znamená zdroje skriptů.collectionbody.html.script.count gt 0
body.yamlTělo odpovědi, ale jen když je to skutečně YAML.stringbody.yaml exists
body.yaml.pathDotaz do YAML těla výrazem JSONPath.jsonbody.yaml.path("$.services.web.image") contains ":1."
body.html.regexShoda textu s regulárním výrazem a převzetí zachyceného.stringbody.regex("order-(?<id>\\d+)") exists
body.json.regexShoda textu s regulárním výrazem a převzetí zachyceného.stringbody.regex("order-(?<id>\\d+)") exists
body.xml.regexShoda textu s regulárním výrazem a převzetí zachyceného.stringbody.regex("order-(?<id>\\d+)") exists
body.yaml.regexShoda textu s regulárním výrazem a převzetí zachyceného.stringbody.regex("order-(?<id>\\d+)") exists

Detail z rodiny regexů, který stojí za zmínku: pojmenované zachytávací skupiny ((?<id>...)) uvnitř pravidla .regex(...) zapisují do jmenného prostoru vazeb v rámci dané kontroly, který pozdější pravidlo může přečíst zpátky pomocí bind("id") nebo podle pozice bind[0] - viz Zachycené hodnoty níže.

Zachycené hodnoty

Jeden subjekt žije ve vlastní skupině registru, protože nečte odpověď přímo - čte to, co z ní zachytilo dřívější pravidlo.

NázevCo to jeTyp/hodnotyPříklad
bindHodnota zachycená dřívějším regex pravidlem, podle jména zachycení nebo podle pozice.stringbind("id") gt 1000

Spárujte to s regex pravidlem dříve v seznamu: pravidlo jako body.regex("order-(?<id>\d+)") exists zachytí id objednávky pod jménem id, a pozdější pravidlo ho může otestovat pomocí bind("id") gt 1000, nebo u poziční (nepojmenované) zachytávky pomocí bind[0].

Časování

Jeden celkový čas plus rozpad podle fáze, takže upozornění "zpomalilo to" umí zároveň říct, která část zpomalila.

NázevCo to jeTyp/hodnotyPříklad
timeCelková doba odezvy: connect + TLS + čekání + stažení. Rozlišení DNS není zahrnuto.numbertime lt 2000
ttfb (rezervováno - zatím neplněno)Time to first byte.numberttfb lt 200
time.connectDoba potřebná k navázání TCP spojení.numbertime.connect lt 500
time.dataDoba potřebná ke stažení těla odpovědi.numbertime.data lt 1000
time.dnsDoba potřebná k překladu názvu domény. Není zahrnuta v holém subjektu time.numbertime.dns lt 200
time.headDoba čekání na hlavičky odpovědi.numbertime.head lt 500
time.tlsDoba potřebná pro TLS handshake.numbertime.tls lt 300

Holý subjekt time je connect + TLS + čekání na hlavičky + stažení těla. Rozlišení DNS je vyloučeno a žije jen v sesterském time.dns, protože DNS bývá často uložené v mezipaměti a jinak by stejný endpoint mezi jednotlivými kontrolami vypadal nekonzistentně rychle nebo pomalu.

Síť: DNS a spojení

dns a conn jsou v registru čisté jmenné prostory - skupina bez vlastní hodnoty, takže pravidlo nikdy nemůže skončit na holém jméně (editor i engine odmítnou řetězec, který skončí jen na dns nebo conn, a odkážou vás na skutečná pole níže).

NázevCo to jeTyp/hodnotyPříklad
connSíťové spojení, které kontrola navázala - adresa, jež odpověď obsloužila, a případná selhání spojení.string-
conn.failedKolik z přeložených adres se nepodařilo připojit.numberconn.failed eq 0
conn.failedIps (kandidát - zavádí se u agentů)Přeložené adresy, u kterých se připojení nepodařilo.collectionconn.failedIps.count eq 0
conn.ipIP adresa, která odpověď skutečně obsloužila.stringconn.ip eq "203.0.113.10"
conn.ip.family (kandidát - zavádí se u agentů)Zda byla odpověď doručena přes IPv4, nebo IPv6.stringconn.ip.family eq "IPv4"
dnsPřeklad DNS pro sledovaný název - na jaké adresy se přeložil a jaký server odpověděl.string-
dns.ipsVšechny IP adresy, na které se název domény během této kontroly přeložil.collectiondns.ips contains "1.2.3.4"
dns.serverDNS server, který na překlad odpověděl.stringdns.server eq "8.8.8.8"

TLS a certifikát

Stejně jako dns a conn, i tls a cert jsou čisté jmenné prostory - fakta o certifikátu a handshake žijí o úroveň níž.

NázevCo to jeTyp/hodnotyPříklad
cert.days.leftPočet dní, které zbývají do vypršení certifikátu webu.numbercert.days.left gt 14
certCertifikát, který server předložil - dny do vypršení, vydavatel a pole identity.string-
cert.daysPočet dní od vydání certifikátu.numbercert.days gt 0
cert.issuerCertifikační autorita, která certifikát webu vydala.stringcert.issuer contains "Let's Encrypt"
cert.sanNázvy domén, pro které je certifikát platný.collectioncert.san contains "www.example.com"
cert.serialSériové číslo certifikátu.stringcert.serial exists
cert.subject (rezervováno - zatím neplněno)Předmět certifikátu. Zatím se nezachytává - přijde s budoucí verzí agenta.stringcert.subject contains "example.com"
tlsTLS handshake zabezpečeného spojení - vyjednaná verze protokolu a šifra.string-
tls.cipherVyjednaná šifrová sada.stringtls.cipher contains "AES"
tls.protocolVyjednaná verze TLS.stringtls.protocol eq "Tls13"

cert.subject je zde uveden kvůli úplnosti, ale zatím není naplněn - co "rezervováno" v praxi znamená, popisuje sekce Poctivost níže. Každodenní pravidlo pro certifikát je cert.days.left gt 14, probrané v sekci hotových pravidel.

Subjekty skoků: pole uvnitř requests a redirects

requests a redirects jsou kolekce a každá položka je úplný záznam požadavku/odpovědi s vlastní zúženou sadou polí. Ne každý subjekt nejvyšší úrovně dává smysl na úrovni jednoho skoku (skok nemá vlastní certifikát), a jedno pole existuje jen na úrovni skoku: hstsHeader, hlavička Strict-Transport-Security daného požadavku v řetězci.

NázevCo to jeTyp/hodnotyPříklad
statusStavový kód tohoto požadavku v řetězci.numberstatus eq 200
urlURL adresa, na kterou tento požadavek směřoval.urlurl startsWith "https://"
headerHlavička odpovědi tohoto požadavku. Skok drží zúžený, jednohodnotový záznam hlavičky - predikáty pro seznamy (containsAny, containsAll, unique) platí jen na hlavičce finální odpovědi.stringheader("Content-Type") contains "json"
hstsHeaderHlavička Strict-Transport-Security tohoto požadavku.stringrequests[0].hstsHeader exists
setCookieHodnoty hlavičky Set-Cookie tohoto požadavku.collectionsetCookie exists
url.originalURL adresa, se kterou byla kontrola nastavena, před jakýmkoli přesměrováním. URL jako samotné url: má stejné části (url.original.host, .port, .path, .query, .scheme).urlurl.original.scheme eq "http"
url.hostČást URL adresy s hostitelem.stringurl.host eq "example.com"
url.portČást URL adresy s portem.numberurl.port eq 443
url.pathČást URL adresy s cestou.stringurl.path startsWith "/api"
url.queryŘetězec dotazu URL adresy.stringurl.query contains "token"
url.schemeSchéma URL adresy (http nebo https).stringurl.scheme eq "https"
url.original.hostČást URL adresy s hostitelem.stringurl.original.host eq "example.com"
url.original.portČást URL adresy s portem.numberurl.original.port eq 80
url.original.pathČást URL adresy s cestou.stringurl.original.path startsWith "/start"
url.original.queryŘetězec dotazu URL adresy.stringurl.original.query contains "utm_"
url.original.schemeSchéma URL adresy (http nebo https).stringurl.original.scheme eq "http"

header(...) na úrovni skoku drží zúžený, jednohodnotový záznam: predikáty tvaru seznamu jako containsAny nebo unique dávají smysl jen na úplné mapě hlaviček finální odpovědi, takže platí tam a ne na úrovni skoku. Obě kolekce znamenají něco jiného. requests je celý řetězec včetně finální odpovědi, která skutečně odpověděla, takže nikdy není prázdná ani u přímé 200, zatímco redirects jsou jen skoky následované po cestě, prázdné, když se nic nepřesměrovalo.

Rozsahy prvků: pole uvnitř jedné položky kolekce

Rozsah prvku je sada polí dostupná na JEDNÉ položce kolekce - poté, co do ní indexujete (requests[0]), nebo když ji filtrujete pomocí where(current. ...) (viz další sekce). Šest kolekcí nese vlastní rozsah prvku: čtyři kolekce HTML prvků sdílejí jeden tvar a requests/redirects sdílejí tvar subjektů skoku popsaný přímo výše.

Rozsah prvkuJak vypadá jedna položka
body.html.pathJeden prvek nalezený dotazem body.html.path("selector") CSS selektorem.
body.html.aJeden prvek <a> z body.html.a.
body.html.scriptJeden prvek <script> z body.html.script.
body.html.linkJeden prvek <link> z body.html.link.
requestsJeden požadavek v úplném řetězci (viz tabulka subjektů skoku výše).
redirectsJeden následovaný skok přesměrování (stejná pole jako requests, viz výše).

Sdílený tvar pro body.html.path(...), body.html.a, body.html.script a body.html.link - jeden řádek na odkaz, skript nebo prvek <link>:

NázevCo to jeTyp/hodnotyPříklad
urlCíl odkazu přesně tak, jak ho zapisuje markup.stringbody.html.a.url contains "/checkout"
textViditelný text prvku.stringbody.html.a.text contains "Sign in"
absoluteCíl odkazu přepočtený vůči URL adrese stránky na absolutní adresu - seznam URL adres, s dostupnými částmi URL na úrovni prvku (.host, .path, .port, .query, .scheme).urlbody.html.a.absolute.scheme in ["https"]
relAtribut rel daného prvku.stringbody.html.a.where(current.rel eq "nofollow").count eq 0
absolute.hostČást URL adresy s hostitelem.stringbody.html.a.absolute.host.unique.count le 3
absolute.portČást URL adresy s portem.numberbody.html.a.absolute.port in [443]
absolute.pathČást URL adresy s cestou.stringbody.html.a.absolute.path startsWith "/"
absolute.queryŘetězec dotazu URL adresy.stringbody.html.a.absolute.query not contains "session"
absolute.schemeSchéma URL adresy (http nebo https).stringbody.html.a.absolute.scheme in ["https"]

Před psaním pravidla nad těmito kolekcemi platí dvě výchozí nastavení. Holá zmínka body.html.a (nebo .script/.link) znamená její projekci .url, takže body.html.a.count gt 0 počítá hrefy, a uložené pravidlo se při zpětném čtení zobrazí s vypsaným .url, protože uložené pravidlo vždy uvádí přesně to, co vyhodnocuje. A .url je syrový atribut href přesně tak, jak ho zapsal markup, takže relativní odkaz zůstává relativní; .absolute je stejný odkaz přepočtený vůči vlastní URL adrese stránky, což se hodí při kontrole schématu nebo hostitele odchozích odkazů (body.html.a.absolute.scheme in ["https"]).

Operátory

Predikátová polovina každého pravidla: jaký test spustit proti subjektu. Všech 15 je sdílených napříč každým typem kontroly, a které se hodí ke konkrétnímu subjektu, závisí na jeho typu (stavový kód přijímá lt/gt, tělo přijímá contains, kolekce přijímá exists/unique/in).

NázevCo to jePlatí proPříklad
eqRovná se. Proti literálu json("…") / xml("…") / yaml("…") jde o PŘESNOU strukturální shodu: stejné klíče (v libovolném pořadí), pole ve stejném pořadí, stejné hodnoty.libovolný typbody.json eq json("{\"ok\": true}")
ltMenší než.číslatime lt 2000
leMenší nebo rovno.číslacert.days.left le 30
gtVětší než.číslabody.size gt 0
geVětší nebo rovno.číslastatus ge 500
containsObsahuje daný text - nad seznamem projde, když hodnota JE jednou z položek (přesná shoda; pro hledání uvnitř položek použijte matches). Proti literálu json("…") / xml("…") / yaml("…") jde o STRUKTURÁLNÍ obsažení: vše, co literál uvádí, musí být přítomné a shodovat se; odpověď může mít víc.text nebo seznambody.json contains json("{\"status\": \"ok\"}")
startsWithZačíná daným textem - nad seznamem, když to platí u KTERÉKOLI položky.texturl.path startsWith "/api"
endsWithKončí daným textem - nad seznamem, když to platí u KTERÉKOLI položky.texturl.path endsWith ".json"
matchesOdpovídá regulárnímu výrazu kdekoli v textu - nad seznamem, když to platí u KTERÉKOLI položky.textbody matches "order-\\d+"
containsAnyObsahuje alespoň jednu z uvedených hodnot (nad seznamem: nějaká položka se ROVNÁ jedné z nich).seznambody containsAny ["In stock", "Pre-order"]
containsAllObsahuje každou z uvedených hodnot (nad seznamem: každá hodnota se rovná nějaké položce - shody se mohou lišit).seznambody.html.a.text containsAll ["Home", "Contact"]
inJe jednou z uvedených hodnot nebo rozsahů - nad seznamem, platí to pro každou položku.hodnota(y) nebo rozsahstatus in [200, 301, 302]
existsSubjekt je přítomen.libovolný subjektheader("ETag") exists
isNumberHodnota se dá číst jako číslo.text nebo cokolibind("id") isNumber
uniqueSeznam nemá duplicity.seznamdns.ips unique

Dva operátory znamenají něco užšího, než jak znějí. contains nad seznamem je přesné členství: hodnota se musí rovnat celé jedné položce, ne se objevit jako podřetězec uvnitř jedné, takže pro chování podřetězce napříč prvky kolekce sáhněte po matches. A eq proti literálu json(...)/xml(...)/yaml(...) je úplná strukturální shoda (stejné klíče, pole ve stejném pořadí, stejné hodnoty), zatímco contains proti stejnému druhu literálu je strukturální obsažení: vše, co literál uvádí, musí být přítomné, ale skutečná odpověď může nést víc.

Reduktory

Reduktor zredukuje kolekci na jednu hodnotu a může se objevit jen na konci řetězce. Příklady níže používají requests.status, přirozeně číselnou kolekci, kterou tvoří subjekty HTTP, jako ilustraci; stejných osm reduktorů funguje nad jakoukoli číselnou kolekcí v jakémkoli typu kontroly (doby round-trip kontroly Ping, filtrovaná sada řádků databáze).

NázevCo zredukujePlatí proPříklad
countKolik položek seznam má.libovolná kolekcerequests.count le 2
minNejmenší číslo v seznamu.číselná kolekcerequests.status.min ge 200
maxNejvětší číslo v seznamu.číselná kolekcerequests.status.max lt 500
sumSoučet čísel v seznamu.číselná kolekcerequests.status.sum gt 0
avgPrůměr čísel v seznamu.číselná kolekcerequests.status.avg lt 300
firstPrvní položka seznamu.libovolná kolekceredirects.status.first eq 301
lastPoslední položka seznamu.libovolná kolekcerequests.status.last eq status
uniqueSeznam se zahozenými duplicitami.libovolná kolekcedns.ips.unique.count le 3

unique je přetížené a to, jak ho zapíšete, odlišuje oba významy. Zapsané jako operátor bez tečky (x unique) je to predikát, "tato kolekce nemá duplicity", a selže tak, že pojmenuje opakování. Zapsané jako reduktor s tečkou (x.unique) je to transformace, samotná kolekce bez duplicit, která pořád potřebuje něco za sebou (x.unique.count eq 1). Osamocené x.unique bez ničeho za sebou je syntaktická chyba, protože engine nedokáže uhodnout, který z obou významů jste měli na mysli.

Sugar

Sugar predikáty jsou zkratky, které engine rozbalí na běžné základní predikáty ještě předtím, než se pravidlo vůbec pošle agentovi - přidání sugar predikátu nestojí nic navíc (žádný balíček agenta, žádnou hranici verze), protože v okamžiku, kdy se dostane na drát, už vypadá jako obyčejné pravidlo. Kde sugar existuje, dávejte mu přednost: čte se lépe a je přesně rovnocenné ručnímu vypsání dlouhého tvaru.

NázevCo to znamenáPlatí proPříklad
isOkStav je kód úspěchu (200-299).status-
isRedirectStav je kód přesměrování (300-399).statusstatus isRedirect
isClientErrorStav je chyba klienta (400-499).statusstatus isClientError
isServerErrorStav je chyba serveru (500-599).statusstatus isServerError
isJsonObsah je skutečně JSON.dokument nebo text s media typeheader("Content-Type") isJson
isXmlObsah je skutečně XML - tělo se zpracuje jako XML, nebo hlavička pojmenovává XML media type.dokument nebo text s media typebody isXml
isHtmlObsah je skutečně HTML - tělo se zpracuje jako HTML, nebo hlavička pojmenovává HTML media type.dokument nebo text s media typebody isHtml
isFormMedia type pojmenovává kódování formuláře: application/x-www-form-urlencoded nebo multipart/form-data. Na rozdíl od isJson/isXml/isHtml zde neexistuje odpovídající namespace těla, takže to platí jen pro hodnotu media type, například hlavičku Content-Type.jen text s media typeheader("Content-Type") isForm
isEmptyNic tam není: prázdný text, nulová velikost nebo prázdný seznam.text, velikost nebo seznambody isEmpty
isNullHodnota je null.libovolná hodnotabody.json.path("$.deletedAt") isNull
absentSubjekt vůbec není přítomen.libovolný subjektheader("X-Debug") absent
betweenČíslo v uzavřeném rozsahu.čísla (2 operandy)body.size between 50 and 500kb

isJson/isXml/isHtml jsou záměrně citlivé na kontext, a to, na co je napíšete, rozhoduje, který význam platí. Napsané na samotném dokumentu (body isJson) znamenají "zpracovává se to jako daný formát", stejně jako body.json exists. Napsané na textové hodnotě, která pojmenovává media type, jako je hlavička (header("Content-Type") isJson), znamenají "pojmenovává tohle danou MIME rodinu"; které media types se počítají, viz MIME rodiny níže. isForm má jen ten druhý význam, protože žádný namespace body.form ke zpracování neexistuje, takže body isForm je statická chyba, ne pravidlo, které by prostě nikdy nebylo pravdivé.

Filtr where(...)

Ponechá jen prvky, které odpovídají, a pokračuje odtud dál. Je to jediná filtrovací konstrukce v jazyce a má přesně jeden tvar: where(current.<field> <condition> <value>).

Filtrování se liší od projekce: requests.url contains "cart" se ptá, zda takový skok existuje kdekoli v řetězci, zatímco requests.where(current.url contains "cart").status se ptá, co daný skok vrátil. Filtrování seznam nezredukuje, takže ho zakončete pomocí .first, kontrolou in [...], nebo .count. Jde jen o jednu úroveň a přijímá přesně jednu podmínku.

ČástCo pojmenováváPoznámky
current.<field>Pole každého filtrovaného prvku, zapsané za current.Toto je polovina, kterou lidé pletou nejčastěji: current.url je URL adresa jednotlivého skoku, ne finální odpovědi. Za current. mohou následovat jen vlastní pole prvku.
podmínkaJakýkoli běžný predikát, včetně not a nocaseJakákoli podmínka, která funguje na nejvyšší úrovni pravidla, funguje i zde.
hodnotaS čím se pole každého prvku porovnáváObvykle obyčejná hodnota. Subjekt zapsaný zde se čte z VNĚJŠÍ odpovědi, ne z prvku - where(current.url eq url.original) porovnává každý skok proti URL adrese, se kterou byla kontrola nastavena, a proto strana prvku musí current. uvést nahlas.

Příklad: requests.where(current.url contains "cart").status.first eq 301 - ponechá jen skoky, jejichž URL adresa obsahuje "cart", a pak se podívá na stav prvního, který se shodoval.

Ještě dva limity, oba vynucované parserem s vlastní chybovou zprávou: where nelze zanořit do jiného where, a jeho argument je přesně jedna podmínka, bez and/or uvnitř. Platí jen na kolekci, jejíž prvky nesou pojmenovaná pole (requests, body.html.a), ne na obyčejný projektovaný seznam jako dns.ips, kde není co pojmenovat pomocí current..

Referenční syntaxe

Všechno ostatní, co gramatika definuje: jak pravidlo pojmenovat, jak zapsat rozsahy a seznamy, co znamená holý subjekt, a drobné formy interpunkce, které se objevují napříč mnoha pravidly.

FormaCo děláDruhPříklad
wherePonechá jen prvky, které odpovídají, a pokračuje odtud dál.filtr kolekcerequests.where(current.url contains "cart").status.first eq 301
notNeguje podmínku, která následuje.příznakbody not contains "error"
nocasePorovná text bez ohledu na velikost písmen.příznakbody contains "welcome" nocase
currentUvnitř where(…) pojmenovává právě filtrovaný prvek.odkaz na prvek (uvnitř where)requests.where(current.status eq 301)
rangeRozsah čísel, OBĚ hranice VČETNĚ.rozsah číselstatus in [200..299]
listSeznam hodnot k porovnání.seznam hodnotstatus in [200, 301, 302]
docLiteralTypovaná hodnota dokumentu pro strukturální porovnání: text v uvozovkách se při uložení pravidla zpracuje jako JSON, XML nebo YAML.text json/xml/yamlbody.json contains json("{\"user\": {\"active\": true}}")
implicitExistsPravidlo, které pojmenovává jen subjekt, kontroluje, že je přítomen: pouhé zapsání body.json se uloží jako body.json exists.holý řádek subjektubody.json
indexVybere JEDNU položku seznamu podle pozice, počítáno od 0.celé číslo od 0requests[0].status
labelVolitelné jméno pravidla, zapsané před dvojtečkou.jméno před dvojtečkou"json ok": body.json exists
commentVše za # je poznámka pro vás samotné; na kontrolu to nemá vliv.text # na koncistatus isOk # the happy path

Několik z nich stojí za vysvětlení lidskou řečí. label dá pravidlu jméno, které se objeví v upozornění místo vykresleného výrazu; zapište ho před dvojtečku, jako v "json ok": body.json exists. implicitExists znamená, že řádek pojmenovávající jen subjekt a žádný predikát je zkratka za exists: zápis body.json se uloží jako body.json exists, a opětovné otevření pravidla ukáže vypsaný tvar. range a list jsou dva tvary, které může hodnota mít za in: rozsah ([200..299], obě hranice včetně) nebo výslovný seznam ([200, 301, 302]), a hodnota může být na kterékoli straně otevřená ([400..]). docLiteral je obal json(...)/xml(...)/yaml(...) použitý pro strukturální porovnání s tělem (probráno výše u Operátorů a v hotových pravidlech níže). index vybere jednu položku z kolekce podle pozice, od 0, stejně jako bind[0] čte poziční zachycení. current má význam jen uvnitř filtru where(...), probraného ve vlastní sekci výše.

Obálky: previous, delta a delta2

Tři formy, které se dívají zpátky místo jen na aktuální odpověď - každá vyžaduje plán se stavovými assercemi a každá je podrobně vysvětlená v sekci "Porovnání s předchozí kontrolou" níže.

NázevCo to jeTyp/hodnotyPříklad
delta (vyžaduje plán se stavovými assercemi)O kolik se číselná hodnota změnila od předchozí kontroly - volitelně jako rychlost za ms/s/m/h.numberdelta(body.size, h) lt 1mb
delta2 (vyžaduje plán se stavovými assercemi)Změna změny - zrychluje hodnota?numberdelta2(time) gt 0
previous (vyžaduje plán se stavovými assercemi)Hodnota, kterou tento subjekt měl při předchozí kontrole.libovolnýstatus eq previous.status

Příznaky: not a nocase

Dva modifikátory, které se připojují k pravidlu, místo aby samy stály jako subjekty nebo predikáty.

PříznakCo děláDruhPříklad
notNeguje podmínku, která následuje.příznak (připojuje se k pravidlu)body not contains "error"
nocasePorovná text bez ohledu na velikost písmen.příznak (připojuje se k pravidlu)body contains "welcome" nocase

not se skládá s predikátem, který následuje, místo aby negoval celé pravidlo jako celek - x not != y se čte jako x eq y, ne jako dvojitá negace. Když subjekt může úplně chybět, dejte přednost sugar absent před not exists: oba znamenají přesně totéž, ale absent to říká přímo. nocase něco mění jen u opravdu textového porovnání; editor (a tato reference) vám ho pořád dovolí napsat kdekoli, ale u číselného testu jako status eq 200 nocase tiše nic neznamená.

Rodiny MIME

Vyhledávací tabulky za isJson, isXml, isHtml a isForm, když se uplatní na hodnotu media type, jako je hlavička. Každá rodina odpovídá zjevnému media type nejvyšší úrovně plus, u JSON a XML, jakémukoli typu končícímu odpovídající strukturovanou příponou - což je to, co dělá z header("Content-Type") isJson něco, co správně projde i u application/problem+json nebo application/vnd.api+json, ne jen u obyčejného application/json.

RodinaOdpovídáPárový sugarPříklad
jsonapplication/json, text/json, nebo jakýkoli media type končící na +json (application/problem+json, application/vnd.api+json, application/ld+json, ...).sugar: isJsonheader("Content-Type") isJson
xmlapplication/xml, text/xml, nebo jakýkoli media type končící na +xml (image/svg+xml, application/atom+xml, ...).sugar: isXmlheader("Content-Type") isXml
htmltext/html nebo application/xhtml+xml.sugar: isHtmlheader("Content-Type") isHtml
formapplication/x-www-form-urlencoded nebo multipart/form-data.sugar: isFormheader("Content-Type") isForm

Porovnávání ignoruje vše od prvního ; dál (takže application/json; charset=utf-8 se pořád shoduje) a nerozlišuje velikost písmen.

Subjekty pro kontroly databáze, čítače, SNMP, portu a ping

Každý operátor, reduktor, sugar zkratka a forma syntaxe výše je identická pro těchto pět typů kontrol: engine registruje stejných 15 operátorů, 8 reduktorů, 12 sugar predikátů a 11 forem syntaxe pro všech šest typů bez výjimky. Co se liší podle typu, je seznam subjektů. Každý typ zpřístupňuje malou sadu subjektů unikátních pro to, co měří, plus podmnožinu síťových/časových/TLS subjektů už zdokumentovaných výše, přičemž se význam přizpůsobuje danému typu (u kontroly Database je time connect-plus-query, ne connect-plus-TLS-plus-download, protože žádnou HTTP odpověď nestahujete).

Kontroly databáze

Sdílí time, time.connect a time.dns se subjekty zdokumentovanými výše (přeškálováno na databázové spojení: connect-plus-query, překlad DNS hostitele databáze). Unikátní pro kontroly databáze:

NázevCo to jeTyp/hodnotyPříklad
scalarJediná hodnota, kterou dotaz vrátil (režim Scalar).libovolný-
rowsŘádky, které dotaz ovlivnil nebo vrátil (režim NonQuery).collection-
time.queryDoba, kterou zabral samotný dotaz.number-

Hotový příklad je v další sekci: pomocí rows.count ověřte, kolik řádků dotaz ovlivnil nebo vrátil, a pomocí scalar přímo zkontrolujte jedinou vrácenou hodnotu.

Kontroly čítače (Counter)

Sdílí time se subjekty zdokumentovanými výše - jako pole se stavem kandidát konkrétně pro kontroly Counter (doba round-trip požadavku čítače; co "kandidát" znamená, viz sekce Poctivost). Unikátní pro kontroly čítače:

NázevCo to jeTyp/hodnotyPříklad
valueNaměřená hodnota čítače.number-

Kontroly SNMP

Sdílí time a time.dns se subjekty zdokumentovanými výše (překlad názvu hostitele plus samotný požadavek SNMP). Unikátní pro kontroly SNMP:

NázevCo to jeTyp/hodnotyPříklad
time.requestDoba, kterou zabral požadavek SNMP.number-
valueHodnota, kterou dané OID vrátilo.libovolný-
value.type (kandidát - zavádí se u agentů)Název datového typu SNMP vrácené hodnoty.string-

value.type má stav kandidát; viz sekce Poctivost. Poznámka k dostupnosti: spínač Ověření odpovědi pro assertion mode se do editoru monitoru SNMP zatím nedostal. Ukazuje panel "Coming soon" s názvy těchto dvou subjektů místo funkčního seznamu pravidel. Samotné subjekty a vyhodnocovač pod nimi už jsou zaregistrované; čeká se jen na UI editoru SNMP.

Kontroly portu

Největší sdílený seznam ze všech ne-HTTP typů. Kontrola TCP portu nese v podstatě stejné subjekty spojení, DNS, TLS a certifikátu jako HTTP kontrola, protože i kontrola portu může vyjednávat TLS: bind, cert a jeho šest podpolí, conn a jeho čtyři podpole, dns a jeho dvě podpole, time/time.connect/time.dns/time.tls, a tls/tls.cipher/tls.protocol - všechny zdokumentované v sekcích výše se stejným významem. Unikátní pro kontroly portu:

NázevCo to jeTyp/hodnotyPříklad
bannerData přečtená ze soketu po připojení.string-
banner.hash (kandidát - zavádí se u agentů)Otisk banneru - porovnejte s previous.banner.hash pro zjištění změny služby.string-
banner.regexShoda textu s regulárním výrazem a převzetí zachyceného.stringbody.regex("order-(?<id>\\d+)") exists
banner.size (kandidát - zavádí se u agentů)Velikost banneru v bajtech.number-

banner.hash a banner.size mají stav kandidát - viz sekce Poctivost. banner.regex je dnes živé a funguje přesně jako body.regex(...) u HTTP kontroly: pojmenovaná zachycení plní stejný jmenný prostor bind(...).

Kontroly ping

Sdílí subjekty spojení a DNS se sekcemi výše: conn, conn.failed, conn.failedIps, conn.ip, conn.ip.family, dns, dns.ips, dns.server, time (zde průměrná doba round-trip úspěšných odpovědí) a time.dns. Unikátní pro kontroly ping:

NázevCo to jeTyp/hodnotyPříklad
lossProcento echo požadavků, na které nepřišla odpověď.numberloss eq 0
replyÚspěšné echo odpovědi.collection-
sentCount (kandidát - zavádí se u agentů)Kolik echo požadavků bylo odesláno.number-
time.maxDoba round-trip nejpomalejší odpovědi.number-
time.minDoba round-trip nejrychlejší odpovědi.number-
ttlTTL první úspěšné odpovědi - porovnejte s previous.ttl pro zjištění změny trasy.number-

sentCount má stav kandidát - viz sekce Poctivost. ttl stojí za znalost i mimo přísné pravidlo projde/neprojde: spárování s previous.ttl (viz Obálky výše) odhalí změnu trasy mezi kontrolami, protože time-to-live paketu při příchodu odráží, kolik skoků prošel.

Pravidla, která lidé skutečně chtějí psát

Stránka běží a skutečně říká to správné

Samotný stavový kód vám neřekne, že se stránka vykreslila správně - odpověď 200 s prázdnou kostrou je klasické tiché selhání, které kontrola založená jen na stavu přehlédne.

status isOk
body contains "Add to cart"

API odpovídá JSON a očekávaným polem

Zkontrolujte, že endpoint pořád mluví JSON, a pak do něj sáhněte. První řádek zachytí HTML chybovou stránku doručenou tam, kde má být JSON, běžný tvar výpadku za proxy; druhý zkontroluje vlastní hlášený stav zdraví API, ne jen jeho stav přenosu.

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

Odpověď zpomalila víc, než měla

Rozeberte to na části, když potřebujete vědět, co opravit, ne jen že je něco pomalé - time.connect, time.tls, time.dns a time.head rozdělí síťový čas, handshake, čas resolveru a čas aplikace.

time lt 2s

Přesměrování poslalo návštěvníky mimo vaši vlastní doménu

Porovná, kde kontrola skončila, proti URL adrese, kterou jste nastavili - selže ve chvíli, kdy řetězec přesměrování, ať už unesený, špatně nastavený, nebo jen změněný nasazením, skončí někde, kde jste to nezamýšleli.

url.host eq url.original.host

Stránka se od poslední kontroly změnila

Užitečné na obsahu, který má mezi kontrolami zůstat stabilní - ceník, podmínky, zveřejněné zásady - a zároveň to funguje jako základní signál napadení webu.

previous.body.hash eq body.hash

Číslo v rozsahu, zapsané zkráceně

Zachytí zároveň ořezanou i utrženou stránku v jediném pravidle, bez ručního vypisování explicitního rozsahu.

body.size between 50 and 500kb

Certifikát, kterému brzy vyprší platnost

Zdaleka nejběžnější TLS kontrola, a taková, kterou obyčejný monitor nahoře/dole nedokáže vyjádřit vůbec - certifikát, který dnes ještě prochází ověřením, ale příští týden vyprší, nedává žádné jiné varovné znamení. Spárujte ho s cert.issuer, pokud chcete zachytit i certifikát tiše vydaný nesprávnou autoritou.

cert.days.left gt 14

Databázový dotaz vracející špatný počet řádků

U kontroly Database je rows kolekce, kterou dotaz ovlivnil nebo vrátil - jejím spočítáním zachytíte dotaz, který má vrátit přesně jeden záznam účtu a tiše začne vracet nulu (smazáno, nebo rozbitý join) nebo víc než jeden (duplicita, která by neměla existovat).

rows.count eq 1

Hodnota SNMP unikající mimo rozsah

Zařízení SNMP, které vůbec odpoví, není totéž jako zařízení, které je zdravé - sledované OID (využití disku, hloubka fronty, teplota) může vystoupat daleko za bezpečný práh, zatímco samotné zařízení zůstává naprosto dostupné. Porovnání dotázané value proti rozsahu zachytí to, co obyčejná kontrola dostupnosti nedokáže.

value lt 90

TCP služba odpovídající nesprávným bannerem

Port, který přijímá spojení, není totéž jako správná služba na něm naslouchající - zaseklý proces, špatně nastavená proxy nebo downgradovaná či nahrazená služba stále dokážou dokončit TCP handshake. Přečtení uvítacího textu, který služba pošle hned po připojení (banner SMTP, FTP nebo podobné služby), zachytí to, co obyčejná kontrola otevřeného portu nedokáže.

banner contains "220"

Porovnání s předchozí kontrolou

Hrstka subjektů se dívá dozadu místo jen na aktuální odpověď: napište previous. před subjekt, abyste přečetli, jakou měl hodnotu při poslední kontrole, nebo ho obalte do delta(...), abyste dostali rozdíl mezi tehdy a teď, nebo do delta2(...), abyste dostali změnu té změny - užitečné pro odhalení hodnoty, která zrychluje, místo aby jen driftovala (doba odezvy, která s každou kontrolou roste rychleji). previous.body.hash eq body.hash výše je přesně tohle - "shoduje se otisk těla s tím, jaký byl minule." delta(body.size, h) čte změnu jako rychlost za hodinu místo syrového rozdílu, pro hodnoty, u kterých čekáte plynulý růst, ne skok.

Když takové pravidlo poběží poprvé, nemá s čím porovnávat, takže se přeskočí místo aby selhalo: kontrola se označí jako "zahřívá se", ne jako rozbitá, a přidání pravidla nevyvolá žádné falešné upozornění. Zahřívání platí jen tehdy, když je aktuální čtení v pořádku a chybí základní hodnota. Pokud samotné aktuální čtení selže (řekněme, tělo tentokrát není platný JSON), pravidlo selže přesně stejně, jako by selhala jeho obyčejná verze bez previous.. Takové pravidlo navíc potřebuje, aby se hodnota mezi kontrolami měnila, což ho dělá bezvýznamným u metody kontroly, která nikdy neposouvá stav, například u požadavku HEAD.

Porovnání s předchozí kontrolou vyžaduje vyšší úroveň plánu; bez ní se tyto subjekty v editoru zobrazují prošedlé s vysvětlením.

Limity, a co záměrně chybí

Kolik pravidel můžete přidat, závisí na vašem plánu, zobrazeném jako živé počítadlo vedle "Přidat pravidlo." Engine navíc na každou kontrolu vynucuje absolutní strop bez ohledu na plán, jde o pojistku proti zneužití, ne o omezení běžného použití: kontrola s počtem pravidel byť jen blízkým tomuto stropu by už byla neobvykle velká.

Neexistuje způsob, jak pro pravidlo napsat vlastní JavaScript, a nikdy nebude. Každé pravidlo se skládá z pevné, pojmenované slovní zásoby subjektů a predikátů místo z otevřeného skriptovacího sandboxu, což pravidlo udrží čitelné na první pohled a bezpečné pro běh na každém monitorovacím agentovi po celém světě.

Ne každé pravidlo funguje všude ve chvíli, kdy ho napíšete: některé novější podmínky potřebují nedávnou verzi monitorovacího agenta, který kontrolu spouští, takže se nová schopnost dostane ke každé kontrole na vašem účtu postupně, jak se agenti na pozadí aktualizují. Pravidla postavená na stabilním jádru jazyka to neovlivní.

Hrstka položek v této referenci ještě není plně živá, a každá z nich je v tabulce výše označena:

  • Rezervováno (deklarováno, zatím nenaplněno žádným agentem): ttfb, httpVersion, cert.subject.
  • Kandidát (už se zavádí, zatím ne u každého agenta): conn.ip.family a conn.failedIps u kontrol HTTP, Port a Ping, value.type u kontrol SNMP, banner.hash a banner.size u kontrol Port, sentCount u kontrol Ping, a vlastní time kontroly Counter.
  • Zatím nedostupné: steps, rezervováno pro budoucí vícekrokový typ kontroly.
  • Vyžaduje plán se stavovými assercemi: celá rodina obalů previous / delta / delta2, u každého typu kontroly.

Všechno ostatní v této referenci je dnes živé na každém plánu, který má assertion mode.

Kde assertion mode dnes funguje

Spínač Ověření odpovědi pro assertion mode se objevuje u monitorů HTTP (webová stránka) a API, které sdílejí stejný editor pravidel i syntaxi. Stejný jazyk a vyhodnocovač už na úrovni protokolu běží i pod kontrolami Database, Counter, Port, Ping a SNMP: registr výše obsluhuje všech šest typů kontrol, a pravidlo uložené pro jeden typ se čte stejně, pokud se režim později dostane i do editoru jiného typu.

SNMP ukazuje nejjasnější náhled: jeho editor už má panel Assertion rules pojmenovávající value a value.type, s popiskem "Coming soon", zatím bez funkčního seznamu pravidel za ním. Kontroly Database, Counter a Ping neukazují panel assertion mode vůbec, i když jsou jejich subjekty v enginu pod tím stejně živé.

Nastavení skutečné kontroly

Pokud ověřujete REST API místo obyčejné webové stránky, začněte u ověření odpovědi API, které pokrývá dostupnost, dobu odezvy i tělo vašeho vlastního API dohromady. U stránky nebo webu, který musí zůstat dostupný a odpovídat správně odevšad, kde jsou vaši uživatelé, je globální monitoring dostupnosti z více než 300 lokalit širší obraz, do kterého assertion mode zapadá. Chcete-li pravidla nastavovat kódem místo panelu, vlastní API v2 HostTracker vytváří a aktualizuje assertion pravidla monitoru stejně jako editor. Pro pravidlo o vypršení certifikátu výše a všechno ostatní kolem TLS pokrývá monitoring domény a TLS certifikátu typ kontroly, na kterém cert.days.left a ostatní TLS subjekty žijí. Chcete-li hned teď sledovat vyhodnocení jednoho pravidla proti skutečné URL adrese, bez účtu, použijte bezplatný nástroj pro HTTP kontrolu. U stavových kódů, se kterými subjekt status porovnává, začněte u 200 OK, a návody k monitoringu pokrývají nastavení každého typu kontroly, pod kterým tento jazyk běží.

Časté dotazy

Co se stane s mým starým nastavením stavového kódu a klíčových slov, když zapnu assertion mode?

Dokud je režim zapnutý, nahradí je seznam pravidel. Jeho opětovné vypnutí před uložením vrátí klasická pole přesně tak, jak byla: nic se nemaže, oba režimy prostě nemohou být aktivní zároveň.

Můžu v jednom monitoru zkombinovat více podmínek?

Ano: musí projít každé pravidlo v seznamu. Mezi jednotlivými pravidly zatím žádné "OR" neexistuje, takže pro přijetí jedné z několika hodnot použijte jedno pravidlo s in [...] nebo containsAny [...].

Umožní mi assertion mode někdy napsat vlastní skript?

Ne. Každé pravidlo se skládá z pevné sady subjektů a predikátů jazyka. Žádný vlastní JavaScript, záměrně.

Co se stane, když poprvé přidám pravidlo, které porovnává s předchozí kontrolou?

Zatím nemá s čím porovnávat, takže se označí jako zahřívající se a přeskočí místo aby selhalo. Přidání pravidla "změnilo se tohle" samo o sobě nikdy nevyvolá falešné upozornění.

Potřebuji konkrétní plán, abych mohl assertion mode používat?

Samotný režim a každodenní pravidla (stav, tělo, hlavičky, časování, přesměrování) jsou dostupné široce; kolik pravidel můžete přidat najednou, závisí na vašem plánu a zobrazuje se živě v editoru. Pravidla, která porovnávají s předchozí kontrolou (previous, delta, delta2), potřebují vyšší úroveň plánu a jsou prošedlená s vysvětlením.

Funguje assertion mode u monitorů API stejně jako u monitorů webových stránek?

Ano. Monitory HTTP a API sdílejí stejný editor pravidel, subjekty i predikáty, a pravidlo napsané pro jeden se u druhého čte identicky.

Co vlastně dělá where(...) a kdy ho potřebuji?

Zredukuje kolekci na prvky odpovídající podmínce ještě předtím, než přečtete pole výsledku. Použijte ho, když obyčejná projekce jako requests.status není dost konkrétní a potřebujete jeden konkrétní skok, odkaz nebo prvek místo celé kolekce (viz sekce výše).

Můžu dnes napsat pravidlo proti databázovému dotazu, hodnotě SNMP, banneru portu nebo výsledku ping?

Jazyk i vyhodnocovač je všechny podporují a tabulky subjektů výše pokrývají každý z nich. Editor pravidel ne: spínač Ověření odpovědi dnes ukazují jen monitory HTTP a API. SNMP ukazuje náhled "Coming soon" svých dvou subjektů, a Database, Counter a Ping neukazují panel assertion mode vůbec.

Proč u některých subjektů v této referenci stojí "rezervováno" nebo "kandidát" místo prostého uvedení v seznamu?

"Rezervováno" znamená, že pole je v registru deklarované, ale zatím ho žádný agent neplní; "kandidát" znamená, že se zavádí u agentů, ale ještě se nedostalo ke všem. Obojí je označené všude, kde se v této referenci objeví, i v souhrnném seznamu v sekci Limity výše.

Zkontrolovat hned

Spusťte bezplatnou kontrolu na svém webu - bez registrace.

Web api validation

Sledovat trvale

Dostanete upozornění ve chvíli, kdy něco přestane fungovat: HostTracker kontroluje z více než 300 lokalit a upozorní vás e-mailem, SMS, přes Slack, Telegram a další.

Funkce HostTracker

Více v této sekci: Návody k monitoringu: každý typ kontroly krok za krokem