---
title: "Plánovanie kontrol — Alerts for Laravel | Roundly"
description: "Pripojte kontrolu k vlastníkovi cez Health::for($owner)->monitor() — predvoľby, cron, obmedzenie, prahy, tagy, smerovanie a meta."
url: https://roundly-consulting.com/sk/open-source/navody/alerts-for-laravel/planovanie-kontrol
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Alerts for Laravel](https://roundly-consulting.com/sk/open-source/navody/alerts-for-laravel.md)

# 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:

```php
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(). Názov triedy sa rieši cez register, rovnako ako pri run(): riadok sa uloží pod kľúčom inštancie registrovanej pre túto triedu, takže platí as() aj argumenty konštruktora. 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 |

```php
$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 too
```

Splatnosť 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 a 5/15 ako 5-59/15), 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 a prázdnu časť zoznamu, napríklad 5, parser odmietne. Keď je obmedzený deň v mesiaci aj deň v týždni, kontrola beží v deň, ktorý zodpovedá ktorémukoľvek z nich, ako v štandardnom crone — 0 0 1,15 \* MON znamená 1., 15. a každý pondelok.

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:

```php
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:

```php
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. Prah, ktorý nie je celé číslo aspoň 1, vyhodí InvalidHealthCheck. | 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:

```php
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']);
```

```php
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 cez register na kľúč jej registrovanej inštancie a názov predvoľby na cron a výsledok overí — vrátane prahov eskalácie; 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).

Každé z týchto volaní — monitor()->save(), schedule() aj skratky traitu — vloží nový riadok, pokiaľ kontrola nedeklaruje uniqueBy(): vtedy existujúci plán vlastníka aktualizuje na mieste (pozri Identita plánov a zmena nastavení).

## Zoznam a odstránenie plánov

```php
Health::for($team)->monitors();                        // Collection<HealthCheck>, oldest first
Health::for($team)->unmonitor(DiskUsageCheck::class);  // soft-deletes the team's rows, closes their open alerts; returns the count
Health::for($team)->unmonitor($healthCheck);           // one row — refused if it belongs to another owner
```

monitors() 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 a odstráni riadky vlastníka pre danú kontrolu — naplánované aj tie na požiadanie. Alert, ktorý je na odstránenom riadku ešte otvorený, sa zatvorí — bez udalosti HealthCheckRecovered — a job, ktorý už pre riadok čaká vo fronte, ho preskočí. Riadok naplánovaný pre iného vlastníka vyhodí InvalidHealthCheck — handle je bezpečnostná hranica.

## Enum Frequency

```php
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

```php
$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->isDue($since);           // …or at any minute after $since, up to now
$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 again
```

## 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/alerts-for-laravel.md)
