NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Alerts for Laravel

Časové limity a chyby

Časový limit kontroly

timeout(5) obmedzí kontrolu na päť sekúnd:

Health::for($team)->monitor(PaymentGatewayCheck::class)
    ->everyMinute()
    ->timeout(5)   // hard abort under CLI with ext-pcntl, post-hoc report elsewhere
    ->save();

V CLI s ext-pcntl — vrátane queue workerov — sa kontrola po uplynutí limitu okamžite preruší cez SIGALRM. Inde (webové SAPI, Windows) ide o dodatočné vyhodnotenie: kontrola dobehne a ak limit prekročila, označí sa ako failed. Kontrola, ktorej vypršal čas, prejde bežnou cestou výsledku failed s výnimkou CheckTimedOut v meta a s údajom timed_out_after.

Alarm kontrolu preruší tak, že do nej vyhodí CheckTimedOut, takže široký catch (Throwable) v kontrole — má ho každá vstavaná kontrola — by ho mohol pohltiť. Časový limit sa aj tak nahlási: keď alarm vypršal, kontrola, ktorá normálne skončí alebo vyhodí inú výnimku, sa zapíše ako výsledok failed pre prekročený limit s timed_out_after v meta. Kontrolu, ktorá opakuje pokusy, alarm druhýkrát nepreruší, takže môže limit prekročiť ešte predtým, než sa výsledok zapíše.

V queue workeri sa vlastný alarm jobu z --timeout zachová: limit kontroly dlhší než čas, ktorý jobu zostáva, ho nikdy nepredĺži, a alarm workera sa po kontrole znova nastaví.

Kontroly odolné voči výnimkám

check() nikdy nepotrebuje try/catch. Akákoľvek vyhodená výnimka sa zmení na čistý výsledok failed a zapíše sa ako bežný alert a beh, takže chybná kontrola nikdy neskončí zlyhaním jobu vo fronte:

Health::define('flaky', function () {
    throw new RuntimeException('upstream exploded'); // becomes CheckResult::failed()
});

// Or build a result from a caught exception yourself:
CheckResult::fromException($e); // status failed; exception class, message and 15 stack frames in meta

Podrobnosti výnimiek zostávajú v logoch

Správa a zásobník volaní výnimky môžu obsahovať hostiteľov, SQL aj prístupové údaje, preto sa predvolene neukladajú ani neposielajú e-mailom. Beh aj alert dostanú správu „Kontrola vyhodila výnimku RuntimeException; podrobnosti sú v aplikačnom logu.“ — text alerts::checks.check_errored, ktorý je v slovenčine aj angličtine — a ponechajú si len meta['exception'], teda triedu. Samotná výnimka sa nahlási vášmu exception handleru, takže skončí vo vašich logoch. CheckResult, ktorý vráti okamžité spustenie, stále nesie všetko:

$result = Health::for($team)->run('flaky');

$result->meta['exception_message'];  // 'upstream exploded' — the caller of a run-now gets everything
$result->storedMessage();            // the message as stored and mailed (≤ CheckResult::MAX_STORED_MESSAGE_LENGTH, 1000)
$result->storedMeta();               // the meta as stored on runs and alerts

$alert = $team->alerts()->open()->first();

$alert->message;                     // 'The check threw RuntimeException; the details are in the application log.'
$alert->meta['exception'];           // 'RuntimeException' — the class is always stored
$alert->meta['timed_out_after'];     // seconds — present only for timeouts
  • Uloží sa: vlastná správa kontroly, text balíka o prekročení časového limitu, meta['exception'] a timed_out_after. Vynechá sa: exception_message, exception_trace a chyba, ktorú zachytila vstavaná kontrola.
  • Vypršaný časový limit sa exception handleru nehlási — jeho text pochádza z balíka a uloží sa. Vstavané kontroly nahlásia zachytenú chybu bez ohľadu na store_exception_details.
  • storedMessage() a storedMeta() vrátia presne to, čo sa uloží pri behoch a alertoch — a čo pošle e-mailom pribalená notifikácia.
  • Vlastná kontrola, ktorá si výnimku zachytí sama, rozhoduje, čo vráti: čokoľvek vloží do správy alebo meta, sa uloží. Ak chcete správanie opísané vyššie, nechajte výnimku vyhodiť.
  • Ak chcete podrobnosti ukladať a posielať ako pred verziou 1.2, nastavte store_exception_details (ALERTS_STORE_EXCEPTION_DETAILS=true, prísny boolean): uloží sa správa výnimky — v stĺpcoch správ najviac 1000 znakov, v meta['exception_message'] celá — a prvých 15 rámcov zásobníka v meta['exception_trace'].

Chránená je len samotná metóda check(). Získanie kontroly (neregistrovaný kľúč) alebo vlastníka (bez HasNotifiablesForAlerts) naďalej vyhodí výnimku a job zlyhá — ide o chyby konfigurácie, o ktorých chcete vedieť.

Výnimky

Všetky sú v RoundlyConsulting\Alerts\Exceptions, okrem výnimky z toolkitu:

VýnimkaKedy nastane
CheckTimedOutKontrola prekročí svoj timeout() — aj keď výnimku sama zachytí. Beh ju zachytí a uloží ako výsledok failed — nikdy neunikne. Nesie verejné vlastnosti key a seconds.
InvalidCronExpressionmalformed(): plán sa ukladá — cez monitor()->save(), schedule() alebo skratky traitu — s výrazom, ktorý nie je platný 5-poľový cron ani podporovaný alias; nič sa neuloží. skipped(): runDue() narazil na uložený riadok, ktorý nevie vyhodnotiť (zapísaný seederom alebo ručne) — výnimka sa nevyhodí, ale nahlási vášmu exception handleru a riadky za ním sa odošlú ďalej.
InvalidHealthCheckdoesntExtendBaseCheck(): registrujete, spúšťate alebo plánujete triedu, ktorá nerozširuje Check. notRegistered(): naplánovaný riadok odkazuje na kľúč — alebo run() dostane kľúč —, ktorý v bežiacom procese nie je registrovaný. ambiguous(): run() dostane triedu registrovanú cez as() pod viacerými kľúčmi — spustite ju podľa kľúča. invalidEscalationThreshold(): eskalačná politika s kľúčom, ktorý nie je celé číslo aspoň 1 — 0, záporné číslo, názov alebo zoznam ['owner', 'team']. invalidIdentity(): meta kľúč z uniqueBy() má hodnotu, ktorá nie je skalár ani null — správa uvádza kľúč, nikdy nie hodnotu. notScheduledFor(): Health::for($owner)->run(), unmonitor() alebo reconfigure() dostane riadok, ktorý patrí inému vlastníkovi.
InvalidRetentiondays(): Health::prune() dostane menej ako 1 deň — zmazal by celú históriu behov. silenceDays(): Health::silences()->prune() dostane menej ako 1 deň. Ide o InvalidArgumentException; nič sa nezmaže.
ScheduleConflictreconfigure() by plán s uniqueBy() presunul na identitu, ktorú drží iný aktívny plán tej istej kontroly. Ide o final RuntimeException, ktorej správa uvádza kontrolu, riadok a meta kľúče identity — nikdy nie ich hodnoty; nič sa nezmení. V HTTP vrstve ju preveďte na odpoveď 409 Conflict.
InvalidNotifiableForHealthCheckVlastník riadka neimplementuje HasNotifiablesForAlerts alebo už neexistuje.
InvalidConfigurationExceptionZ package-toolkit: hodnota v konfigurácii je neplatná — kľúč modelu, ktorý nie je model z balíka ani jeho podtrieda, neznámy key_type, prepínač, ktorý nie je boolean, neznáma schedule.frequency, route.uri alebo route.name, ktoré nie je reťazcom, alebo history.retention_days či silence-retention, ktoré nie je celé číslo aspoň 1. Správa uvádza názov kľúča.

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.