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.

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:

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:
| Subjekt | Co to je | Příklad |
|---|---|---|
status | HTTP stavový kód finální odpovědi, po následování přesměrování | status isOk |
body | Tělo odpovědi jako prostý text | body contains "Add to cart" |
body.json / body.xml / body.html / body.yaml | Tělo, ale jen když se skutečně dá zpracovat jako daný formát - jinak subjekt jednoduše není přítomen | body.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.hash | Velikost odpovědi v bajtech a otisk obsahu těla | body.size gt 1kb |
header("Name") | Jedna hlavička odpovědi, vyhledaná podle jména | header("Content-Type") isJson |
time a time.connect / time.tls / time.dns / time.head | Celková doba odezvy a její síťová fáze, fáze TLS handshake, DNS a přemýšlecí čas serveru | time lt 2s |
redirects / requests | Skoky, 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čila | url.scheme eq "https" |
cert.days.left | Počet dní, které zbývají do vypršení TLS certifikátu | cert.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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
body | Tělo odpovědi jako dekódovaný text. | string | body contains "Welcome" |
header | Jedna hlavička finální odpovědi, podle jména. | string | header("Content-Type") isJson |
redirects | Přeskoky přesměrování, které byly následovány - řetězec požadavků bez svého posledního prvku. | collection | redirects.count eq 0 |
status | HTTP stavový kód finální odpovědi, po následování přesměrování. | number | status isOk |
body.size | Velikost staženého těla v bajtech. | number | body.size lt 500000 |
url | URL 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). | url | url.host eq "www.example.com" |
requests | Každý požadavek, který tato kontrola provedla, v pořadí - přeskoky přesměrování a pak finální požadavek. | collection | requests.count le 2 |
url.host | Část URL adresy s hostitelem. | string | url.host eq "example.com" |
url.path | Část URL adresy s cestou. | string | url.path startsWith "/api" |
url.port | Část URL adresy s portem. | number | url.port eq 443 |
url.query | Řetězec dotazu URL adresy. | string | url.query contains "token" |
url.scheme | Schéma URL adresy (http nebo https). | string | url.scheme eq "https" |
body.hash | Otisk těla odpovědi - porovnejte ho s previous.body.hash pro zjištění změny obsahu. | string | body.hash eq previous.body.hash |
httpVersion (rezervováno - zatím neplněno) | Vyjednaná verze HTTP. | string | httpVersion eq "HTTP/2" |
setCookie | Hodnoty Set-Cookie finální odpovědi, jedna položka na cookie - shodu hledejte pomocí contains nebo matches, spočítejte je pomocí .count. | collection | setCookie exists |
steps (zatím nedostupné) | Kroky vícekrokové kontroly. Zatím nedostupné. | collection | steps.count le 1 |
url.original | URL 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). | url | url.original.scheme eq "http" |
url.original.host | Část URL adresy s hostitelem. | string | url.original.host eq "example.com" |
url.original.path | Část URL adresy s cestou. | string | url.original.path startsWith "/start" |
url.original.port | Část URL adresy s portem. | number | url.original.port eq 80 |
url.original.query | Řetězec dotazu URL adresy. | string | url.original.query contains "utm_" |
url.original.scheme | Schéma URL adresy (http nebo https). | string | url.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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
body.json | Tělo odpovědi, ale jen když je to skutečně JSON. | string | body.json exists |
body.json.path | Dotaz do JSON těla výrazem JSONPath. | json | body.json.path("$.status") eq "ok" |
body.html | Tělo odpovědi, ale jen když je to skutečně HTML. | string | body.html exists |
body.html.path | Výběr prvků stránky pomocí CSS selektoru. | collection | body.html.path("h1").first contains "Welcome" |
body.regex | Shoda textu s regulárním výrazem a převzetí zachyceného. | string | body.regex("order-(?<id>\\d+)") exists |
body.xml | Tělo odpovědi, ale jen když je to skutečně XML. | string | body.xml exists |
body.xml.path | Dotaz do XML těla výrazem XPath. | string | body.xml.path("//item/@id") exists |
body.html.a | Každý odkaz na stránce. | collection | body.html.a.count gt 0 |
body.html.link | Každý <link>, který stránka deklaruje. Holá zmínka znamená cíle odkazů. | collection | body.html.link.count gt 0 |
body.html.script | Každý skript, který stránka načítá. Holá zmínka znamená zdroje skriptů. | collection | body.html.script.count gt 0 |
body.yaml | Tělo odpovědi, ale jen když je to skutečně YAML. | string | body.yaml exists |
body.yaml.path | Dotaz do YAML těla výrazem JSONPath. | json | body.yaml.path("$.services.web.image") contains ":1." |
body.html.regex | Shoda textu s regulárním výrazem a převzetí zachyceného. | string | body.regex("order-(?<id>\\d+)") exists |
body.json.regex | Shoda textu s regulárním výrazem a převzetí zachyceného. | string | body.regex("order-(?<id>\\d+)") exists |
body.xml.regex | Shoda textu s regulárním výrazem a převzetí zachyceného. | string | body.regex("order-(?<id>\\d+)") exists |
body.yaml.regex | Shoda textu s regulárním výrazem a převzetí zachyceného. | string | body.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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
bind | Hodnota zachycená dřívějším regex pravidlem, podle jména zachycení nebo podle pozice. | string | bind("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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
time | Celková doba odezvy: connect + TLS + čekání + stažení. Rozlišení DNS není zahrnuto. | number | time lt 2000 |
ttfb (rezervováno - zatím neplněno) | Time to first byte. | number | ttfb lt 200 |
time.connect | Doba potřebná k navázání TCP spojení. | number | time.connect lt 500 |
time.data | Doba potřebná ke stažení těla odpovědi. | number | time.data lt 1000 |
time.dns | Doba potřebná k překladu názvu domény. Není zahrnuta v holém subjektu time. | number | time.dns lt 200 |
time.head | Doba čekání na hlavičky odpovědi. | number | time.head lt 500 |
time.tls | Doba potřebná pro TLS handshake. | number | time.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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
conn | Síťové spojení, které kontrola navázala - adresa, jež odpověď obsloužila, a případná selhání spojení. | string | - |
conn.failed | Kolik z přeložených adres se nepodařilo připojit. | number | conn.failed eq 0 |
conn.failedIps (kandidát - zavádí se u agentů) | Přeložené adresy, u kterých se připojení nepodařilo. | collection | conn.failedIps.count eq 0 |
conn.ip | IP adresa, která odpověď skutečně obsloužila. | string | conn.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. | string | conn.ip.family eq "IPv4" |
dns | Překlad DNS pro sledovaný název - na jaké adresy se přeložil a jaký server odpověděl. | string | - |
dns.ips | Všechny IP adresy, na které se název domény během této kontroly přeložil. | collection | dns.ips contains "1.2.3.4" |
dns.server | DNS server, který na překlad odpověděl. | string | dns.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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
cert.days.left | Počet dní, které zbývají do vypršení certifikátu webu. | number | cert.days.left gt 14 |
cert | Certifikát, který server předložil - dny do vypršení, vydavatel a pole identity. | string | - |
cert.days | Počet dní od vydání certifikátu. | number | cert.days gt 0 |
cert.issuer | Certifikační autorita, která certifikát webu vydala. | string | cert.issuer contains "Let's Encrypt" |
cert.san | Názvy domén, pro které je certifikát platný. | collection | cert.san contains "www.example.com" |
cert.serial | Sériové číslo certifikátu. | string | cert.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. | string | cert.subject contains "example.com" |
tls | TLS handshake zabezpečeného spojení - vyjednaná verze protokolu a šifra. | string | - |
tls.cipher | Vyjednaná šifrová sada. | string | tls.cipher contains "AES" |
tls.protocol | Vyjednaná verze TLS. | string | tls.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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
status | Stavový kód tohoto požadavku v řetězci. | number | status eq 200 |
url | URL adresa, na kterou tento požadavek směřoval. | url | url startsWith "https://" |
header | Hlavič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. | string | header("Content-Type") contains "json" |
hstsHeader | Hlavička Strict-Transport-Security tohoto požadavku. | string | requests[0].hstsHeader exists |
setCookie | Hodnoty hlavičky Set-Cookie tohoto požadavku. | collection | setCookie exists |
url.original | URL 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). | url | url.original.scheme eq "http" |
url.host | Část URL adresy s hostitelem. | string | url.host eq "example.com" |
url.port | Část URL adresy s portem. | number | url.port eq 443 |
url.path | Část URL adresy s cestou. | string | url.path startsWith "/api" |
url.query | Řetězec dotazu URL adresy. | string | url.query contains "token" |
url.scheme | Schéma URL adresy (http nebo https). | string | url.scheme eq "https" |
url.original.host | Část URL adresy s hostitelem. | string | url.original.host eq "example.com" |
url.original.port | Část URL adresy s portem. | number | url.original.port eq 80 |
url.original.path | Část URL adresy s cestou. | string | url.original.path startsWith "/start" |
url.original.query | Řetězec dotazu URL adresy. | string | url.original.query contains "utm_" |
url.original.scheme | Schéma URL adresy (http nebo https). | string | url.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 prvku | Jak vypadá jedna položka |
|---|---|
body.html.path | Jeden prvek nalezený dotazem body.html.path("selector") CSS selektorem. |
body.html.a | Jeden prvek <a> z body.html.a. |
body.html.script | Jeden prvek <script> z body.html.script. |
body.html.link | Jeden prvek <link> z body.html.link. |
requests | Jeden požadavek v úplném řetězci (viz tabulka subjektů skoku výše). |
redirects | Jeden 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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
url | Cíl odkazu přesně tak, jak ho zapisuje markup. | string | body.html.a.url contains "/checkout" |
text | Viditelný text prvku. | string | body.html.a.text contains "Sign in" |
absolute | Cí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). | url | body.html.a.absolute.scheme in ["https"] |
rel | Atribut rel daného prvku. | string | body.html.a.where(current.rel eq "nofollow").count eq 0 |
absolute.host | Část URL adresy s hostitelem. | string | body.html.a.absolute.host.unique.count le 3 |
absolute.port | Část URL adresy s portem. | number | body.html.a.absolute.port in [443] |
absolute.path | Část URL adresy s cestou. | string | body.html.a.absolute.path startsWith "/" |
absolute.query | Řetězec dotazu URL adresy. | string | body.html.a.absolute.query not contains "session" |
absolute.scheme | Schéma URL adresy (http nebo https). | string | body.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ázev | Co to je | Platí pro | Příklad |
|---|---|---|---|
eq | Rovná 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ý typ | body.json eq json("{\"ok\": true}") |
lt | Menší než. | čísla | time lt 2000 |
le | Menší nebo rovno. | čísla | cert.days.left le 30 |
gt | Větší než. | čísla | body.size gt 0 |
ge | Větší nebo rovno. | čísla | status ge 500 |
contains | Obsahuje 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 seznam | body.json contains json("{\"status\": \"ok\"}") |
startsWith | Začíná daným textem - nad seznamem, když to platí u KTERÉKOLI položky. | text | url.path startsWith "/api" |
endsWith | Končí daným textem - nad seznamem, když to platí u KTERÉKOLI položky. | text | url.path endsWith ".json" |
matches | Odpovídá regulárnímu výrazu kdekoli v textu - nad seznamem, když to platí u KTERÉKOLI položky. | text | body matches "order-\\d+" |
containsAny | Obsahuje alespoň jednu z uvedených hodnot (nad seznamem: nějaká položka se ROVNÁ jedné z nich). | seznam | body containsAny ["In stock", "Pre-order"] |
containsAll | Obsahuje každou z uvedených hodnot (nad seznamem: každá hodnota se rovná nějaké položce - shody se mohou lišit). | seznam | body.html.a.text containsAll ["Home", "Contact"] |
in | Je jednou z uvedených hodnot nebo rozsahů - nad seznamem, platí to pro každou položku. | hodnota(y) nebo rozsah | status in [200, 301, 302] |
exists | Subjekt je přítomen. | libovolný subjekt | header("ETag") exists |
isNumber | Hodnota se dá číst jako číslo. | text nebo cokoli | bind("id") isNumber |
unique | Seznam nemá duplicity. | seznam | dns.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ázev | Co zredukuje | Platí pro | Příklad |
|---|---|---|---|
count | Kolik položek seznam má. | libovolná kolekce | requests.count le 2 |
min | Nejmenší číslo v seznamu. | číselná kolekce | requests.status.min ge 200 |
max | Největší číslo v seznamu. | číselná kolekce | requests.status.max lt 500 |
sum | Součet čísel v seznamu. | číselná kolekce | requests.status.sum gt 0 |
avg | Průměr čísel v seznamu. | číselná kolekce | requests.status.avg lt 300 |
first | První položka seznamu. | libovolná kolekce | redirects.status.first eq 301 |
last | Poslední položka seznamu. | libovolná kolekce | requests.status.last eq status |
unique | Seznam se zahozenými duplicitami. | libovolná kolekce | dns.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ázev | Co to znamená | Platí pro | Příklad |
|---|---|---|---|
isOk | Stav je kód úspěchu (200-299). | status | - |
isRedirect | Stav je kód přesměrování (300-399). | status | status isRedirect |
isClientError | Stav je chyba klienta (400-499). | status | status isClientError |
isServerError | Stav je chyba serveru (500-599). | status | status isServerError |
isJson | Obsah je skutečně JSON. | dokument nebo text s media type | header("Content-Type") isJson |
isXml | Obsah je skutečně XML - tělo se zpracuje jako XML, nebo hlavička pojmenovává XML media type. | dokument nebo text s media type | body isXml |
isHtml | Obsah je skutečně HTML - tělo se zpracuje jako HTML, nebo hlavička pojmenovává HTML media type. | dokument nebo text s media type | body isHtml |
isForm | Media 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 type | header("Content-Type") isForm |
isEmpty | Nic tam není: prázdný text, nulová velikost nebo prázdný seznam. | text, velikost nebo seznam | body isEmpty |
isNull | Hodnota je null. | libovolná hodnota | body.json.path("$.deletedAt") isNull |
absent | Subjekt vůbec není přítomen. | libovolný subjekt | header("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.
| Část | Co 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ínka | Jakýkoli běžný predikát, včetně not a nocase | Jakákoli podmínka, která funguje na nejvyšší úrovni pravidla, funguje i zde. |
| hodnota | S čí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.
| Forma | Co dělá | Druh | Příklad |
|---|---|---|---|
where | Ponechá jen prvky, které odpovídají, a pokračuje odtud dál. | filtr kolekce | requests.where(current.url contains "cart").status.first eq 301 |
not | Neguje podmínku, která následuje. | příznak | body not contains "error" |
nocase | Porovná text bez ohledu na velikost písmen. | příznak | body contains "welcome" nocase |
current | Uvnitř where(…) pojmenovává právě filtrovaný prvek. | odkaz na prvek (uvnitř where) | requests.where(current.status eq 301) |
range | Rozsah čísel, OBĚ hranice VČETNĚ. | rozsah čísel | status in [200..299] |
list | Seznam hodnot k porovnání. | seznam hodnot | status in [200, 301, 302] |
docLiteral | Typovaná 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/yaml | body.json contains json("{\"user\": {\"active\": true}}") |
implicitExists | Pravidlo, které pojmenovává jen subjekt, kontroluje, že je přítomen: pouhé zapsání body.json se uloží jako body.json exists. | holý řádek subjektu | body.json |
index | Vybere JEDNU položku seznamu podle pozice, počítáno od 0. | celé číslo od 0 | requests[0].status |
label | Volitelné jméno pravidla, zapsané před dvojtečkou. | jméno před dvojtečkou | "json ok": body.json exists |
comment | Vše za # je poznámka pro vás samotné; na kontrolu to nemá vliv. | text # na konci | status 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ázev | Co to je | Typ/hodnoty | Pří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. | number | delta(body.size, h) lt 1mb |
delta2 (vyžaduje plán se stavovými assercemi) | Změna změny - zrychluje hodnota? | number | delta2(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říznak | Co dělá | Druh | Příklad |
|---|---|---|---|
not | Neguje podmínku, která následuje. | příznak (připojuje se k pravidlu) | body not contains "error" |
nocase | Porovná 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.
| Rodina | Odpovídá | Párový sugar | Příklad |
|---|---|---|---|
json | application/json, text/json, nebo jakýkoli media type končící na +json (application/problem+json, application/vnd.api+json, application/ld+json, ...). | sugar: isJson | header("Content-Type") isJson |
xml | application/xml, text/xml, nebo jakýkoli media type končící na +xml (image/svg+xml, application/atom+xml, ...). | sugar: isXml | header("Content-Type") isXml |
html | text/html nebo application/xhtml+xml. | sugar: isHtml | header("Content-Type") isHtml |
form | application/x-www-form-urlencoded nebo multipart/form-data. | sugar: isForm | header("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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
scalar | Jediná hodnota, kterou dotaz vrátil (režim Scalar). | libovolný | - |
rows | Řádky, které dotaz ovlivnil nebo vrátil (režim NonQuery). | collection | - |
time.query | Doba, 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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
value | Naměř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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
time.request | Doba, kterou zabral požadavek SNMP. | number | - |
value | Hodnota, 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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
banner | Data 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.regex | Shoda textu s regulárním výrazem a převzetí zachyceného. | string | body.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ázev | Co to je | Typ/hodnoty | Příklad |
|---|---|---|---|
loss | Procento echo požadavků, na které nepřišla odpověď. | number | loss 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.max | Doba round-trip nejpomalejší odpovědi. | number | - |
time.min | Doba round-trip nejrychlejší odpovědi. | number | - |
ttl | TTL 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.familyaconn.failedIpsu kontrol HTTP, Port a Ping,value.typeu kontrol SNMP,banner.hashabanner.sizeu kontrol Port,sentCountu kontrol Ping, a vlastnítimekontroly 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.