Assertion Modu: Tam Yanıt Doğrulama Referansı
Assertion modu, bir monitörün sabit geçti/kaldı alanlarını, her biri yanıt hakkında tam olarak neyin doğru olması gerektiğini adlandıran, kendi yazdığınız bir kural listesiyle değiştirir. Çoğu çalışma süresi monitörü bir kontrolü bir avuç sabit alanla değerlendirir: "down" sayılan bir durum kodu, yok sayılacak bir durum listesi, belki gövdede bir yerde görünmesi gereken bir anahtar sözcük. Bu alanlar, eksik bir kaynak için meşru olarak 404 yanıtlayan bir API'yi, veritabanı zaman aşımına uğradığı için boş bir kabukla 200 döndüren bir sayfayı, veya başkasının alan adı üzerinden yönlendirmeye başlayan bir yönlendirme zincirini ifade edemez.
HostTracker'ın assertion modu, bu sabit alanları, monitör düzenleyicinin içinde kural kural kendi yazdığınız küçük bir kural diliyle değiştirir. Her kural, yanıt hakkında tam olarak neyin doğru olması gerektiğini söyler: durum, gövdenin bir parçası, bir başlık, ne kadar sürdüğü, bir yönlendirmenin nerede sona erdiği. Bir kontrol yalnızca kurallarınızdan biri başarısız olduğunda başarısız olur. Bu, bir web sitesi, bir REST API, bir veritabanı sorgusu, bir TCP portu, bir Ping hedefi, bir SNMP sayacı veya genel bir Counter kontrolü için aynı dildir: bir özne kümesi, bir yüklem kümesi, modun göründüğü her yerde yeniden kullanılır. Bu rehber, motorun uyguladığı her özneyi, operatörü, indirgeyiciyi, kısayolu ve söz dizimi biçimini kapsar.
Assertion modunun yerini aldığı şey
Klasik Response Validation alanları, assertion modu kapalıyken hala oradadır: beklenen bir durum aralığı, yok sayılacak bir durum listesi, bulunması (veya bulunmaması) gereken bir anahtar sözcük. Mod, bu sabit kümeyi kendi oluşturduğunuz bir kural listesiyle değiştiren bir düğmedir, ve kaydetmeden önce tekrar kapatmak klasik alanları olduğu gibi geri getirir. Hiçbir monitör kalıcı olarak tek bir moda kilitlenmez.
Tür başına bir yığın araç yerine tek bir dil bir araya gelir. "JSON olmalı ve bir alan içermeli" kontrolü, "hala 'Add to cart' demeli" kontrolü ve "yavaşlamamış olmalı" kontrolü, aynı sözdiziminde, aynı listede, her biri kendi başına geçen veya kalan üç kuraldır.
Açma
Assertion modu, HTTP (web sitesi) ve API monitörleri için monitör düzenleyicinin Response Validation bölümünde yaşar. Düğmeyi çevirin, ve klasik alanların yerini, bir "Add rule" düğmesi ve planınızın sınırına karşı kaç kural kullandığınızı gösteren canlı bir sayaç taşıyan, numaralandırılmış bir kural listesi alır.

Her kural, siz onu oluştururken doğrulanır: henüz bitmemiş bir kural kendine özgü bir "unfinished" durumu taşır, ve düzenleyicinin değerlendirebildiği bir kural tamamlanmış olarak işaretlenir. Her kuralın ayrıca, yalnızca kutudan kutuya görünüm yerine tam ifadeyi okuyabilmeniz veya kopyalayabilmeniz için düz metin kaynak biçimini açan küçük bir </> düğmesi vardır.
Zihinsel model: özne, yüklem, değer
Her kural aynı biçime sahiptir: bir özne (durum kodu, gövde, bir başlık, yanıt süresi), bir yüklem (eşittir, içerir, mevcuttur, küçüktür) ve çoğu yüklem için karşılaştırılacak bir değer. status eq 200 özne, yüklem ve değerdir; body.json exists bir özne ve değeri olmayan bir yüklemdir, çünkü "exists" başka hiçbir şeye ihtiyaç duymaz.
Düzenleyicide bir kural oluşturmak, neyin kontrol edileceğini seçmekle başlar, ardından koşul, ardından değer:

Listedeki kurallar VE ile birleştirilir: tek bir kural başarısız olduğunda bir kontrol başarısız olur, ve yalnızca her kural geçtiğinde geçer. Henüz bir VEYA yoktur, bu yüzden birkaç durumdan veya dizeden birini kabul etmek için bunu tek bir kural içinde ifade edin (status in [200, 301, 302], body containsAny ["In stock", "Pre-order"]). Başarısız olan bir kural kendini uyarıda adlandırır, bu yüzden mümkün olduğunda her birine kısa bir etiket verin, ve uyarı hangi beklentinin bozulduğunu söyleyecektir.
Neyi kontrol edebilirsiniz
Seçici, özneleri yanıtın kendi belgesine (gövde, başlıklar) ve taşımasına (durum, zamanlama, yönlendirmeler, TLS) göre gruplar. En çok önem taşıyan öznelerden birkaçı, tam liste aşağıdaki referansta:
| Özne | Ne olduğu | Örnek |
|---|---|---|
status | Yönlendirmeler takip edildikten sonra, nihai yanıtın HTTP durum kodu | status isOk |
body | Düz metin olarak yanıt gövdesi | body contains "Add to cart" |
body.json / body.xml / body.html / body.yaml | Gövde, ama yalnızca gerçekten o biçimde ayrıştığında; aksi halde özne basitçe mevcut değildir | body.json exists |
body.json.path("$.a") | Bir JSON gövdesine bir JSONPath sorgusu (aynı sorgu dili YAML üzerinde de çalışır, çünkü YAML aynı nesne modeline ayrıştırılır) | body.json.path("$.status") eq "ok" |
body.size / body.hash | Bayt cinsinden yanıt boyutu, ve gövde içeriğinin bir parmak izi | body.size gt 1kb |
header("Name") | Ada göre aranan, tek bir yanıt başlığı | header("Content-Type") isJson |
time ile time.connect / time.tls / time.dns / time.head | Toplam yanıt süresi, ve ağ, TLS el sıkışması, DNS ve sunucu düşünme süresi aşamaları | time lt 2s |
redirects / requests | Bir kontrolün takip ettiği sıçramalar, ve tam zincir (nihai yanıt dahil) | redirects.count eq 0 |
url ve parçaları (.host, .scheme, .path...) | Kontrolün ulaştığı nihai URL | url.scheme eq "https" |
cert.days.left | TLS sertifikasının süresinin dolmasına kalan gün sayısı | cert.days.left gt 14 |
Sayılar birim son ekleri kabul eder, böylece asla elle dönüştürmeniz gerekmez: 2s, 2000 milisaniye demektir, 1kb, 1024 bayt demektir. Kurala nocase eklemediğiniz sürece metin karşılaştırmaları büyük/küçük harfe duyarlıdır.
Tam referans
Aşağıda, assertion motorunun HTTP ve API kontrolleri için kaydettiği her özne, operatör, indirgeyici, kısayol, filtre ve söz dizimi biçimi yer alır; bunlar motorun kendi kayıt defterinden alınmıştır (kural düzenleyicinin seçicilerini ve belgelerini de besleyen aynı veri). Henüz genel olarak kullanılabilir olmayan girdiler parantez içinde bir not taşır: hiçbir aracının henüz doldurmaya başlamadığı ayrılmış alanlar, hala aracılara yayılmakta olan adaylar, ve belirli bir plan gerektiren durumsal (stateful) aile. Böyle bir not taşımayan her şey, bugün assertion modu olan her planda canlıdır.
Referans, motorun kendi gruplandırmasını izler: yanıt alanları, ardından bir gövdeye erişme yolları, ardından zamanlama, ağ ve TLS, ardından bunların hepsinde çalışan operatörler, indirgeyiciler ve kısayollar, ardından aynı dili konuşan HTTP ötesi kontrol türleri.
Yanıt
Yanıtın kendisini tanımlayan özneler: durumu, ham gövdesi, başlıkları, gerçekte yanıt verdiği URL, ve oraya ulaştıran istek zinciri.
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
body | Çözülmüş metin olarak yanıt gövdesi. | string | body contains "Welcome" |
header | Nihai yanıtın adına göre bir yanıt başlığı. | string | header("Content-Type") isJson |
redirects | Takip edilen yönlendirme sıçramaları - nihai öğesi olmayan istek zinciri. | collection | redirects.count eq 0 |
status | Yönlendirmeler takip edildikten sonra, nihai yanıtın HTTP durum kodu. | number | status isOk |
body.size | İndirilen gövdenin bayt cinsinden boyutu. | number | body.size lt 500000 |
url | Tüm yönlendirmelerden sonra gerçekten yanıt veren URL. Bir url: onu metin olarak karşılaştırın, veya parçalarını okuyun (url.host, .port, .path, .query, .scheme). | url | url.host eq "www.example.com" |
requests | Bu kontrolün yaptığı her istek, sırayla - yönlendirme sıçramaları ve ardından nihai istek. | collection | requests.count le 2 |
url.host | URL'nin ana bilgisayar bölümü. | string | url.host eq "example.com" |
url.path | URL'nin yol bölümü. | string | url.path startsWith "/api" |
url.port | URL'nin port bölümü. | number | url.port eq 443 |
url.query | URL'nin sorgu dizesi. | string | url.query contains "token" |
url.scheme | URL'nin şeması (http veya https). | string | url.scheme eq "https" |
body.hash | Yanıt gövdesinin bir özeti (digest) - içerik değişikliklerini tespit etmek için previous.body.hash ile karşılaştırın. | string | body.hash eq previous.body.hash |
httpVersion (ayrılmış - henüz doldurulmadı) | Üzerinde anlaşılan HTTP sürümü. | string | httpVersion eq "HTTP/2" |
setCookie | Nihai yanıtın Set-Cookie değerleri, çerez başına bir öğe - birini contains veya matches ile eşleştirin, .count ile sayın. | collection | setCookie exists |
steps (henüz kullanılamıyor) | Çok adımlı bir kontrolün adımları. Henüz kullanılamıyor. | collection | steps.count le 1 |
url.original | Herhangi bir yönlendirmeden önce, kontrolün yapılandırıldığı URL. url'nin kendisi gibi bir url: aynı parçalara sahiptir (url.original.host, .port, .path, .query, .scheme). | url | url.original.scheme eq "http" |
url.original.host | URL'nin ana bilgisayar bölümü. | string | url.original.host eq "example.com" |
url.original.path | URL'nin yol bölümü. | string | url.original.path startsWith "/start" |
url.original.port | URL'nin port bölümü. | number | url.original.port eq 80 |
url.original.query | URL'nin sorgu dizesi. | string | url.original.query contains "utm_" |
url.original.scheme | URL'nin şeması (http veya https). | string | url.original.scheme eq "http" |
İki takma ad: redirectCount, redirects.count için kısaltmadır - "kontrol doğrudan yanıt verdi, yönlendirme yok" demek istediğinizde redirectCount eq 0, eşdeğer uzun biçimden biraz daha doğal okunur. Ve en üst düzeydeki setCookie, nihai yanıtın çerez listesidir; aynı ad, requests/redirects içinde sıçrama başına yeniden görünür (aşağıdaki Sıçrama özneleri bölümüne bakın), yalnızca o isteğin çerezlerini tutar.
Gövdeden değer çıkarma
Bu özneler yalnızca gövde adlandırdıkları biçimdeyken çözülür: bir HTML sayfasında bir JSON ad alanı basitçe mevcut değildir, tipli bir hata değildir. Bu, exists'i biçimi araştırmanın standart yolu yapar, ve body.json exists, gövdenin JSON olarak ayrışıp ayrışmadığını sorar. Dört biçim ad alanının her biri, eşleşen bir .path(...) sorgu işlevi (json/yaml için JSONPath, xml için XPath, html için CSS seçicileri) ve eşleşen bir .regex(...) taşır, artı biçimden bağımsız olarak ham metni okuyan bir body.regex(...). body.html.a, body.html.script ve body.html.link, sayfadaki her bağlantının, betiğin ve <link> öğesinin hazır koleksiyonlarıdır; her birinde mevcut alanlar için aşağıdaki Öğe kapsamları bölümüne bakın.
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
body.json | Yanıt gövdesi, ama yalnızca gerçekten JSON olduğunda. | string | body.json exists |
body.json.path | JSON gövdesini bir JSONPath ifadesiyle sorgula. | json | body.json.path("$.status") eq "ok" |
body.html | Yanıt gövdesi, ama yalnızca gerçekten HTML olduğunda. | string | body.html exists |
body.html.path | Sayfa öğelerini bir CSS seçiciyle seç. | collection | body.html.path("h1").first contains "Welcome" |
body.regex | Metni bir düzenli ifadeyle eşleştir ve yakaladığını al. | string | body.regex("order-(?<id>\\d+)") exists |
body.xml | Yanıt gövdesi, ama yalnızca gerçekten XML olduğunda. | string | body.xml exists |
body.xml.path | XML gövdesini bir XPath ifadesiyle sorgula. | string | body.xml.path("//item/@id") exists |
body.html.a | Sayfadaki her bağlantı. | collection | body.html.a.count gt 0 |
body.html.link | Sayfanın bildirdiği her <link>. Yalın bir anma, bağlantı hedefleri anlamına gelir. | collection | body.html.link.count gt 0 |
body.html.script | Sayfanın yüklediği her betik. Yalın bir anma, betik kaynakları anlamına gelir. | collection | body.html.script.count gt 0 |
body.yaml | Yanıt gövdesi, ama yalnızca gerçekten YAML olduğunda. | string | body.yaml exists |
body.yaml.path | YAML gövdesini bir JSONPath ifadesiyle sorgula. | json | body.yaml.path("$.services.web.image") contains ":1." |
body.html.regex | Metni bir düzenli ifadeyle eşleştir ve yakaladığını al. | string | body.regex("order-(?<id>\\d+)") exists |
body.json.regex | Metni bir düzenli ifadeyle eşleştir ve yakaladığını al. | string | body.regex("order-(?<id>\\d+)") exists |
body.xml.regex | Metni bir düzenli ifadeyle eşleştir ve yakaladığını al. | string | body.regex("order-(?<id>\\d+)") exists |
body.yaml.regex | Metni bir düzenli ifadeyle eşleştir ve yakaladığını al. | string | body.regex("order-(?<id>\\d+)") exists |
Belirtilmeye değer bir regex ailesi ayrıntısı: bir .regex(...) kuralı içindeki adlandırılmış yakalama grupları ((?<id>...)), sonraki bir kuralın konuma göre bind("id") veya bind[0] ile geri okuyabileceği, kontrol kapsamlı bir bağlama ad alanına yazar - aşağıdaki Yakalanan değerler bölümüne bakın.
Yakalanan değerler
Bir özne, yanıtı doğrudan okumadığı için kendi kayıt defteri grubunda yaşar - bunun yerine daha önceki bir kuralın ondan neyi yakaladığını okur.
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
bind | Daha önceki bir regex kuralı tarafından, yakalama adına veya konuma göre yakalanan bir değer. | string | bind("id") gt 1000 |
Bunu listede daha önceki bir regex kuralıyla eşleştirin: body.regex("order-(?<id>\d+)") exists gibi bir kural, sipariş kimliğini id adına yakalar, ve sonraki bir kural bunu bind("id") gt 1000 ile, veya konumsal (adsız) bir yakalama için bind[0] ile test edebilir.
Zamanlama
Bir toplam artı aşamaya göre bir döküm, böylece "yavaşladı" uyarısı ayrıca hangi bölümün yavaşladığını da söyleyebilir.
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
time | Toplam yanıt süresi: bağlantı + TLS + bekleme + indirme. DNS çözümlemesi dahil değildir. | number | time lt 2000 |
ttfb (ayrılmış - henüz doldurulmadı) | İlk bayta kadar geçen süre. | number | ttfb lt 200 |
time.connect | TCP bağlantısını kurmak için geçen süre. | number | time.connect lt 500 |
time.data | Yanıt gövdesini indirmek için geçen süre. | number | time.data lt 1000 |
time.dns | Alan adını çözmek için geçen süre. Yalın time öznesine dahil değildir. | number | time.dns lt 200 |
time.head | Yanıt başlıkları için beklenen süre. | number | time.head lt 500 |
time.tls | TLS el sıkışması için geçen süre. | number | time.tls lt 300 |
Yalın time öznesi, bağlantı + TLS + başlıkları bekleme + gövdeyi indirmedir. DNS çözümlemesi hariç tutulur ve yalnızca kardeşi time.dns'de yaşar, çünkü DNS genellikle önbelleğe alınır ve aksi halde aynı uç noktayı kontroller arasında tutarsız biçimde hızlı veya yavaş gösterirdi.
Ağ: DNS ve bağlantı
dns ve conn, kayıt defterinde saf ad alanlarıdır - kendi değeri olmayan bir grup, bu yüzden bir kural asla yalın adda duramaz (hem düzenleyici hem de motor, yalnızca dns veya conn ile biten bir zinciri reddeder ve sizi aşağıdaki gerçek alanlara yönlendirir).
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
conn | Kontrolün yaptığı ağ bağlantısı - yanıtı sunan adres ve varsa bağlantı hataları. | string | - |
conn.failed | Çözülen adreslerden kaçının bağlanmayı başaramadığı. | number | conn.failed eq 0 |
conn.failedIps (aday - aracılara yayılıyor) | Bağlanmayı başaramayan çözülmüş adresler. | collection | conn.failedIps.count eq 0 |
conn.ip | Yanıtı gerçekte sunan IP adresi. | string | conn.ip eq "203.0.113.10" |
conn.ip.family (aday - aracılara yayılıyor) | Yanıtın IPv4 mü IPv6 mı üzerinden sunulduğu. | string | conn.ip.family eq "IPv4" |
dns | İzlenen adın DNS çözümlemesi - hangi adreslere çözüldüğü ve hangi sunucunun yanıtladığı. | string | - |
dns.ips | Bu kontrol sırasında alan adının çözüldüğü tüm IP adresleri. | collection | dns.ips contains "1.2.3.4" |
dns.server | Çözümlemeyi yanıtlayan DNS sunucusu. | string | dns.server eq "8.8.8.8" |
TLS ve sertifika
dns ve conn gibi, tls ve cert de saf ad alanlarıdır - sertifika/el sıkışması bilgileri bir düzey aşağıda yaşar.
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
cert.days.left | Site sertifikasının süresinin dolmasına kalan gün sayısı. | number | cert.days.left gt 14 |
cert | Sunucunun sunduğu sertifika - süre bitişine kalan gün, veren kuruluş ve kimlik alanları. | string | - |
cert.days | Sertifikanın verilmesinden bu yana geçen gün sayısı. | number | cert.days gt 0 |
cert.issuer | Site sertifikasını veren sertifika otoritesi. | string | cert.issuer contains "Let's Encrypt" |
cert.san | Sertifikanın geçerli olduğu alan adları. | collection | cert.san contains "www.example.com" |
cert.serial | Sertifikanın seri numarası. | string | cert.serial exists |
cert.subject (ayrılmış - henüz doldurulmadı) | Sertifikanın konusu (subject). Henüz yakalanmıyor - gelecek bir aracı sürümüyle geliyor. | string | cert.subject contains "example.com" |
tls | Güvenli bağlantının TLS el sıkışması - üzerinde anlaşılan protokol sürümü ve şifreleme paketi. | string | - |
tls.cipher | Üzerinde anlaşılan şifreleme paketi. | string | tls.cipher contains "AES" |
tls.protocol | Üzerinde anlaşılan TLS sürümü. | string | tls.protocol eq "Tls13" |
cert.subject tamlık için burada listelenmiştir ama henüz doldurulmamıştır - "ayrılmış"ın pratikte ne anlama geldiği için aşağıdaki Dürüstlük bölümüne bakın. Günlük kullanılan sertifika kuralı, uygulamalı kurallar bölümünde ele alınan cert.days.left gt 14'tür.
Sıçrama özneleri: requests ve redirects içindeki alanlar
requests ve redirects koleksiyondur, ve her öğe kendi indirgenmiş alan kümesine sahip tam bir istek/yanıt kaydıdır. Her üst düzey özne sıçrama başına anlamlı değildir (bir sıçramanın kendi sertifikası yoktur), ve bir alan yalnızca sıçrama başına vardır: zincirdeki o isteğin Strict-Transport-Security başlığı olan hstsHeader.
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
status | Zincirdeki bu isteğin durum kodu. | number | status eq 200 |
url | Bu isteğin yapıldığı URL. | url | url startsWith "https://" |
header | Bu isteğin bir yanıt başlığı. Bir sıçrama, indirgenmiş, tek değerli bir başlık kaydı tutar - liste yüklemleri (containsAny, containsAll, unique) yalnızca nihai yanıtın başlığında geçerlidir. | string | header("Content-Type") contains "json" |
hstsHeader | Bu isteğin Strict-Transport-Security başlığı. | string | requests[0].hstsHeader exists |
setCookie | Bu isteğin Set-Cookie başlık değerleri. | collection | setCookie exists |
url.original | Herhangi bir yönlendirmeden önce, kontrolün yapılandırıldığı URL. url'nin kendisi gibi bir url: aynı parçalara sahiptir (url.original.host, .port, .path, .query, .scheme). | url | url.original.scheme eq "http" |
url.host | URL'nin ana bilgisayar bölümü. | string | url.host eq "example.com" |
url.port | URL'nin port bölümü. | number | url.port eq 443 |
url.path | URL'nin yol bölümü. | string | url.path startsWith "/api" |
url.query | URL'nin sorgu dizesi. | string | url.query contains "token" |
url.scheme | URL'nin şeması (http veya https). | string | url.scheme eq "https" |
url.original.host | URL'nin ana bilgisayar bölümü. | string | url.original.host eq "example.com" |
url.original.port | URL'nin port bölümü. | number | url.original.port eq 80 |
url.original.path | URL'nin yol bölümü. | string | url.original.path startsWith "/start" |
url.original.query | URL'nin sorgu dizesi. | string | url.original.query contains "utm_" |
url.original.scheme | URL'nin şeması (http veya https). | string | url.original.scheme eq "http" |
Sıçrama başına header(...), indirgenmiş, tek değerli bir kayıt tutar: containsAny veya unique gibi liste biçimli yüklemler yalnızca nihai yanıtın tam başlık haritasında anlamlıdır, bu yüzden yalnızca orada geçerlidirler, sıçrama başına değil. İki koleksiyon farklı şeyler ifade eder. requests, yanıtlayan nihai yanıt dahil tüm zincirdir, bu yüzden doğrudan bir 200 için bile asla boş değildir; redirects ise yalnızca oraya giden yolda takip edilen sıçramalardır, hiçbir şey yönlendirilmediğinde boştur.
Öğe kapsamları: bir koleksiyon öğesinin içindeki alanlar
Bir öğe kapsamı, ona indekslendikten (requests[0]) veya where(current. ...) ile filtrelenirken (bir sonraki bölüme bakın) bir koleksiyonun TEK bir öğesinde bulunan alan kümesidir. Altı koleksiyon kendi öğe kapsamını taşır: dört HTML öğe koleksiyonu bir biçimi paylaşır, ve requests/redirects yukarıda belgelenen sıçrama-öznesi biçimini paylaşır.
| Öğe kapsamı | Bir öğe neye benzer |
|---|---|
body.html.path | Bir body.html.path("selector") CSS sorgusuyla eşleşen bir öğe. |
body.html.a | body.html.a'dan bir <a> bağlantı öğesi. |
body.html.script | body.html.script'ten bir <script> öğesi. |
body.html.link | body.html.link'ten bir <link> öğesi. |
requests | Tam zincirdeki bir istek (yukarıdaki sıçrama-öznesi tablosuna bakın). |
redirects | Takip edilen bir yönlendirme sıçraması (requests ile aynı alanlar, yukarıya bakın). |
body.html.path(...), body.html.a, body.html.script ve body.html.link için paylaşılan biçim - bağlantı, betik etiketi veya <link> öğesi başına bir satır:
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
url | Bağlantı hedefi, işaretlemenin yazdığı tam haliyle. | string | body.html.a.url contains "/checkout" |
text | Öğenin görünür metni. | string | body.html.a.text contains "Sign in" |
absolute | Bağlantı hedefi, sayfa URL'sine göre mutlak bir adrese çözülmüş - öğe başına url parçalarının bulunduğu (.host, .path, .port, .query, .scheme) bir url listesi. | url | body.html.a.absolute.scheme in ["https"] |
rel | Öğenin rel özniteliği. | string | body.html.a.where(current.rel eq "nofollow").count eq 0 |
absolute.host | URL'nin ana bilgisayar bölümü. | string | body.html.a.absolute.host.unique.count le 3 |
absolute.port | URL'nin port bölümü. | number | body.html.a.absolute.port in [443] |
absolute.path | URL'nin yol bölümü. | string | body.html.a.absolute.path startsWith "/" |
absolute.query | URL'nin sorgu dizesi. | string | body.html.a.absolute.query not contains "session" |
absolute.scheme | URL'nin şeması (http veya https). | string | body.html.a.absolute.scheme in ["https"] |
Bu koleksiyonlara karşı bir kural yazmadan önce iki varsayılan geçerlidir. body.html.a'nın (veya .script/.link'in) yalın bir anılışı, .url izdüşümü anlamına gelir, bu yüzden body.html.a.count gt 0 href'leri sayar, ve kaydedilmiş bir kural .url açıkça yazılmış olarak geri okunur, çünkü saklanan bir kural her zaman tam olarak neyi değerlendirdiğini söyler. Ve .url, işaretlemenin yazdığı tam haliyle ham href özniteliğidir, bu yüzden göreli bir bağlantı göreli kalır; .absolute ise aynı bağlantının sayfanın kendi URL'sine göre çözülmüş halidir; bu da giden bağlantıların şemasını veya ana bilgisayarını kontrol ederken istediğiniz şeydir (body.html.a.absolute.scheme in ["https"]).
Operatörler
Her kuralın yüklem yarısı: özneye karşı hangi testin çalıştırılacağı. 15'i de her kontrol türünde paylaşılır, ve hangilerinin belirli bir özneye uyduğu onun türüne bağlıdır (bir durum kodu lt/gt alır, bir gövde contains alır, bir koleksiyon exists/unique/in alır).
| Ad | Ne olduğu | Uygulandığı yer | Örnek |
|---|---|---|---|
eq | Eşittir. Bir json("…") / xml("…") / yaml("…") sabit değerine karşı bu TAM bir yapısal eşleşmedir: aynı anahtarlar (herhangi bir sırada), sırayla diziler, aynı değerler. | her tür | body.json eq json("{\"ok\": true}") |
lt | Küçüktür. | sayılar | time lt 2000 |
le | Küçük eşittir. | sayılar | cert.days.left le 30 |
gt | Büyüktür. | sayılar | body.size gt 0 |
ge | Büyük eşittir. | sayılar | status ge 500 |
contains | Metni içerir - bir liste üzerinde, değer öğelerden BİRİYSE geçer (tam eşleşme; öğelerin içinde arama yapmak için matches kullanın). Bir json("…") / xml("…") / yaml("…") sabit değerine karşı bu YAPISAL bir içermedir: sabit değerin belirttiği her şey mevcut olmalı ve eşleşmelidir; yanıtta daha fazlası olabilir. | metin veya liste | body.json contains json("{\"status\": \"ok\"}") |
startsWith | Metinle başlar - bir liste üzerinde, HERHANGİ bir öğe başladığında. | metin | url.path startsWith "/api" |
endsWith | Metinle biter - bir liste üzerinde, HERHANGİ bir öğe bittiğinde. | metin | url.path endsWith ".json" |
matches | Metnin herhangi bir yerinde düzenli ifadeyle eşleşir - bir liste üzerinde, HERHANGİ bir öğe eşleştiğinde. | metin | body matches "order-\\d+" |
containsAny | Listelenen değerlerden en az birini içerir (bir liste üzerinde: bazı öğeler bunlardan birine EŞİTTİR). | liste | body containsAny ["In stock", "Pre-order"] |
containsAll | Listelenen değerlerin her birini içerir (bir liste üzerinde: her değer bazı öğelere eşittir - tanıklar farklı olabilir). | liste | body.html.a.text containsAll ["Home", "Contact"] |
in | Listelenen değerlerden veya aralıklardan biridir - bir liste üzerinde, her öğe öyledir. | değer(ler) veya aralık | status in [200, 301, 302] |
exists | Özne mevcuttur. | her özne | header("ETag") exists |
isNumber | Değer bir sayı olarak okunur. | metin veya herhangi biri | bind("id") isNumber |
unique | Listenin yinelenen öğesi yoktur. | liste | dns.ips unique |
İki operatör kulağa geldiğinden daha dar bir şey ifade eder. Bir liste üzerinde contains, tam üyeliktir: değer bir öğenin bir alt dizesi olarak değil, tam bir öğeye eşit olmalıdır; bu yüzden bir koleksiyonun öğeleri arasında alt dize davranışı istediğinizde matches'e başvurun. Ve bir json(...)/xml(...)/yaml(...) sabit değerine karşı eq, tam bir yapısal eşleşmedir (aynı anahtarlar, aynı sırada diziler, aynı değerler), oysa aynı türden bir sabit değere karşı contains, yapısal bir içermedir: sabit değerin belirttiği her şey mevcut olmalıdır, ama gerçek yanıt daha fazlasını taşıyabilir.
İndirgeyiciler
Bir indirgeyici, bir koleksiyonu tek bir değere daraltır ve yalnızca bir zincirin sonunda görünebilir. Aşağıdaki örnekler, HTTP öznelerinin oluşturduğu doğal olarak sayısal tek koleksiyon olan requests.status'u bir gösterim olarak kullanır; aynı sekiz indirgeyici, herhangi bir kontrol türündeki herhangi bir sayısal koleksiyon üzerinde çalışır (bir Ping kontrolünün gidiş-dönüş süreleri, filtrelenmiş bir veritabanı satırları kümesi).
| Ad | Neyi daralttığı | Uygulandığı yer | Örnek |
|---|---|---|---|
count | Listenin kaç öğesi olduğu. | her koleksiyon | requests.count le 2 |
min | Listedeki en küçük sayı. | sayısal koleksiyon | requests.status.min ge 200 |
max | Listedeki en büyük sayı. | sayısal koleksiyon | requests.status.max lt 500 |
sum | Listedeki sayıların toplamı. | sayısal koleksiyon | requests.status.sum gt 0 |
avg | Listedeki sayıların ortalaması. | sayısal koleksiyon | requests.status.avg lt 300 |
first | Listenin ilk öğesi. | her koleksiyon | redirects.status.first eq 301 |
last | Listenin son öğesi. | her koleksiyon | requests.status.last eq status |
unique | Yinelenenleri kaldırılmış liste. | her koleksiyon | dns.ips.unique.count le 3 |
unique aşırı yüklenmiştir, ve yazımı iki anlamı birbirinden ayırır. Noktasız bir operatör olarak yazıldığında (x unique) bir yüklemdir, "bu koleksiyonun yinelenen öğesi yok" der, ve tekrarı adlandırarak başarısız olur. Noktalı bir indirgeyici olarak yazıldığında (x.unique) bir dönüşümdür, yinelenenleri kaldırılmış koleksiyonun kendisi, ki bu hala sonrasında bir şeye ihtiyaç duyar (x.unique.count eq 1). Sonrasında hiçbir şey olmayan sarkan bir x.unique, bir söz dizimi hatasıdır, çünkü motor ikisinden hangisini kastettiğinizi tahmin edemez.
Kısayollar (Sugar)
Kısayol (sugar) yüklemleri, kural bir aracıya gönderilmeden önce motorun sıradan çekirdek yüklemlere genişlettiği kısaltmalardır - bir kısayol yüklemi eklemek ek hiçbir şeye mal olmaz (aracı paketi yok, sürüm tabanı yok), çünkü tele ulaştığında zaten sıradan bir kural gibi görünür. Var olduğunda her zaman kısayolu tercih edin: daha iyi okunur, ve uzun biçimi elle yazmakla tam olarak eşdeğerdir.
| Ad | Ne anlama geldiği | Uygulandığı yer | Örnek |
|---|---|---|---|
isOk | Durum bir başarı kodudur (200-299). | status | - |
isRedirect | Durum bir yönlendirme kodudur (300-399). | status | status isRedirect |
isClientError | Durum bir istemci hatasıdır (400-499). | status | status isClientError |
isServerError | Durum bir sunucu hatasıdır (500-599). | status | status isServerError |
isJson | İçerik gerçekten JSON'dur. | belge veya medya türü metni | header("Content-Type") isJson |
isXml | İçerik gerçekten XML'dir - gövde XML olarak ayrışır, veya bir başlık bir XML medya türü adlandırır. | belge veya medya türü metni | body isXml |
isHtml | İçerik gerçekten HTML'dir - gövde HTML olarak ayrışır, veya bir başlık bir HTML medya türü adlandırır. | belge veya medya türü metni | body isHtml |
isForm | Bir medya türü bir form kodlaması adlandırır: application/x-www-form-urlencoded veya multipart/form-data. isJson/isXml/isHtml'nin aksine eşleşen bir gövde ad alanı yoktur, bu yüzden bu yalnızca bir Content-Type başlığı gibi bir medya türü değerine uygulanır. | yalnızca medya türü metni | header("Content-Type") isForm |
isEmpty | Hiçbir şey yok: boş bir metin, sıfır boyut veya boş bir liste. | metin, boyut veya liste | body isEmpty |
isNull | Değer null'dur. | her değer | body.json.path("$.deletedAt") isNull |
absent | Özne hiç mevcut değildir. | her özne | header("X-Debug") absent |
between | İki ucu dahil bir aralık içinde bir sayı. | sayılar (2 işlenenli) | body.size between 50 and 500kb |
isJson/isXml/isHtml kasıtlı olarak bağlama duyarlıdır, ve onları neyin üzerine yazdığınız hangi anlamın geçerli olduğuna karar verir. Belgenin kendisinde yazıldığında (body isJson) "bu o biçimde ayrışıyor mu" demektir, body.json exists ile aynı. Bir başlık gibi bir medya türü adlandıran bir metin değerinde yazıldığında (header("Content-Type") isJson) "bu o biçimin MIME ailesini adlandırıyor mu" demektir; hangi medya türlerinin nitelendiğini görmek için aşağıdaki MIME aileleri bölümüne bakın. isForm'un yalnızca ikinci anlamı vardır, çünkü ayrıştırılacak bir body.form ad alanı yoktur, bu yüzden body isForm, asla doğru olamayacak bir kural değil, statik bir hatadır.
where(...) filtresi
Yalnızca eşleşen öğeleri tutun, sonra oradan devam edin. Dildeki tek filtreleme yapısıdır, ve tam olarak tek bir biçimi vardır: where(current.<field> <condition> <value>).
Filtreleme, izdüşüm almaktan farklıdır: requests.url contains "cart", zincirde herhangi bir yerde böyle bir sıçrama olup olmadığını sorar, oysa requests.where(current.url contains "cart").status, o sıçramanın neyi döndürdüğünü sorar. Filtreleme listeyi daraltmaz, bu yüzden .first, bir in [...] kontrolü veya .count ile bitirin. Yalnızca bir düzey iner, ve tam olarak bir koşul alır.
| Parça | Ne adlandırdığı | Notlar |
|---|---|---|
current.<field> | current.'dan sonra yazılan, filtrelenen her öğenin bir alanı | İnsanların yanlış yaptığı yarı budur: current.url, tek tek sıçramanın URL'sidir, nihai yanıtınki değil. Yalnızca öğenin kendi alanları current.'dan sonra gelebilir. |
| koşul | not ve nocase dahil, sıradan herhangi bir yüklem | Bir kuralın en üst düzeyinde çalışan her koşul burada da çalışır. |
| değer | Her öğenin alanının neyle karşılaştırıldığı | Genellikle düz bir değer. Burada yazılan bir özne, öğeden değil DIŞTAKİ yanıttan okunur - where(current.url eq url.original), her sıçramayı kontrolün yapılandırıldığı URL'ye karşı karşılaştırır; öğe tarafının current.'ı yüksek sesle söylemesi gerekmesinin nedeni budur. |
Örnek: requests.where(current.url contains "cart").status.first eq 301 - yalnızca URL'si "cart" içeren sıçramaları tutun, sonra eşleşen ilkinin durumuna bakın.
Her ikisi de ayrıştırıcı tarafından kendi mesajıyla zorlanan iki sınır daha: where, başka bir where'in içine yerleştirilemez, ve argümanı tam olarak bir koşuldur, içinde and/or olmadan. Yalnızca öğeleri adlandırılmış alanlar taşıyan bir koleksiyona uygulanır (requests, body.html.a), dns.ips gibi düz izdüşümlü bir listeye değil; orada current.'ın adlandıracağı hiçbir şey yoktur.
Söz dizimi referansı
Dilbilgisinin tanımladığı her şey daha: bir kurala nasıl ad verilir, aralıklar ve listeler nasıl yazılır, yalın bir öznenin ne anlama geldiği, ve birçok kuralda görünen küçük noktalama biçimleri.
| Biçim | Ne yaptığı | Tür | Örnek |
|---|---|---|---|
where | Yalnızca eşleşen öğeleri tutun, sonra oradan devam edin. | koleksiyon filtresi | requests.where(current.url contains "cart").status.first eq 301 |
not | Sonra gelen koşulu tersine çevirir. | bayrak | body not contains "error" |
nocase | Metni büyük/küçük harfi gözetmeden karşılaştırır. | bayrak | body contains "welcome" nocase |
current | where(…) içinde, filtrelenen tek öğeyi adlandırır. | öğe referansı (where içinde) | requests.where(current.status eq 301) |
range | Her iki ucu DAHİL bir sayı aralığı. | sayı aralığı | status in [200..299] |
list | Karşılaştırılacak bir değerler listesi. | değer listesi | status in [200, 301, 302] |
docLiteral | Yapısal karşılaştırma için tipli bir belge değeri: kural kaydedildiğinde tırnaklı metin JSON, XML veya YAML olarak ayrıştırılır. | json/xml/yaml metni | body.json contains json("{\"user\": {\"active\": true}}") |
implicitExists | Yalnızca bir özne adlandıran bir kural, onun mevcut olduğunu kontrol eder: yalnızca body.json yazmak, body.json exists olarak kaydedilir. | yalın özne satırı | body.json |
index | 0'dan sayarak, konuma göre bir listenin TEK bir öğesini seçer. | 0 tabanlı tam sayı | requests[0].status |
label | Kural için iki noktadan önce yazılan isteğe bağlı bir ad. | iki noktadan önce ad | "json ok": body.json exists |
comment | #'dan sonraki her şey kendinize bir nottur; kontrolü etkilemez. | sondaki # metni | status isOk # the happy path |
Düz İngilizce bir geçişi hak eden birkaçı. label, bir kurala, işlenmiş ifade yerine uyarıda görünen bir ad verir; "json ok": body.json exists'te olduğu gibi iki noktadan önce yazın. implicitExists, yalnızca bir özne adlandıran ve yüklemi olmayan bir satırın exists için bir kısaltma olduğu anlamına gelir: body.json yazmak, body.json exists olarak kaydedilir, ve kuralı yeniden açmak yazılmış biçimi gösterir. range ve list, in'den sonra bir değerin alabileceği iki biçimdir: bir aralık ([200..299], her iki uç dahil) veya açık bir liste ([200, 301, 302]), ve bir değer her iki tarafta da açık uçlu olabilir ([400..]). docLiteral, gövdeye karşı yapısal karşılaştırma için kullanılan json(...)/xml(...)/yaml(...) sarmalayıcısıdır (yukarıda Operatörler altında ve aşağıdaki uygulamalı kurallarda ele alınmıştır). index, bind[0]'ın konumsal bir yakalamayı okuduğu şekilde, 0 tabanlı olarak bir koleksiyondan konuma göre bir öğe seçer. current, yalnızca yukarıda kendi bölümünde ele alınan bir where(...) filtresi içinde anlam taşır.
Sarmalayıcılar: previous, delta ve delta2
Yalnızca mevcut yanıta değil, geriye de bakan üç biçim - her biri durumsal (stateful) assertion içeren planlara kilitlidir, ve her biri aşağıdaki "Önceki kontrolle karşılaştırma" bölümünde tam olarak açıklanmıştır.
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
delta (durumsal assertion içeren bir plan gerektirir) | Sayısal bir değerin önceki kontrolden bu yana ne kadar değiştiği - isteğe bağlı olarak ms/s/m/h cinsinden bir oran olarak. | number | delta(body.size, h) lt 1mb |
delta2 (durumsal assertion içeren bir plan gerektirir) | Değişimin değişimi - bir değer hızlanıyor mu? | number | delta2(time) gt 0 |
previous (durumsal assertion içeren bir plan gerektirir) | Bu öznenin önceki kontrolde sahip olduğu değer. | any | status eq previous.status |
Bayraklar: not ve nocase
Kendi başlarına özne veya yüklem olmak yerine bir kurala eklenen iki değiştirici.
| Bayrak | Ne yaptığı | Tür | Örnek |
|---|---|---|---|
not | Sonra gelen koşulu tersine çevirir. | bayrak (bir kurala eklenir) | body not contains "error" |
nocase | Metni büyük/küçük harfi gözetmeden karşılaştırır. | bayrak (bir kurala eklenir) | body contains "welcome" nocase |
not, tüm kuralı bir birim olarak olumsuzlamak yerine sonra gelen yüklemle bir araya gelir - x not != y, çifte olumsuzlama değil x eq y olarak okunur. Bir özne tamamen mevcut olmayabildiğinde, not exists yerine kısayol absent'i tercih edin: ikisi tam olarak aynı şeyi ifade eder, ama absent bunu doğrudan söyler. nocase yalnızca gerçekten metinsel bir karşılaştırmada bir şey değiştirir; düzenleyici (ve bu referans) hala onu her yere yazmanıza izin verir, ama status eq 200 nocase gibi sayısal bir testte sessizce anlamsızdır.
MIME aileleri
isJson, isXml, isHtml ve isForm'un, bir başlık gibi bir medya türü değerine uygulandıklarında arkasındaki arama tabloları. Her aile, açık üst düzey medya türünün yanı sıra, JSON ve XML için, eşleşen yapılandırılmış söz dizimi son ekiyle biten herhangi bir türle eşleşir - bu da header("Content-Type") isJson'un yalnızca düz application/json'da değil, application/problem+json veya application/vnd.api+json'da da doğru şekilde geçmesini sağlayan şeydir.
| Aile | Eşleştiği | Eşleşen kısayol | Örnek |
|---|---|---|---|
json | application/json, text/json, veya +json ile biten herhangi bir medya türü (application/problem+json, application/vnd.api+json, application/ld+json, ...). | kısayol: isJson | header("Content-Type") isJson |
xml | application/xml, text/xml, veya +xml ile biten herhangi bir medya türü (image/svg+xml, application/atom+xml, ...). | kısayol: isXml | header("Content-Type") isXml |
html | text/html veya application/xhtml+xml. | kısayol: isHtml | header("Content-Type") isHtml |
form | application/x-www-form-urlencoded veya multipart/form-data. | kısayol: isForm | header("Content-Type") isForm |
Eşleştirme, ilk ;'den itibaren her şeyi yok sayar (bu yüzden application/json; charset=utf-8 hala eşleşir) ve büyük/küçük harfe duyarsızdır.
Veritabanı, counter, SNMP, port ve ping kontrolleri için özneler
Yukarıdaki her operatör, indirgeyici, kısayol ve söz dizimi biçimi bu beş kontrol türü için özdeştir: motor, hiçbir istisna olmadan altı türün hepsi için aynı 15 operatörü, 8 indirgeyiciyi, 12 kısayol yüklemini ve 11 söz dizimi biçimini kaydeder. Türe göre farklılık gösteren şey özne listesidir. Her tür, ölçtüğü şeye özgü küçük bir özne kümesi, artı yukarıda zaten belgelenen ağ/zamanlama/TLS öznelerinin bir alt kümesini gösterir; anlam türe göre uyarlanır (bir Database kontrolünün time'ı, indirilecek bir HTTP yanıtı olmadığı için bağlantı-artı-TLS-artı-indirme yerine bağlantı-artı-sorgudur).
Veritabanı kontrolleri
Yukarıda belgelenen özneleri time, time.connect ve time.dns'i paylaşır (bir veritabanı bağlantısına göre yeniden kapsamlandırılmış: bağlantı-artı-sorgu, veritabanı ana bilgisayarının DNS çözümlemesi). Veritabanı kontrollerine özgü olanlar:
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
scalar | Sorgunun döndürdüğü tek değer (Scalar modu). | any | - |
rows | Sorgunun etkilediği veya döndürdüğü satırlar (NonQuery modu). | collection | - |
time.query | Sorgunun kendisinin aldığı süre. | number | - |
Uygulamalı bir örnek bir sonraki bölümdedir: bir sorgunun kaç satırı etkilediğini veya döndürdüğünü doğrulamak için rows.count'u, döndürülen tek bir değeri doğrudan kontrol etmek için scalar'ı kullanın.
Counter kontrolleri
Yukarıda belgelenen özneyi time'ı paylaşır - özellikle Counter kontrolleri için aday durumunda bir alan olarak (counter isteğinin gidiş-dönüş süresi; "aday"ın ne anlama geldiği için Dürüstlük bölümüne bakın). Counter kontrollerine özgü olan:
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
value | Ölçülen counter değeri. | number | - |
SNMP kontrolleri
Yukarıda belgelenen özneleri time ve time.dns'i paylaşır (ana bilgisayar adı çözümlemesi artı SNMP isteğinin kendisi). SNMP kontrollerine özgü olanlar:
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
time.request | SNMP isteğinin aldığı süre. | number | - |
value | OID'nin döndürdüğü değer. | any | - |
value.type (aday - aracılara yayılıyor) | Döndürülen değerin SNMP veri türü adı. | string | - |
value.type aday durumundadır; Dürüstlük bölümüne bakın. Kullanılabilirlik notu: assertion modu Response Validation düğmesi henüz SNMP monitör düzenleyicisine ulaşmadı. Çalışan bir kural listesi yerine bu iki özneyi adlandıran bir "Coming soon" paneli gösterir. Özneler ve altındaki değerlendirici zaten kayıtlıdır; yalnızca SNMP düzenleyici arayüzü beklemededir.
Port kontrolleri
HTTP dışı herhangi bir türün en büyük paylaşılan listesi. Bir TCP port kontrolü, bir port kontrolü de TLS üzerinde anlaşabildiğinden, bir HTTP kontrolüyle esasen aynı bağlantı, DNS, TLS ve sertifika öznelerini taşır: bind, cert ve altı alt alanı, conn ve dört alt alanı, dns ve iki alt alanı, time/time.connect/time.dns/time.tls, ve tls/tls.cipher/tls.protocol - hepsi yukarıdaki bölümlerde, aynı anlamlarla belgelenmiştir. Port kontrollerine özgü olanlar:
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
banner | Bağlantıdan sonra soketten okunan veri. | string | - |
banner.hash (aday - aracılara yayılıyor) | Banner'ın bir özeti - hizmet değişikliklerini tespit etmek için previous.banner.hash ile karşılaştırın. | string | - |
banner.regex | Metni bir düzenli ifadeyle eşleştir ve yakaladığını al. | string | body.regex("order-(?<id>\\d+)") exists |
banner.size (aday - aracılara yayılıyor) | Bayt cinsinden banner boyutu. | number | - |
banner.hash ve banner.size aday durumundadır - Dürüstlük bölümüne bakın. banner.regex bugün canlıdır ve tam olarak bir HTTP kontrolündeki body.regex(...) gibi çalışır: adlandırılmış yakalamalar aynı bind(...) ad alanını besler.
Ping kontrolleri
Yukarıdaki bölümlerle bağlantı ve DNS öznelerini paylaşır: conn, conn.failed, conn.failedIps, conn.ip, conn.ip.family, dns, dns.ips, dns.server, time (burada, başarılı yanıtların ortalama gidiş-dönüş süresi) ve time.dns. Ping kontrollerine özgü olanlar:
| Ad | Ne olduğu | Tür/değerler | Örnek |
|---|---|---|---|
loss | Yanıt almayan yankı isteklerinin yüzdesi. | number | loss eq 0 |
reply | Başarılı yankı yanıtları. | collection | - |
sentCount (aday - aracılara yayılıyor) | Kaç yankı isteği gönderildiği. | number | - |
time.max | En yavaş yanıtın gidiş-dönüş süresi. | number | - |
time.min | En hızlı yanıtın gidiş-dönüş süresi. | number | - |
ttl | İlk başarılı yanıtın TTL'si - rota değişikliklerini görmek için previous.ttl ile karşılaştırın. | number | - |
sentCount aday durumundadır - Dürüstlük bölümüne bakın. ttl, katı bir geçti/kaldı kuralının dışında bile bilinmeye değer iyi bir özelliktir: onu previous.ttl ile eşleştirmek (yukarıdaki Sarmalayıcılar bölümüne bakın) kontroller arasında bir rota değişikliğini işaretler, çünkü varışta bir paketin yaşam süresi (time-to-live) kaç sıçrama geçtiğini yansıtır.
İnsanların gerçekten yazmak istediği kurallar
Sayfa ayakta ve gerçekten doğru şeyi söylüyor
Tek başına bir durum kodu, bir sayfanın doğru işlendiğini söyleyemez - boş bir kabukla dönen bir 200 yanıtı, yalnızca duruma bakan bir kontrolün kaçırdığı klasik sessiz hatadır.
status isOk
body contains "Add to cart"
Bir API JSON ile ve beklediğiniz alanla yanıtlıyor
Uç noktanın hala JSON konuştuğunu kontrol edin, sonra içine erişin. İlk satır, JSON olması gereken yerde sunulan bir HTML hata sayfasını, bir vekil sunucunun arkasında yaygın bir kesinti biçimini yakalar; ikincisi yalnızca taşıma durumunu değil, API'nin kendi bildirdiği sağlığını kontrol eder.
body isJson
body.json.path("$.status") eq "ok"
Yanıt olması gerekenden daha yavaş hale geldi
Yalnızca bir şeyin yavaş olduğunu değil, neyi düzeltmeniz gerektiğini bilmeniz gerektiğinde parçalara ayırın - time.connect, time.tls, time.dns ve time.head, ağ, el sıkışma, çözümleyici ve uygulama süresini ayırır.
time lt 2s
Bir yönlendirme ziyaretçileri kendi alan adınızdan başka bir yere gönderdi
Kontrolün ulaştığı yeri yapılandırdığınız URL ile karşılaştırır - ele geçirilmiş, hatalı yapılandırılmış veya sadece bir dağıtımla değişmiş bir yönlendirme zinciri, amaçlamadığınız bir yere ulaştığı anda başarısız olur.
url.host eq url.original.host
Sayfa son kontrolden bu yana değişti
Fiyatlandırma, koşullar, yayınlanmış bir politika gibi kontroller arasında sabit kalması gereken içerikte yararlıdır, ve aynı zamanda temel bir tahrifat (defacement) sinyali olarak da işlev görür.
previous.body.hash eq body.hash
Kısa yoldan yazılmış bir aralık içindeki sayı
Açık bir aralık yazmadan, hem küçültülmüş bir sayfayı hem de kontrolden çıkmış bir sayfayı tek bir kuralda yakalar.
body.size between 50 and 500kb
Süresi dolmak üzere olan bir sertifika
En yaygın tek TLS kontrolü, ve düz bir açık/kapalı monitörün hiç ifade edemeyeceği bir kontrol - bugün hala doğrulanan ama önümüzdeki hafta süresi dolan bir sertifika başka hiçbir uyarı işareti vermez. Yanlış bir otorite tarafından sessizce verilmiş bir sertifikayı da yakalamak istiyorsanız bunu cert.issuer ile eşleştirin.
cert.days.left gt 14
Yanlış sayıda satır döndüren bir veritabanı sorgusu
Bir Database kontrolünde rows, bir sorgunun etkilediği veya döndürdüğü koleksiyondur - onu saymak, tam olarak bir hesap kaydı döndürmesi gereken bir sorgunun sessizce sıfır döndürmeye başlamasını (silinmiş, veya bozuk bir birleştirme) veya birden fazla döndürmesini (olmaması gereken bir yinelenen) yakalar.
rows.count eq 1
Aralık dışına sürüklenen bir SNMP değeri
Yanıt veren bir SNMP cihazı, sağlıklı bir cihazla aynı şey değildir - izlenen bir OID (disk kullanımı, kuyruk derinliği, sıcaklık), cihazın kendisi mükemmel şekilde erişilebilir kalırken güvenli bir eşiğin çok üzerine çıkabilir. Yoklanan value'yu bir aralığa karşı karşılaştırmak, basit bir erişilebilirlik kontrolünün yakalayamayacağı şeyi yakalar.
value lt 90
Yanlış banner ile yanıt veren bir TCP hizmeti
Bağlantıları kabul eden bir port, üzerinde dinleyen doğru hizmetle aynı şey değildir - takılıp kalmış bir işlem, hatalı yapılandırılmış bir vekil sunucu, veya düşürülmüş/ikame edilmiş bir hizmet, hepsi yine de bir TCP el sıkışmasını tamamlayabilir. Bir hizmetin bağlandıktan hemen sonra gönderdiği karşılama metnini (bir SMTP, FTP veya benzeri banner) okumak, çıplak bir port-açık kontrolünün yakalayamadığını yakalar.
banner contains "220"
Önceki kontrolle karşılaştırma
Bir avuç özne, yalnızca mevcut yanıta değil geriye de bakar: bir öznenin önüne previous. koyarak son kontrolde ne olduğunu okuyun, veya o zamanla şimdi arasındaki farkı almak için onu delta(...) içine sarın, veya o değişimin değişimini almak için delta2(...) içine sarın - sürüklenen değil hızlanan bir değeri (her kontrolde daha hızlı artan bir yanıt süresi) tespit etmek için yararlıdır. Yukarıdaki previous.body.hash eq body.hash tam olarak budur - "gövdenin parmak izi son seferkiyle eşleşiyor mu." delta(body.size, h), sıçramak yerine düzenli büyümesini beklediğiniz değerler için değişimi ham bir fark yerine saat başına bir oran olarak okur.
Bunun gibi bir kural ilk çalıştığında karşılaştıracak hiçbir şeyi yoktur, bu yüzden başarısız olmak yerine atlanır: kontrol "ısınıyor" olarak işaretlenir, bozuk değil, ve kuralı eklemek yanlış bir alarm yükseltmez. Isınma yalnızca mevcut okuma sağlamken ve taban değer eksikken geçerlidir. Mevcut okumanın kendisi başarısız olursa (diyelim ki gövde bu sefer geçerli JSON değilse), kural tam olarak previous.'suz düz biçiminin yapacağı gibi başarısız olur. Böyle bir kural ayrıca kontroller arasında değerin değişmesine ihtiyaç duyar; bu da onu asla durum ilerletmeyen bir kontrol yöntemi üzerinde, örneğin bir HEAD isteğinde, anlamsız kılar.
Önceki kontrolle karşılaştırma, daha üst katmanlı bir plan gerektirir; olmadan, bu özneler düzenleyicide bir açıklamayla gri olarak görünür.
Sınırlar, ve kasıtlı olarak eksik olan
Kaç kural ekleyebileceğiniz planınıza bağlıdır, "Add rule"un yanında canlı bir sayaç olarak gösterilir. Motor ayrıca, plandan bağımsız olarak her kontrolde mutlak bir tavan zorlar; bu, sıradan kullanıma bir sınır değil, kötüye kullanıma karşı bir korumadır: o kadar kurala yakın bir kontrol zaten alışılmadık derecede büyük olurdu.
Bir kural için özel JavaScript yazmanın bir yolu yoktur, ve asla olmayacak. Her kural, açık bir betik sanal alanı yerine sabit, adlandırılmış bir özne ve yüklem kelime dağarcığından oluşturulur; bu da bir kuralı bir bakışta okunabilir ve dünya çapındaki her izleme aracısında çalıştırmak için güvenli tutar.
Her kural, yazıldığı anda her yerde çalışmaz: bazı daha yeni koşullar, kontrolünüzü çalıştıran izleme aracısının yakın zamanlı bir sürümünü gerektirir, bu yüzden yeni bir yetenek, aracılar arka planda güncellendikçe hesabınızdaki her kontrole ulaşmak için zaman alır. Dilin kararlı çekirdeği üzerine kurulu kurallar etkilenmez.
Bu referanstaki bir avuç girdi henüz tam olarak canlı değildir, ve her biri yukarıdaki tablosunda etiketlenmiştir:
- Ayrılmış (bildirilmiş, henüz hiçbir aracı tarafından doldurulmamış):
ttfb,httpVersion,cert.subject. - Aday (zaten yayılıyor, henüz her aracıda değil): HTTP, Port ve Ping kontrollerinde
conn.ip.familyveconn.failedIps, SNMP kontrollerindevalue.type, Port kontrollerindebanner.hashvebanner.size, Ping kontrollerindesentCount, ve Counter kontrolünün kenditime'ı. - Henüz kullanılamıyor: gelecekteki çok adımlı bir kontrol türü için ayrılmış
steps. - Durumsal assertion içeren bir plan gerektirir: her kontrol türünde, tüm
previous/delta/delta2sarmalayıcı ailesi.
Bu referanstaki geri kalan her şey, bugün assertion modu olan her planda canlıdır.
Assertion modu bugün nerede çalışır
Assertion modu için Response Validation düğmesi, aynı kural düzenleyicisini ve söz dizimini paylaşan HTTP (web sitesi) ve API monitörlerinde görünür. Aynı dil ve değerlendirici, protokol düzeyinde Database, Counter, Port, Ping ve SNMP kontrollerinin altında zaten çalışır: yukarıdaki kayıt defteri altı kontrol türünün hepsine hizmet eder, ve biri için kaydedilmiş bir kural, mod daha sonra başka bir türün düzenleyicisine ulaşırsa aynı şekilde okunur.
SNMP en net ön izlemeyi gösterir: düzenleyicisi zaten value ve value.type'ı adlandıran, "Coming soon" etiketli, arkasında henüz çalışan bir kural listesi olmayan bir Assertion rules paneline sahiptir. Database, Counter ve Ping kontrolleri, özneleri altta motorda eşit derecede canlı olmasına rağmen hiçbir assertion modu paneli göstermez.
Gerçek bir kontrol kurma
Düz bir web sayfası yerine bir REST API'yi doğruluyorsanız, kendi API'nizin çalışma süresini, yanıt süresini ve gövdesini birlikte ele alan API yanıt doğrulamasından başlayın. Kullanıcılarınızın olduğu her yerden ayakta kalması ve doğru yanıt vermesi gereken bir sayfa veya site için, 300'den fazla konumdan küresel çalışma süresi izleme, assertion modunun içine eklendiği daha geniş resimdir. Kuralları panel yerine kod aracılığıyla ayarlamak için, HostTracker'ın kendi API v2'si, bir monitörün assertion kurallarını düzenleyicinin yaptığı gibi oluşturur ve günceller. Yukarıdaki sertifika süresi dolma kuralı ve TLS ile ilgili her şey için, alan adı ve TLS sertifikası izleme, cert.days.left'in ve diğer TLS öznelerinin yaşadığı kontrol türünü kapsar. Şu anda, hiçbir hesap olmadan, gerçek bir URL'ye karşı bir kuralın değerlendirilmesini izlemek için ücretsiz HTTP kontrol aracını kullanın. status öznesinin karşılaştırdığı durum kodları için 200 OK'den başlayın, ve izleme rehberleri, bu dilin altında çalıştığı her kontrol türünü kurmayı ele alır.
Sıkça sorulan sorular
Assertion modunu açarsam eski durum kodu ve anahtar sözcük ayarlarıma ne olur?
Mod açıkken bunların yerini kural listesi alır. Kaydetmeden önce tekrar kapatmak, klasik alanları tam olarak eskisi gibi geri getirir: hiçbir şey silinmez, iki mod yalnızca aynı anda etkin olamaz.
Tek bir monitörde birden fazla koşulu birleştirebilir miyim?
Evet: listedeki her kural geçmelidir. Ayrı kurallar arasında henüz bir "VEYA" yoktur, bu yüzden birkaç değerden birini kabul etmek için in [...] veya containsAny [...] ile tek bir kural kullanın.
Assertion modu bana bir gün kendi betiğimi yazma imkanı verecek mi?
Hayır. Her kural, dilin sabit özne ve yüklem kümesinden oluşturulur. Tasarım gereği özel JavaScript yoktur.
Önceki kontrolle karşılaştıran bir kural eklediğimde ilk seferinde ne olur?
Henüz karşılaştıracak hiçbir şeyi yoktur, bu yüzden başarısız olmak yerine ısınıyor olarak işaretlenir ve atlanır. "Bu değişti mi" kuralı eklemek, kendi başına asla yanlış bir alarm yükseltmez.
Assertion modunu kullanmak için belirli bir plana ihtiyacım var mı?
Modun kendisi ve günlük kurallar (durum, gövde, başlıklar, zamanlama, yönlendirmeler) geniş çapta kullanılabilir; aynı anda kaç kural ekleyebileceğiniz planınıza bağlıdır ve düzenleyicide canlı olarak gösterilir. Önceki bir kontrolle karşılaştıran kurallar (previous, delta, delta2) daha üst katmanlı bir plan gerektirir ve bir açıklamayla gri gösterilir.
Assertion modu API monitörlerinde web sitesi monitörlerindeki gibi mi çalışır?
Evet. HTTP ve API monitörleri aynı kural düzenleyicisini, öznelerini ve yüklemlerini paylaşır, ve biri için yazılan bir kural diğerinde aynı şekilde okunur.
where(...) tam olarak ne yapar, ve ne zaman ihtiyacım olur?
Sonucun bir alanını okumadan önce bir koleksiyonu bir koşulla eşleşen öğelere daraltır. requests.status gibi düz bir izdüşüm yeterince özel olmadığında ve tüm koleksiyon yerine belirli bir sıçramaya, bağlantıya veya öğeye ihtiyacınız olduğunda kullanın (yukarıdaki bölüme bakın).
Bugün bir veritabanı sorgusuna, bir SNMP değerine, bir port banner'ına veya bir ping sonucuna karşı bir kural yazabilir miyim?
Dil ve değerlendirici hepsini destekler, ve yukarıdaki özne tabloları her birini kapsar. Kural düzenleyicisi desteklemez: bugün yalnızca HTTP ve API monitörleri Response Validation düğmesini gösterir. SNMP, iki öznesinin bir "Coming soon" ön izlemesini gösterir, ve Database, Counter ve Ping hiçbir assertion modu paneli göstermez.
Bu referanstaki bazı özneler neden sadece normal şekilde listelenmek yerine "ayrılmış" veya "aday" diyor?
"Ayrılmış", alanın kayıt defterinde bildirildiği ama henüz hiçbir aracının onu doldurmadığı anlamına gelir; "aday", aracılara yayılmakta olduğu ama hepsine henüz ulaşmadığı anlamına gelir. İkisi de bu referansta ve yukarıdaki Sınırlar bölümündeki özet listede göründükleri her yerde belirtilir.