Keyword check: HTML-жауапта түйін сөзді тексеру

4 мин чтения
Обновлено 12 мая 2026

Keyword check — HTTP-мониторларға қосымша тексеру: статус-кодты бақылаумен қатар Tracker.ru жауаптың денесінде берілген подстрингті іздейді және URL-ды подстринг табылған кезде ғана жұмысқа жарамды деп санайды. Бет 200 OK қайтарған, бірақ күтілген сөз жоғалған болса — URL down күйіне ауысады және хабарламалар жіберіледі.

Бұл сервер техникалық тірі болғанда, ал контент бұзылған бір топ инциденттерді жабады: бос шаблон, деплойдан кейінгі ақ бет, reverse-proxy-ден заглушка, дефейс немесе істемейтін feature-flag панелі. Keyword check-сіз мұндай жағдайлар HTTP-мониторингтен үнсіз өтіп кетеді.

Keyword check қашан керек

  • Anti-deface. Подстринг — сайтта әрқашан болуға тиіс ерекше мәтіннің фрагменті (мысалы, подвалдағы copyright). Шабуылшы басты бетті ауыстырса — keyword табылмайды, алерт кетеді.
  • Feature-flag SLO. Бетте Feature: enabled сияқты маркер бар. Feature flag сынғанда және бет маркерсіз 200 қайтарғанда — мониторинг регрессияны ұстайды.
  • 200-де шаблонды бақылау. Кэш ескірген HTML берді, фронтенд сынды, бірақ статус әлі 200 — күтілетін блоктағы keyword (пайдаланушы аты, нав-меню, нақты тақырып) бірден бір нәрсе дұрыс емес екенін айтады.
  • Status page. Жұртшылыққа арналған status-page-те «All systems operational» сияқты сөз тіркесі болады. Осы тіркес бойынша keyword-check оны «бәрі дұрыс па» мониторына айналдырады.
  • Деплой нұсқасының маркері. Footer-де немесе meta-тегте нұсқа нөмірі (v1.42.0). Деплой өтпей кетсе — нұсқа жаңартылмаса — алерт.

Қалай баптау керек

URL өңдеу формасында «Күтілетін түйін сөз» өрісін (expected_keyword) толтырыңыз. 255 таңбаға дейін кез келген подстрингті енгізуге болады: фраза, HTML-разметка фрагменті, footer-дан мәтін, CSS класының аты — күтілетін бетте міндетті түрде кездесетін кез келген нәрсе.

API арқылы:

curl -X POST https://tracker.ru/api/v1/urls \
  -H "Authorization: Bearer <api_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/status",
    "monitor_type": "http",
    "period": 60,
    "expected_keyword": "All systems operational"
  }'

Ұзындық лимиті — 255 таңба (StoreUrlRequest-те max:255). Бұл ерекше фрагмент үшін жеткілікті; бүкіл HTML-ды өріске тықпаңыз — фронтендіңіз жұмыс істеп тұрған нұсқада көрсетуге кепілдік беретін минималды-жеткілікті подстрингті сақтаңыз.

Іске қосылу логикасы

expected_keyword берілген әрбір HTTP-тексеру схема бойынша өңделеді:

  1. Чекер HTTP-сұрау жасайды.
  2. Жауапты алады, денесін оқиды (төмендегі шектеулерді ескере отырып).
  3. Денеде подстрингті іздейді — case-insensitive substring match.
  4. Подстринг табылмасаkeyword_not_found = true жалаушасын көтереді, нәтижені Ok = false етіп қояды, қателік: Expected keyword not found: <keyword>. URL down күйіне ауысады.
  5. Подстринг қайта пайда болғанда — keyword_not_found ысырылады, URL қалпына келеді, қалпына келу хабарламасы жіберіледі.

check_log кестесінде әр тексеру үшін keyword_not_found жалаушасы сақталады — бұл URL журналында «статус бойынша құлады» мен «keyword бойынша құлады» арасын ажыратуға мүмкіндік береді.

Техникалық нюанстар

  • HEAD → GET автоматты ауысу. Әдепкі бойынша Tracker.ru HEAD HTTP-әдісін қолданады — ол тексерілетін сайт үшін жылдамырақ және арзанырақ. Бірақ HEAD-жауапта body жоқ, онда keyword іздейтін ештеңе жоқ. Сондықтан expected_keyword берілсе, чекер әдісті автоматты түрде GET-ке ауыстырады (http_checker.go:108-110). Пайдаланушы жағында ешқандай баптау қажет емес. Формада HEAD айқын таңдалса — ол еленбейді және осы URL үшін GET-пен ауыстырылады.
  • Case-insensitive. Іздеу регистрге сезімтал емес. Екі жағы — keyword пен жауап денесі — strings.ToLower арқылы (http_checker.go:168) кіші регистрге келтіріледі. Яғни Operational, operational, OPERATIONAL — бір нәрсе. Ыңғайлы: тақырып регистрін кездейсоқ ауыстырғанда сынбайды.
  • Plain substring, regex емес. Өрістің мәні — қарапайым жол. Метасимволдар, топтар, якорлар жоқ. Подстрингтің әріпті көрінісі ізделеді. Regex қажет болса — keyword-check сізге сай емес, кастом webhook-чекерлерге не health-эндпоинтке қараңыз.
  • Body 1 MB лимиті. Чекер денені io.LimitReader(resp.Body, 1<<20) арқылы оқиды — яғни жауаптың тек алғашқы мегабайтын (http_checker.go:164). Keyword іздеу осы мегабайтта ғана жүреді. HTML-ыңыз 1 MB-тан үлкен болса — күтілетін сөзді бет басына жақын қойыңыз (<head>-те немесе <body>-дан кейін бірден), әйтпесе ол лимиттен тыс болып, URL үнемі жалған keyword_not_found алерт береді. Іс жүзінде 1 MB — бір бет үшін өте көп, мәселе сирек туындайды.
  • UTF-8. Кириллица, қытайдың иероглифтері, эмоджи keyword-те қолдау табады — салыстырылатын екі байт ағыны UTF-8 жолы ретінде өңделеді. Laravel валидаторы max:255 mb_strlen қолданады — лимит таңбамен өлшенеді (көп байттық таңбаларды қоса), байтпен емес. Көптеген практикалық сценарийлер үшін 255 таңба жеткілікті.
  • TCP-мониторингпен үйлесімділік. expected_keyword өрісі тек monitor_type=http үшін қолжетімді. TCP-чектер үшін еленбейді — TCP-да body жоқ, іздейтін жер жоқ. Толығырақ — /docs/features/tcp-monitoring?lang=kk.

Хабарламалар

Keyword жоғалғанда таңдалған арналарға себебін айқын көрсететін хабарлама кетеді — ол әдеттегі «status 5xx» алертінен ерекшеленеді:

Сайт қолжетімсіз! https://example.com/status
Қателік: Күтілетін түйін сөз табылмады
Күтілді: "All systems operational"
Қолжетімсіз 2026-05-01 19:15:09 бастап

Webhook-payload-та error_status өрісі keyword_not_found мәнін қабылдайды — бұл инцидент-flow-ды бөлуге ыңғайлы: keyword-құлаулар көбіне 5xx-тен басқа реакция түрін талап етеді (мысалы, SRE емес, фронтенд командасын шақыру).

Қалпына келгенде (keyword жауапқа қайтып келгенде) downtime ұзақтығын көрсететін әдеттегі recovery-хабарлама келеді.

Байланысты мақалалар