Cron užduočių stebėjimas

Sužinokite iš karto, kai suplanuotos užduotys nustoja veikti. Atsarginės kopijos, eilės darbininkai, ETL užduotys, valandiniai sinchronizavimai – viskas tyliai stebima.

Pridėti heartbeat stebėseną →

Veikimo laiko stebėjimas - DiagnoSEO

Problema su suplanuotomis užduotimis

Kruvina cronų savybė yra ta, kad kai jie nustoja veikti, niekas tau apie tai nepasako. Žiniatinklio programa vis dar aptarnauja užklausas, pagrindinis puslapis atrodo gerai, stebėjimo sistema šviečia žaliai – bet kažkur serveryje naktinė atsarginė kopija nebuvo atlikta jau dvi savaites. Queue worker’is užlūžo po deploy ir neįvykdyti darbai pradeda kauptis. Sinchronizacija kas valandą tyliai praranda eilutes dėl leidimų problemos. Sužinai tik tada, kai kažkas žemiau galiausiai nustoja veikti – dažniausiai būtent tada, kai labiausiai reikia. Duomenų komanda nori eksporto, pagalba – el. laiškų eilės, ops – atsarginės kopijos. Tada jau per vėlu.

Standartinis veikimo laiko stebėjimas to nepagaus, nes nėra ko pinginti. Cron’as neiškelia HTTP endpoint’o, neatidaro porto, nepaleidžia serverio. Jis įsijungia, baigia darbą, baigia. Jei nustoja veikti – nėra jokio signalo apie jo nebuvimą, kol nepradėsi ieškoti.

Atvirkštinis šablonas: heartbeat stebėjimas

Heartbeat stebėjimas (taip pat vadinamas „dead man’s switch“ arba „cronų stebėjimas“) pakeičia kryptį. Vietoj to, kad mes tikrintume tavo paslaugą, tavo paslauga atsiskaito mums. Pridedi vieną eilutę į crono užduotį – curl į unikalų URL, kurį mes sugeneruojame – o šis URL įrašo laiko žymą su kiekvienu pranešimu. Mes stebime šių pingų nebuvimą. Jei URL negauna užklausos tikėtinu intervalu (plius marža), laikome tai praleidimu ir siunčiame įspėjimą.

Modelis yra paprastas, patikimas ir nepriklauso nuo kalbos. Viskas, kas gali atlikti HTTP užklausą – integruojama. Bash per curl, Python per requests, Node per fetch, PHP per curl_init, Windows užduočių planuoklis per Invoke-WebRequest, GitHub Actions, Kubernetes CronJobs, Lambda suplanuoti įvykiai – kas tik nori. Be SDK, be agento, be jokio diegiamo demono.

Kaip sukonfigūruoti

DiagnoSEO Veikimo laiko stebėjime spausk „Pridėti monitorių“, pasirink tipą „Heartbeat / cron“. Įrankis sugeneruos unikalų URL su tokenu – kažkas tokio kaip https://app.diagnoseo.com/tools/uptime-monitoring/hb.php?t=abc123xyz9. Nustatyk pageidaujamą intervalą (kaip dažnai turi veikti užduotis, minutėmis) ir maržą (kiek vėluojantis vykdymas dar priimtinas, kol sunerimsite). Išsaugok.

Dabar paredaguok crono užduotį, kad po kiekvieno sėkmingo vykdymo patikrintų URL. Trys stiliai pagal aplinką:

# Bash cron - ping tik sėkmės atveju
0 3 * * * /usr/bin/backup.sh && curl -fsS https://app.diagnoseo.com/tools/uptime-monitoring/hb.php?t=abc123xyz9 > /dev/null

# Arba kai dalinė sėkmė yra tinkama
0 3 * * * /usr/bin/backup.sh; curl -fsS https://app.diagnoseo.com/tools/uptime-monitoring/hb.php?t=abc123xyz9 > /dev/null

# Python
import requests
def main():
    do_the_work()
    requests.get('https://app.diagnoseo.com/tools/uptime-monitoring/hb.php?t=abc123xyz9', timeout=5)

# GitHub Actions
- name: Notify heartbeat
  if: success()
  run: curl -fsS https://app.diagnoseo.com/tools/uptime-monitoring/hb.php?t=abc123xyz9

Nuo šiol kiekvienas sėkmingas bėgimas siunčia mums ping, o mes įrašome laiko žymą. Jei per intervalas + marža minučių nepamatysime pingo, atidaromas incidentas ir siunčiami pranešimai visais įjungtais kanalais: Email, Telegram, Slack, Discord, SMS.

Intervalo ir maržos pasirinkimas

Intervalas turi idealiai tikti užduoties tvarkaraščiui. Naktinis backup 3:00 – 1440 minučių (24h) intervalas. Sinchronizacija kas valandą – 60. Worker’is, pinginantis kas 5 min – 5.

Marža sugeria natūralų vėlavimą. Cronai nesileidžia tiksliai kas nanosekundę – jie būna išrikiuojami, laukia, kol baigs ankstesnis bėgimas, daro trumpas pauzes esant laikiniems nesklandumams. 24 valandų užduočiai su 1h marža – patogus buferis be delsos įspėjimų. 5 min worker’is su 2 minučių marža fiksuoja tikras avarijas greitai, be klaidingų signalų dėl 30 sek. nukrypimų. Apibendrintai: nustatyk maržą 10–50 % intervalo priklausomai nuo to, kiek svyruoja užduoties laikas.

Šablonai, kuriuos rekomenduojame

  • Pinguoti tik po sėkmingo vykdymo. Naudok && bash’e – bėgimas, kuris nepavyko, nepinguoja. Mes aptiksime negaunamą ping ir įspėsime.
  • Pinguoti po kiekvienos ciklo iteracijos. Ilgai veikiančioms worker užduotims pinguokite ciklo viduje po kiekvienos darbo vieneto, o ne tik pabaigoje. Taip aptinkamas užstrigęs worker’is bėgimo metu.
  • Vienas heartbeat vienai loginei užduočiai, o ne kiekvienam skriptui. Jei trys skriptai sudaro vieną naktinį pipeline, pinguok vieną kartą grandinės pabaigoje. Tai duoda aiškų signalą „ar pipeline veikia“.
  • Derink su logais. Heartbeat parodo, kad užduotis paleista. Programos log’ai nurodo, ką ji padarė. Kartu gausi visą vaizdą.

Kas nutinka, kai heartbeat dingsta

Incidentas atidaromas, kai praeina deadline. Skydelyje monitorius pažymimas raudonai su klaida „Heartbeat nėra jau X minučių“. Pranešimai siunčiami visais kanalais, kuriuos įjungėte. Kai frešias heartbeat pasiekia mus, monitorius automatiškai grįžta į up – pažymimas kaip up, incidentas uždaromas, o (jei įjungėte atkūrimo įspėjimus) gaunate pranešimą „vėl veikia“.

Visa tai veikia taip pat kaip ir kiti monitoriai – heatmap, uptime procentas, istorija, žymos, paieška, eksportas. Iš skydelio perspektyvos heartbeat monitorius yra tiesiog dar viena eilutė, rūšiuojama ir filtruojama kartu su HTTP, ping, port ir API.

Kontrolinis sąrašas

Pridėkite monitorių → tipas Heartbeat → nukopijuokite sugeneruotą URL → pridėkite prie crono / workerio / planuoklio → nustatykite intervalą ir maržą → išsaugokite → viskas. Dabar sužinosite akimirksniu, kai suplanuota užduotis nustos veikti – o ilgainiui tai yra vienas iš svarbiausių veikimo stebėjimo sprendimų, kuriuos galite priimti.

Dažniausiai užduodami klausimai

  • Atvirkštinis stebėjimas — tavo suplanuota užduotis pingina mūsų URL, kai sėkmingai įvyksta. Jei per laukiamą langą jos neišgirstame, siunčiame įspėjimą. Tai išsprendžia „tylių gedimų“ problemą: sugedęs cron job nesukuria klaidos ir nesukelia įprasto veikimo laikų įspėjimo.

  • Pridėkite curl -fsS <heartbeat_url> komandos pabaigoje crone. Jei prieš jį esanti komanda nepavyks, curl nebus paleistas ir heartbeat bus praleistas. Alternatyviai pinginkite tiek pradžioje, tiek pabaigoje skirtingais URL – tai suteikia atskirus signalus „pradėta“ ir „baigta“.

  • Maždaug 2–3 kartus ilgesnį už tipišką užduoties įvykdymo trukmę. Jei paros backup’as trunka 30 minučių, nustatykite malonės laiką 90 minučių – tai apima lėtinimus be klaidingų įspėjimų. Kintančio laiko užduotims rinkitės dosniai ir naudokite skydelį atipiniams atvejams identifikuoti.

  • Taip – nustatykite intervalą pagal grafiką (pvz., 60 minučių su 15 minučių malonės laiku). Monitorius lauks pingo ne rečiau kaip kas 75 minutes. Jei jūsų užduotis dažnesnė (kas 5 minutes), heartbeat URL taip pat tinka – tiesiog priderinkite intervalo nustatymą.

  • Taip. Pridėkite išeinančią HTTP užklausą į heartbeat URL Lambda funkcijos pabaigoje. Monitorius elgiasi lygiai taip pat kaip cron heartbeat – tie patys įspėjimai, ta pati malonės trukmė. Ypač naudinga suplanuotoms L ambdoms, kur CloudWatch įspėjimai nepagauna tylių vykdymo klaidų.

Pridėti heartbeat stebėseną →

Atrakinkite aukštesnes pozicijas ir kokybišką srautą

Auginkite savo verslą su geriausia dirbtiniu intelektu pagrįsta visapuse SEO ir turinio rinkodaros programine įranga.

Atnaujinti į Advanced