Alerter depuis la console
Déclarer règles, webhooks signés et résumés dans les valeurs de la console, régler les règles intégrées et vérifier la signature.
GuideExploitationDepuis la version 1.3.0
Sur cette page
Guide d'exploitation : configurer, déployer et observer la passerelle. Ce que fait la fonctionnalité côté produit : guide produit ; l'appeler : guide développeur.
La console évalue ses règles toutes les 15 s, dans les deux modes, et notifie par webhook signé. Rien n'est saisi dans la console : règles, webhooks et résumés sont déclarés dans les valeurs du chart, relus sans redémarrage ; une version invalide est refusée et dite à l'écran Alertes, la précédente s'applique.
Étapes
Déclarer règles, webhooks et résumés
Écrire les règles, les webhooks et les résumés dans les valeurs de la console :
values.yaml
# Valeurs de la console alerts: rules: # sortes fermées : error_rate, p95, breaker_open, slo_burn, new_error_code - { name: reports-5xx, kind: error_rate, upstream: reports, threshold: 5%, for: 1m, notify: [ops] } - { name: orders-p95, kind: p95, operation: createOrder, threshold: 300ms, for: 2m } webhooks: # https exigé (allowHttp pour le lever) ; secretFile : whsec_<base64>, une ligne par secret - { name: ops, url: "https://hooks.example/flexway", secretFile: /etc/flexway-console-alerts/ops } - { name: chat, urlFile: /etc/flexway-console-alerts/chat-url, secretFile: /etc/flexway-console-alerts/chat, allowPrivate: true } summaries: - { name: weekly, every: weekly, at: "07:00", weekday: monday, webhook: chat } # heure UTC existingSecret: console-alerts # secrets et URL à jeton, montés sur /etc/flexway-console-alerts slos: - { operation: createOrder, availability: 99.9%, latency: { p95: 300ms, target: 99% }, window: 30d } - { name: orders-api, upstream: orders-svc, availability: 99.5% } # un groupe : voir Objectifs SLO par groupe d'opérationsMettre les secrets et les URL à jeton dans le
Secretnommé parexistingSecret.Déployer les valeurs : la console relit le fichier sans redémarrer.
Régler les règles intégrées
Régler une règle intégrée plutôt que la taire - quelques cas :
values.yaml
alerts:
builtins:
# Resserrer : un petit trafic de publications sonne trop tôt ; 5 % refusés, à partir de 100 publications.
- { name: broker-backpressure, threshold: 5%, minRequests: 100 }
# Retarder : un courtier qui bascule en moins de 3 min n'est pas un incident.
- { name: broker-unavailable, for: 3m }
# Plus tôt : un coupe-circuit ouvert sonne déjà sans délai ; une passerelle dégradée, au bout de 30 s.
- { name: gateway-degraded, for: 30s }Avec le proxy Kafka natif (depuis 1.6.0), la règle kafka-proxy-refusals compte des causes fermées et
accepte excludeCauses (Clients Kafka natifs : clusters virtuels par tenant) :
values.yaml
alerts:
builtins:
- { name: kafka-proxy-refusals, threshold: 10%, excludeCauses: [quota] } # ne pas sonner sur un quota atteintAvec l'écouteur MQTT des appareils (depuis 1.7.0), cinq règles de plus - device-connections-refused,
sparkplug-node-offline, mqtt-listener-saturation, device-throttled et sparkplug-sequence-gaps, ces deux
dernières désactivées par défaut ; le threshold des deux règles Sparkplug est un nombre, pas une part
(Console : l'écran Appareils).
Vérifier la signature côté destinataire
Le corps : {"type": "flexway.alert.firing", "timestamp": ..., "data": {"rule", "kind", "state", "since", "target", "value", "unit", "threshold", "subjects"}} (flexway.alert.resolved, flexway.summary.daily,
flexway.summary.weekly) - jamais un tenant. Vérifier la signature (Standard
Webhooks) avant tout traitement :
import base64, hashlib, hmac, time
def verify(secret: str, headers, body: bytes) -> bool:
key = base64.b64decode(secret.removeprefix("whsec_"))
msg_id, ts = headers["webhook-id"], headers["webhook-timestamp"]
if abs(time.time() - int(ts)) > 300: # rejeu : 5 minutes de tolérance
return False
mac = hmac.new(key, f"{msg_id}.{ts}.".encode() + body, hashlib.sha256).digest()
want = base64.b64encode(mac).decode()
# deux signatures pendant une rotation, séparées par une espace : une seule doit correspondre
return any(hmac.compare_digest(sig.removeprefix("v1,"), want)
for sig in headers["webhook-signature"].split())Faire tourner un secret
- Mettre le nouveau secret en seconde ligne du fichier côté console.
- Déployer le nouveau côté destinataire.
- Retirer l'ancien - la console signe avec les deux entre-temps.
Vérifier
- L'écran Diagnostic -> Alertes (admins) liste chaque règle, son état (
ok, en attente, déclenchée, résolue, inconnu), sa valeur face au seuil, sa courbe sur 6 h et les livraisons de chaque webhook (résultat, statut, cause). - Un fichier refusé y est dit, avec sa cause ; la version précédente s'applique.
GET /api/alertsdonne les valeurs en vigueur des règles intégrées et leur origine (tuning).
À savoir
| Sujet | Ce qu'il faut savoir |
|---|---|
| Règles intégrées | Toujours actives : breaker-open (coupe-circuit ouvert), upstream-degraded et gateway-degraded (1 min), new-error-code (un code jamais vu sur l'opération en 7 jours - il lit flexway_errors_total), slo-burn (dès qu'un objectif est déclaré, d'opération ou de groupe), replica-silent (une réplique de la passerelle sans rapport depuis 2 min sans arrêt annoncé), broker-unavailable (coupe-circuit d'un courtier ouvert ou plus de la moitié de ses publications en échec, 1 min), broker-backpressure (plus de 1 % de 503 overloaded, 5 min), webhook-dead-letter (une livraison en rebut sur 15 min) |
| Jugement | error_rate = part de 5xx sur 1 min, à partir de 20 réponses ; p95 sur 5 min. Métriques muettes : aucun état ne change, rien n'est envoyé ni retiré, l'écran dit inconnu. Une cible absente de la configuration rend la règle invalide, jamais notifiée |
| Qui envoie | Chaque réplique évalue ; une seule notifie, celle qui tient le Lease du chart. Le webhook-id est le même d'une réplique à l'autre : dédoublonnez sur lui (au moins une fois) |
| Webhook | https, adresse vérifiée à la connexion : boucle locale, lien local (169.254.169.254) et multicast toujours refusés, réseau privé seulement avec allowPrivate: true (une cible interne) ; aucune redirection suivie ; délai 5 s ; réessais 5 s, 30 s, 2 min, 10 min, 30 min, puis abandon visible à l'écran ; un 4xx (hors 408, 429) est un refus définitif |
| Silence | Écran Alertes, 24 h au plus, motif obligatoire : il suspend les notifications d'une règle, jamais son évaluation ; à son échéance, ce qui déclenche encore est notifié |
| Résumés | daily ou weekly à l'heure UTC : requêtes face à la période précédente, parts de 5xx et 4xx, nouveaux codes, budget de chaque SLO, cinq plus fortes variations, alertes - jamais un nom de tenant |
| SLO | Disponibilité (réponses non 5xx) et latence (part des minutes dont le p95 tient la cible) sur la fenêtre ; budget restant, burn rate sur 1 h, 6 h, 3 j ; slo-burn sonne au-delà de 14,4 sur 1 h et 5 min, ou de 6 sur 6 h et 30 min. Sur une opération ou, depuis 1.6.0, un groupe d'opérations - un amont, une étiquette, une liste, toutes (Objectifs SLO par groupe d'opérations). Onglet Objectifs (SLO) de Trafic, panneau d'Opération, objectif global sur la Vue d'ensemble ; « Créer une alerte » des graphiques et des objectifs écrit le YAML à copier dans ces valeurs |
| Réglages des règles intégrées | alerts.builtins : name d'une règle intégrée, for (0 à 1 h) sur toutes ; threshold (un ratio) et minRequests seulement sur broker-unavailable (moitié, 20) et broker-backpressure (1 %, 20) ; excludeCauses seulement sur une règle qui compte des causes fermées (les règles du proxy Kafka natif, depuis 1.6.0). Un nom inconnu, une règle réglée deux fois ou un réglage que la règle ne porte pas refusent le fichier, comme le reste ; sans la clé, les défauts. L'écran Alertes affiche le seuil réglé |
Disponible depuis 1.3.0 ; réglage des règles intégrées en 1.6.0.