Alert builder + Maintenance
/alerts propose trois vues : Alerts (incidents live), Rules (constructeur de règles), Maintenance (fenêtres downtime). Le worker d’évaluation tique toutes les 60s et vérifie chaque règle activée.
Une règle est {target, metric, operator, threshold, duration, severity}. Le worker ne fire que si la condition tient ≥duration_secs continu pour une paire (règle, agent).
all— tous les agents actifs du tenantagents— agent-id sélectionnéstag— agents avec ce tag (ex.production)
Par agent :
| metric | source | unité |
|---|---|---|
cpu_pct |
dernière cpu_metrics.cpu_percent |
% |
mem_pct |
dernière memory_metrics.mem_used / mem_total × 100 |
% |
disk_pct |
MAX sur disk_metrics.used_bytes / total_bytes × 100 par mount, 5min |
% |
load_avg |
dernière cpu_metrics.load1 |
|
network_rx_mbps / network_tx_mbps |
SUM network_metrics.{rx,tx}_bytes_per_sec / 125000, 90s |
Mbps |
agent_offline |
EPOCH(NOW - last_seen_at) | sec |
container_status |
COUNT containers status≠‘running’ (ou container_name spécifique) | |
process_running |
COUNT process_samples rows avec name=X, 2min |
|
anomaly_cpu_pct / anomaly_mem_pct / anomaly_load_avg |
z-score de la moyenne sur 15 min par rapport à la baseline de l’hôte pour l’heure UTC courante | σ |
Les règles d’anomalie ne comparent pas à un seuil fixe mais au
comportement normal de cet hôte à cette heure de la journée. Le
BaselineWorker recalcule deux fois par jour un profil par heure
(moyenne + écart-type sur les 30 derniers jours) par agent. Une règle
anomaly_cpu_pct > 3 ne se déclenche donc que si le CPU dépasse de plus
de 3σ le niveau habituel pour cette heure. Les hôtes sans baseline
(moins de quelques jours d’historique) restent silencieux ; un plancher
d’écart-type (5 % CPU, 3 % mémoire, 0.3 load) évite qu’un hôte inactif
alerte à la moindre ondulation.
Fleet (agrégats multi-agents) :
| metric | source |
|---|---|
fleet_offline_count |
COUNT agents in target-set avec last_seen_at < NOW - 90s |
fleet_critical_alerts |
COUNT unresolved critical alerts last 15min |
tag_offline_pct |
(offline / total) × 100 dans la target-set |
Les règles fleet émettent une seule alerte par cycle, attribuée au premier agent de la cible.
Operators
Section intitulée « Operators »>, >=, <, <=, ==, !=.
Duration
Section intitulée « Duration »duration_secs=0 fire dès dépassement. >0 exige que la condition tienne ≥X secondes consécutives. Le worker tracke par (rule_id, agent_id) dans alert_rules.pending_since JSONB. Au clear → key supprimée.
Templates quick-start
Section intitulée « Templates quick-start »Dans l’UI (modale + New rule), 8 templates. Clic pour pré-remplir :
- Sustained high CPU >85% for 1h
- Memory >95% for 5m (critical)
- Disk usage >90% (critical)
- Load avg >10 for 10m
- Agent offline >5m (critical)
- Network TX >100 Mbps for 5m
- Production container not running (target_type=tag, tag=production)
- Fleet incident ≥3 production agents offline (fleet rule)
Fenêtres de maintenance
Section intitulée « Fenêtres de maintenance »Silence temporaire de toutes les sources d’alerte (rules, process_dna, honeypot, heartbeat-silence) pour une target-set. Use-case : rolling deploy de vos flows → window 30min → pas de pages.
maintenance_windows name text not null starts_at timestamptz ends_at timestamptz target_type 'all' | 'agents' | 'tag' target_filter jsonb -- {agent_ids: [...]} | {tag: "..."} silence_categories text[] -- vide = tout silenceDétail important : chaque alerte tombant dans la window, pas seulement les rule-alerts, est supprimée. Cela passe par un helper central InsertAlert(...) dans la hub qui contrôle chaque insertion contre isUnderMaintenanceForCategory.
Catégories whitelistables dans silence_categories (ex. laisser passer les security-alerts pendant un upgrade routine) :
rule— triggers de l’alert buildersecurity— process DNA, honeypotheartbeat— agent offlinecompliance— control failurescve— nouveaux CVE matches
Pas de silence_categories (array vide) = tout silence.
Canaux de notification
Section intitulée « Canaux de notification »notify_channels sur une règle est un array d’IDs webhook ou strings. Sur rule-fire :
- Insert dans
alertsaveccategory='rule' NotifyWorkerramasse en 5s, push versntfypour severity=critical- Webhook deliveries vers chaque subscription abonnée à
alert.<severity>oualert.*
Les payloads webhook sont signés HMAC-SHA256 avec le secret de subscription dans le header X-Monsys-Signature. Failed deliveries retryées en exponential jusqu’à 1h (webhook_outbox).
Chaque POST/PUT/DELETE /api/v1/alert-rules* et */maintenance-windows* écrit dans audit_log avec method, path, status, resource_id, payload (secrets scrubbés via regex).