Plánovanie kontrol
Health::for($owner) obmedzí všetky operácie na jedného vlastníka. Použite jeho fluentný builder s predvolenými frekvenciami a triedou kontroly — bez magických reťazcov:
use RoundlyConsulting\Alerts\Facades\Health;
$team = Team::first();
Health::for($team)->monitor(DiskUsageCheck::class)
->everyFiveMinutes()
->throttle(maxAttempts: 2, decayMinutes: 60)
->meta(['server_id' => '2d4fcdff-9787-49b1-8b73-3d411f80ae1b'])
->save();
// The same builder through the model trait:
$team->monitorCheck(DiskUsageCheck::class)->everyFiveMinutes()->save();monitor() prijme názov triedy Check alebo registrovaný kľúč — kľúč inline kontroly alebo inštancie registrovanej cez as(). Pri inline kontrole builder začne od volieb deklarovaných v define(). Existujúca trieda, ktorá nerozširuje Check, vyhodí InvalidHealthCheck. save() uloží a vráti riadok HealthCheck.
Frekvencie
| Metóda | Uložená frekvencia |
|---|---|
everyMinute() | * * * * * (predvolené) |
everyFiveMinutes() | */5 * * * * |
everyTenMinutes() | */10 * * * * |
everyFifteenMinutes() | */15 * * * * |
everyThirtyMinutes() | */30 * * * * |
hourly() | @hourly |
daily() | @daily |
weekly() | @weekly |
monthly() | @monthly |
frequency(string) | názov predvoľby (hourly, everyFiveMinutes, yearly, …) prevedený cez Frequency::toCron(), alebo cron reťazec |
cron(string) | výraz presne tak, ako ho zadáte |
$monitors = Health::for($team);
$monitors->monitor(DiskUsageCheck::class)->hourly()->save();
$monitors->monitor(DiskUsageCheck::class)->frequency('hourly')->save(); // preset by name
$monitors->monitor(DiskUsageCheck::class)->frequency('everyFiveMinutes')->save();
$monitors->monitor(DiskUsageCheck::class)->cron('15 3 * * *')->save(); // 03:15 every day
$monitors->monitor(DiskUsageCheck::class)->cron('0 9-17 * * 1-5')->save(); // hourly, office hours
$monitors->monitor(DiskUsageCheck::class)->cron('0 9 * * MON-FRI')->save(); // day and month names work tooSplatnosť vyhodnocuje malý natívny parser cronu: päť polí (minúta, hodina, deň v mesiaci, mesiac, deň v týždni) s *, zoznamami (1,2,3), rozsahmi (1-5) a krokmi (*/5, 1-30/2), názvami dní a mesiacov (MON-FRI, JAN,JUL — bez ohľadu na veľkosť písmen) a aliasmi @yearly, @annually, @monthly, @weekly, @daily, @midnight a @hourly. Nedeľu označuje 0 aj 7.
Výrazy sa overujú pri save(): výraz, ktorý plánovač nevie vyhodnotiť, vyhodí InvalidCronExpression a nič sa neuloží — cron reťazec od používateľa teda zlyhá už tam, kde ho ukladáte:
use RoundlyConsulting\Alerts\Exceptions\InvalidCronExpression;
try {
Health::for($team)->monitor(DiskUsageCheck::class)->cron($expression)->save();
} catch (InvalidCronExpression $e) {
// The scheduler could not evaluate it — nothing was stored.
}Riadok zapísaný inak — seederom alebo ručne — sa kontroluje pri behu: Health::runDue() riadok s cronom, ktorý nevie vyhodnotiť, preskočí, nahlási ho vášmu exception handleru a riadky za ním odošle ďalej.
Všetky voľby
Ten istý builder prijíma tlmenie kolísania, potvrdenie obnovy, časový limit kontroly, tagy, smerovanie kanálov a eskalačnú politiku:
use RoundlyConsulting\Alerts\Checks\DatabaseCheck;
Health::for($team)->monitor(DatabaseCheck::class)
->everyFiveMinutes()
->failAfter(3) // open only after 3 consecutive failures
->recoverAfter(2) // close only after 2 consecutive OKs
->timeout(5) // mark failed after 5 seconds
->tags(['critical', 'db']) // group + filter
->notifyVia(['database']) // channels for the default notification
->notifyVia(['mail', 'database'], level: 3) // override channels at escalation level 3
->escalate([1 => 'owner', 3 => 'team', 5 => 'oncall'])
->throttle(maxAttempts: 3, decayMinutes: 10)
->save();| Metóda | Účinok | Predvolené |
|---|---|---|
throttle(int $maxAttempts, int $decayMinutes) | Najviac maxAttempts notifikácií za decayMinutes na príjemcu pre tento riadok. | 1 za 1 minútu |
failAfter(int) | Počet po sebe idúcich zlyhaní, kým sa otvorí alert (hodnoty pod 1 sa zaokrúhlia na 1). | 1 |
recoverAfter(int) | Počet po sebe idúcich úspechov, kým sa otvorený alert zatvorí. | 1 |
timeout(int $seconds) | Časový limit pre check(); prekročenie sa stane výsledkom failed. | žiadny |
tags(array) | Tagy na zoskupenie, filtrovanie reportov a stlmenie (bez duplicít). | [] |
notifyVia(array $channels, ?int $level = null) | Kanály pribalenej notifikácie — globálne alebo pre jednu eskalačnú úroveň. | mail, database |
escalate(array $policy) | Eskalačná politika: prah po sebe idúcich zlyhaní ⇒ skupina príjemcov. | escalation z configu |
meta(array) | Vaše vlastné dáta, v kontrole dostupné ako $this->healthCheck->meta. | [] |
save() | Uloží a vráti riadok HealthCheck. | — |
Deklaratívne voľby sa ukladajú do meta riadka pod rezervovanými kľúčmi — fail_after, recover_after, timeout, notify_via, notify_via_levels a escalation — vedľa vašich vlastných meta údajov. Tieto názvy v meta() nepoužívajte. Voľby s predvolenou hodnotou sa nezapisujú.
Plánovanie z DTO
schedule() prijme ScheduleHealthCheckData a trait ponúka to isté volanie ako skratku:
use RoundlyConsulting\Alerts\DataTransferObjects\ScheduleHealthCheckData;
Health::for($team)->schedule(new ScheduleHealthCheckData(
check: DiskUsageCheck::class, frequency: 'hourly', maxAttempts: 2, decayMinutes: 60,
));
// Trait shortcuts for the same call:
$team->monitor(new ScheduleHealthCheckData(check: DiskUsageCheck::class, frequency: 'hourly'));
$team->createHealthCheck('disk_usage_check', '*/5 * * * *', maxAttempts: 2, decayMinutes: 60, tags: ['db']);new ScheduleHealthCheckData(
string $check, // Check class-string or registered key
string $frequency = '* * * * *', // preset name or cron
int $maxAttempts = 1,
int $decayMinutes = 1,
int $failAfter = 1,
int $recoverAfter = 1,
?int $timeout = null,
array $tags = [],
?array $notifyVia = null,
array $notifyViaLevels = [], // [level => channels]
array $escalation = [], // [threshold => group]
array $meta = [],
);DTO prevedie názov triedy na kľúč a názov predvoľby na cron a výsledok overí; platný cron reťazec uloží bez zmeny. createHealthCheck() je skratka s pozičnými argumentmi, ktorá zostaví to isté DTO a naplánuje ho cez Health::for($this).
Zoznam a odstránenie plánov
Health::for($team)->monitors(); // Collection<HealthCheck>, oldest first
Health::for($team)->unmonitor(DiskUsageCheck::class); // soft-deletes the team's schedules; returns the count
Health::for($team)->unmonitor($healthCheck); // one row — refused if it belongs to another ownermonitors() vypíše len naplánované riadky — riadky na požiadanie, ktoré si drží run(), vynechá. unmonitor() prijme názov triedy kontroly, registrovaný kľúč, inštanciu Check alebo riadok HealthCheck. Riadok naplánovaný pre iného vlastníka vyhodí InvalidHealthCheck — handle je bezpečnostná hranica.
Enum Frequency
use RoundlyConsulting\Alerts\Enums\Frequency;
Frequency::toCron('everyFiveMinutes'); // '*/5 * * * *' (names match case-insensitively)
Frequency::toCron('yearly'); // '@yearly'
Frequency::toCron('15 3 * * *'); // anything else is returned unchanged
Frequency::Hourly->value; // '@hourly'
Frequency::names(); // Collection: EveryMinute, EveryFiveMinutes, …Frequency má rovnaké pomocné metódy z enums-for-laravel ako Status. Jeho hodnoty sú cron reťazce, preto výberové polia stavajte z names() alebo z mapy frequencies() kontroly, nie z labels().
Práca s riadkom
$row = $team->healthChecks()->first();
$row->health_check; // 'disk_usage_check'
$row->frequency; // '*/5 * * * *'
$row->consecutive_failures; // flap counter
$row->effectiveTags(); // row tags merged with the check's own tags()
$row->isScheduled(); // false for an on-demand (run-now) row
$row->isDue(); // is the cron due this minute? (never for an on-demand row)
$row->options()->failAfter(); // declarative options read back from meta
$row->dispatchHealthCheckJob(); // queue a run right now, due or not
$row->delete(); // soft delete — the scheduler skips it
$row->restore(); // and picks it up againPrejavte 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 kryptomienOdoslaní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.