Ana içeriğe geç

Rehberler / İzleme rehberleri: her kontrol türü, adım adım kurulum

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.

Assertion modu açık, ilk kural oluşturulmuş ve doğrulanmış

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:

İkinci bir kural oluşturma: alan seçici her özneyi türüyle ve bir örnekle listeler

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:

ÖzneNe olduğuÖrnek
statusYönlendirmeler takip edildikten sonra, nihai yanıtın HTTP durum kodustatus isOk
bodyDüz metin olarak yanıt gövdesibody contains "Add to cart"
body.json / body.xml / body.html / body.yamlGövde, ama yalnızca gerçekten o biçimde ayrıştığında; aksi halde özne basitçe mevcut değildirbody.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.hashBayt cinsinden yanıt boyutu, ve gövde içeriğinin bir parmak izibody.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.headToplam yanıt süresi, ve ağ, TLS el sıkışması, DNS ve sunucu düşünme süresi aşamalarıtime lt 2s
redirects / requestsBir 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 URLurl.scheme eq "https"
cert.days.leftTLS 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.

AdNe olduğuTür/değerlerÖrnek
bodyÇözülmüş metin olarak yanıt gövdesi.stringbody contains "Welcome"
headerNihai yanıtın adına göre bir yanıt başlığı.stringheader("Content-Type") isJson
redirectsTakip edilen yönlendirme sıçramaları - nihai öğesi olmayan istek zinciri.collectionredirects.count eq 0
statusYönlendirmeler takip edildikten sonra, nihai yanıtın HTTP durum kodu.numberstatus isOk
body.sizeİndirilen gövdenin bayt cinsinden boyutu.numberbody.size lt 500000
urlTü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).urlurl.host eq "www.example.com"
requestsBu kontrolün yaptığı her istek, sırayla - yönlendirme sıçramaları ve ardından nihai istek.collectionrequests.count le 2
url.hostURL'nin ana bilgisayar bölümü.stringurl.host eq "example.com"
url.pathURL'nin yol bölümü.stringurl.path startsWith "/api"
url.portURL'nin port bölümü.numberurl.port eq 443
url.queryURL'nin sorgu dizesi.stringurl.query contains "token"
url.schemeURL'nin şeması (http veya https).stringurl.scheme eq "https"
body.hashYanıt gövdesinin bir özeti (digest) - içerik değişikliklerini tespit etmek için previous.body.hash ile karşılaştırın.stringbody.hash eq previous.body.hash
httpVersion (ayrılmış - henüz doldurulmadı)Üzerinde anlaşılan HTTP sürümü.stringhttpVersion eq "HTTP/2"
setCookieNihai yanıtın Set-Cookie değerleri, çerez başına bir öğe - birini contains veya matches ile eşleştirin, .count ile sayın.collectionsetCookie exists
steps (henüz kullanılamıyor)Çok adımlı bir kontrolün adımları. Henüz kullanılamıyor.collectionsteps.count le 1
url.originalHerhangi 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).urlurl.original.scheme eq "http"
url.original.hostURL'nin ana bilgisayar bölümü.stringurl.original.host eq "example.com"
url.original.pathURL'nin yol bölümü.stringurl.original.path startsWith "/start"
url.original.portURL'nin port bölümü.numberurl.original.port eq 80
url.original.queryURL'nin sorgu dizesi.stringurl.original.query contains "utm_"
url.original.schemeURL'nin şeması (http veya https).stringurl.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.

AdNe olduğuTür/değerlerÖrnek
body.jsonYanıt gövdesi, ama yalnızca gerçekten JSON olduğunda.stringbody.json exists
body.json.pathJSON gövdesini bir JSONPath ifadesiyle sorgula.jsonbody.json.path("$.status") eq "ok"
body.htmlYanıt gövdesi, ama yalnızca gerçekten HTML olduğunda.stringbody.html exists
body.html.pathSayfa öğelerini bir CSS seçiciyle seç.collectionbody.html.path("h1").first contains "Welcome"
body.regexMetni bir düzenli ifadeyle eşleştir ve yakaladığını al.stringbody.regex("order-(?<id>\\d+)") exists
body.xmlYanıt gövdesi, ama yalnızca gerçekten XML olduğunda.stringbody.xml exists
body.xml.pathXML gövdesini bir XPath ifadesiyle sorgula.stringbody.xml.path("//item/@id") exists
body.html.aSayfadaki her bağlantı.collectionbody.html.a.count gt 0
body.html.linkSayfanın bildirdiği her <link>. Yalın bir anma, bağlantı hedefleri anlamına gelir.collectionbody.html.link.count gt 0
body.html.scriptSayfanın yüklediği her betik. Yalın bir anma, betik kaynakları anlamına gelir.collectionbody.html.script.count gt 0
body.yamlYanıt gövdesi, ama yalnızca gerçekten YAML olduğunda.stringbody.yaml exists
body.yaml.pathYAML gövdesini bir JSONPath ifadesiyle sorgula.jsonbody.yaml.path("$.services.web.image") contains ":1."
body.html.regexMetni bir düzenli ifadeyle eşleştir ve yakaladığını al.stringbody.regex("order-(?<id>\\d+)") exists
body.json.regexMetni bir düzenli ifadeyle eşleştir ve yakaladığını al.stringbody.regex("order-(?<id>\\d+)") exists
body.xml.regexMetni bir düzenli ifadeyle eşleştir ve yakaladığını al.stringbody.regex("order-(?<id>\\d+)") exists
body.yaml.regexMetni bir düzenli ifadeyle eşleştir ve yakaladığını al.stringbody.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.

AdNe olduğuTür/değerlerÖrnek
bindDaha önceki bir regex kuralı tarafından, yakalama adına veya konuma göre yakalanan bir değer.stringbind("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.

AdNe olduğuTür/değerlerÖrnek
timeToplam yanıt süresi: bağlantı + TLS + bekleme + indirme. DNS çözümlemesi dahil değildir.numbertime lt 2000
ttfb (ayrılmış - henüz doldurulmadı)İlk bayta kadar geçen süre.numberttfb lt 200
time.connectTCP bağlantısını kurmak için geçen süre.numbertime.connect lt 500
time.dataYanıt gövdesini indirmek için geçen süre.numbertime.data lt 1000
time.dnsAlan adını çözmek için geçen süre. Yalın time öznesine dahil değildir.numbertime.dns lt 200
time.headYanıt başlıkları için beklenen süre.numbertime.head lt 500
time.tlsTLS el sıkışması için geçen süre.numbertime.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).

AdNe olduğuTür/değerlerÖrnek
connKontrolü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ığı.numberconn.failed eq 0
conn.failedIps (aday - aracılara yayılıyor)Bağlanmayı başaramayan çözülmüş adresler.collectionconn.failedIps.count eq 0
conn.ipYanıtı gerçekte sunan IP adresi.stringconn.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.stringconn.ip.family eq "IPv4"
dnsİzlenen adın DNS çözümlemesi - hangi adreslere çözüldüğü ve hangi sunucunun yanıtladığı.string-
dns.ipsBu kontrol sırasında alan adının çözüldüğü tüm IP adresleri.collectiondns.ips contains "1.2.3.4"
dns.serverÇözümlemeyi yanıtlayan DNS sunucusu.stringdns.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.

AdNe olduğuTür/değerlerÖrnek
cert.days.leftSite sertifikasının süresinin dolmasına kalan gün sayısı.numbercert.days.left gt 14
certSunucunun sunduğu sertifika - süre bitişine kalan gün, veren kuruluş ve kimlik alanları.string-
cert.daysSertifikanın verilmesinden bu yana geçen gün sayısı.numbercert.days gt 0
cert.issuerSite sertifikasını veren sertifika otoritesi.stringcert.issuer contains "Let's Encrypt"
cert.sanSertifikanın geçerli olduğu alan adları.collectioncert.san contains "www.example.com"
cert.serialSertifikanın seri numarası.stringcert.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.stringcert.subject contains "example.com"
tlsGü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.stringtls.cipher contains "AES"
tls.protocolÜzerinde anlaşılan TLS sürümü.stringtls.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.

AdNe olduğuTür/değerlerÖrnek
statusZincirdeki bu isteğin durum kodu.numberstatus eq 200
urlBu isteğin yapıldığı URL.urlurl startsWith "https://"
headerBu 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.stringheader("Content-Type") contains "json"
hstsHeaderBu isteğin Strict-Transport-Security başlığı.stringrequests[0].hstsHeader exists
setCookieBu isteğin Set-Cookie başlık değerleri.collectionsetCookie exists
url.originalHerhangi 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).urlurl.original.scheme eq "http"
url.hostURL'nin ana bilgisayar bölümü.stringurl.host eq "example.com"
url.portURL'nin port bölümü.numberurl.port eq 443
url.pathURL'nin yol bölümü.stringurl.path startsWith "/api"
url.queryURL'nin sorgu dizesi.stringurl.query contains "token"
url.schemeURL'nin şeması (http veya https).stringurl.scheme eq "https"
url.original.hostURL'nin ana bilgisayar bölümü.stringurl.original.host eq "example.com"
url.original.portURL'nin port bölümü.numberurl.original.port eq 80
url.original.pathURL'nin yol bölümü.stringurl.original.path startsWith "/start"
url.original.queryURL'nin sorgu dizesi.stringurl.original.query contains "utm_"
url.original.schemeURL'nin şeması (http veya https).stringurl.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.pathBir body.html.path("selector") CSS sorgusuyla eşleşen bir öğe.
body.html.abody.html.a'dan bir <a> bağlantı öğesi.
body.html.scriptbody.html.script'ten bir <script> öğesi.
body.html.linkbody.html.link'ten bir <link> öğesi.
requestsTam zincirdeki bir istek (yukarıdaki sıçrama-öznesi tablosuna bakın).
redirectsTakip 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:

AdNe olduğuTür/değerlerÖrnek
urlBağlantı hedefi, işaretlemenin yazdığı tam haliyle.stringbody.html.a.url contains "/checkout"
textÖğenin görünür metni.stringbody.html.a.text contains "Sign in"
absoluteBağ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.urlbody.html.a.absolute.scheme in ["https"]
relÖğenin rel özniteliği.stringbody.html.a.where(current.rel eq "nofollow").count eq 0
absolute.hostURL'nin ana bilgisayar bölümü.stringbody.html.a.absolute.host.unique.count le 3
absolute.portURL'nin port bölümü.numberbody.html.a.absolute.port in [443]
absolute.pathURL'nin yol bölümü.stringbody.html.a.absolute.path startsWith "/"
absolute.queryURL'nin sorgu dizesi.stringbody.html.a.absolute.query not contains "session"
absolute.schemeURL'nin şeması (http veya https).stringbody.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).

AdNe olduğuUygulandığı yerÖrnek
eqEş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ürbody.json eq json("{\"ok\": true}")
ltKüçüktür.sayılartime lt 2000
leKüçük eşittir.sayılarcert.days.left le 30
gtBüyüktür.sayılarbody.size gt 0
geBüyük eşittir.sayılarstatus ge 500
containsMetni 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 listebody.json contains json("{\"status\": \"ok\"}")
startsWithMetinle başlar - bir liste üzerinde, HERHANGİ bir öğe başladığında.metinurl.path startsWith "/api"
endsWithMetinle biter - bir liste üzerinde, HERHANGİ bir öğe bittiğinde.metinurl.path endsWith ".json"
matchesMetnin herhangi bir yerinde düzenli ifadeyle eşleşir - bir liste üzerinde, HERHANGİ bir öğe eşleştiğinde.metinbody matches "order-\\d+"
containsAnyListelenen değerlerden en az birini içerir (bir liste üzerinde: bazı öğeler bunlardan birine EŞİTTİR).listebody containsAny ["In stock", "Pre-order"]
containsAllListelenen değerlerin her birini içerir (bir liste üzerinde: her değer bazı öğelere eşittir - tanıklar farklı olabilir).listebody.html.a.text containsAll ["Home", "Contact"]
inListelenen değerlerden veya aralıklardan biridir - bir liste üzerinde, her öğe öyledir.değer(ler) veya aralıkstatus in [200, 301, 302]
existsÖzne mevcuttur.her özneheader("ETag") exists
isNumberDeğer bir sayı olarak okunur.metin veya herhangi biribind("id") isNumber
uniqueListenin yinelenen öğesi yoktur.listedns.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).

AdNeyi daralttığıUygulandığı yerÖrnek
countListenin kaç öğesi olduğu.her koleksiyonrequests.count le 2
minListedeki en küçük sayı.sayısal koleksiyonrequests.status.min ge 200
maxListedeki en büyük sayı.sayısal koleksiyonrequests.status.max lt 500
sumListedeki sayıların toplamı.sayısal koleksiyonrequests.status.sum gt 0
avgListedeki sayıların ortalaması.sayısal koleksiyonrequests.status.avg lt 300
firstListenin ilk öğesi.her koleksiyonredirects.status.first eq 301
lastListenin son öğesi.her koleksiyonrequests.status.last eq status
uniqueYinelenenleri kaldırılmış liste.her koleksiyondns.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.

AdNe anlama geldiğiUygulandığı yerÖrnek
isOkDurum bir başarı kodudur (200-299).status-
isRedirectDurum bir yönlendirme kodudur (300-399).statusstatus isRedirect
isClientErrorDurum bir istemci hatasıdır (400-499).statusstatus isClientError
isServerErrorDurum bir sunucu hatasıdır (500-599).statusstatus isServerError
isJsonİçerik gerçekten JSON'dur.belge veya medya türü metniheader("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ü metnibody 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ü metnibody isHtml
isFormBir 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ü metniheader("Content-Type") isForm
isEmptyHiçbir şey yok: boş bir metin, sıfır boyut veya boş bir liste.metin, boyut veya listebody isEmpty
isNullDeğer null'dur.her değerbody.json.path("$.deletedAt") isNull
absentÖzne hiç mevcut değildir.her özneheader("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çaNe 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şulnot ve nocase dahil, sıradan herhangi bir yüklemBir kuralın en üst düzeyinde çalışan her koşul burada da çalışır.
değerHer öğ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çimNe yaptığıTürÖrnek
whereYalnızca eşleşen öğeleri tutun, sonra oradan devam edin.koleksiyon filtresirequests.where(current.url contains "cart").status.first eq 301
notSonra gelen koşulu tersine çevirir.bayrakbody not contains "error"
nocaseMetni büyük/küçük harfi gözetmeden karşılaştırır.bayrakbody contains "welcome" nocase
currentwhere(…) içinde, filtrelenen tek öğeyi adlandırır.öğe referansı (where içinde)requests.where(current.status eq 301)
rangeHer iki ucu DAHİL bir sayı aralığı.sayı aralığıstatus in [200..299]
listKarşılaştırılacak bir değerler listesi.değer listesistatus in [200, 301, 302]
docLiteralYapı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 metnibody.json contains json("{\"user\": {\"active\": true}}")
implicitExistsYalnı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
index0'dan sayarak, konuma göre bir listenin TEK bir öğesini seçer.0 tabanlı tam sayırequests[0].status
labelKural 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 # metnistatus 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.

AdNe olduğuTü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.numberdelta(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?numberdelta2(time) gt 0
previous (durumsal assertion içeren bir plan gerektirir)Bu öznenin önceki kontrolde sahip olduğu değer.anystatus eq previous.status

Bayraklar: not ve nocase

Kendi başlarına özne veya yüklem olmak yerine bir kurala eklenen iki değiştirici.

BayrakNe yaptığıTürÖrnek
notSonra gelen koşulu tersine çevirir.bayrak (bir kurala eklenir)body not contains "error"
nocaseMetni 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.

AileEşleştiğiEşleşen kısayolÖrnek
jsonapplication/json, text/json, veya +json ile biten herhangi bir medya türü (application/problem+json, application/vnd.api+json, application/ld+json, ...).kısayol: isJsonheader("Content-Type") isJson
xmlapplication/xml, text/xml, veya +xml ile biten herhangi bir medya türü (image/svg+xml, application/atom+xml, ...).kısayol: isXmlheader("Content-Type") isXml
htmltext/html veya application/xhtml+xml.kısayol: isHtmlheader("Content-Type") isHtml
formapplication/x-www-form-urlencoded veya multipart/form-data.kısayol: isFormheader("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:

AdNe olduğuTür/değerlerÖrnek
scalarSorgunun döndürdüğü tek değer (Scalar modu).any-
rowsSorgunun etkilediği veya döndürdüğü satırlar (NonQuery modu).collection-
time.querySorgunun 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:

AdNe olduğuTü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:

AdNe olduğuTür/değerlerÖrnek
time.requestSNMP isteğinin aldığı süre.number-
valueOID'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:

AdNe olduğuTür/değerlerÖrnek
bannerBağ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.regexMetni bir düzenli ifadeyle eşleştir ve yakaladığını al.stringbody.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:

AdNe olduğuTür/değerlerÖrnek
lossYanıt almayan yankı isteklerinin yüzdesi.numberloss eq 0
replyBaşarılı yankı yanıtları.collection-
sentCount (aday - aracılara yayılıyor)Kaç yankı isteği gönderildiği.number-
time.maxEn yavaş yanıtın gidiş-dönüş süresi.number-
time.minEn 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.family ve conn.failedIps, SNMP kontrollerinde value.type, Port kontrollerinde banner.hash ve banner.size, Ping kontrollerinde sentCount, ve Counter kontrolünün kendi time'ı.
  • 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 / delta2 sarmalayı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.

Şimdi kontrol edin

Ücretsiz kontrolü kendi sitenizde çalıştırın - hesap gerekmez.

Web api validation

Bunu sürekli izleyin

Bir sorun çıktığı anda haberdar olun: HostTracker 300’den fazla konumdan kontrol eder ve size e-posta, SMS, Slack, Telegram ve daha fazlasıyla bildirim gönderir.

HostTracker özellikleri

Bu bölümde daha fazlası: İzleme rehberleri: her kontrol türü, adım adım kurulum