De bout en bout : surveillance de flotte
Vous allez construire : le pipeline de santé de flotte du use case IoT — batterie et signal par device dans des fenêtres glissantes, plus le chien de garde qui attrape le device qui a cessé de parler.
Prérequis
- Le démarrage rapide terminé. Entièrement déterministe — pas de LLM requis.
1 · Générez
pulse new fleet --source webhook \
--stage streaming:health --stage rule-based:flag --sink webhook
2 · Le stage health — des fenêtres par device
stages:
- name: health
engine: streaming
operators:
- { type: keyBy, field: device_id }
- type: window
spec: "sliding(5m,1m)"
aggregations:
batt_min: "min(battery)"
rssi_avg: "avg(rssi)"
3 · Le stage flag
- name: flag
engine: rule-based
rules:
- { condition: "batt_min < 15", action: flag }
4 · Sink vers le NOC et déployez
pulse secret set NOC_WEBHOOK https://webhook.site/<votre-id>
pulse secret set PULSE_WEBHOOK_SECRET dev-secret # la source webhook générée l'exige
pulse deploy .
5 · Faites battre un device sain et un mourant
pulse events publish --topic fleet.in --value '{"device_id":"d-1","battery":88,"rssi":-61}'
pulse events publish --topic fleet.in --value '{"device_id":"d-2","battery":12,"rssi":-74}'
pulse events tail --topic fleet.flag.out
La fenêtre de d-2 calcule batt_min: 12 → signalé au NOC. d-1 reste tranquille et gratuit.
6 · Ajoutez le chien de garde du silence
Les fenêtres ne voient que ce qui arrive. Ajoutez le stage à timers par clé de Timers par clé — détecter le silence comme second stage streaming :
- name: watchdog
engine: streaming
operators:
- type: process
key: device_id
timeout: "10m"
timer: processing
onTimeout: emit
passThrough: true
La flotte est maintenant couverte sur les deux axes de défaillance : les devices qui se dégradent (fenêtres) et les devices qui disparaissent (timers).
Ce qui vient de se passer
Deux petits stages déclaratifs ont remplacé un service de monitoring : l'état par device maintenu par le moteur, des seuils dans une config relisible, et le tout sur un seul nœud self-hosted — la même forme qui passe au mesh entreprise sans réécriture quand la flotte dépasse la machine.
Dépannage
Rien sur fleet.flag.out
Vérifiez d'abord fleet.health.out — batt_min est-il réellement sous votre seuil dans la fenêtre courante ? Les noms de champs des règles doivent correspondre exactement aux noms d'agrégation.
Ensuite
- Timers par clé — détecter le silence
- Crash-resume — un cycle d'alimentation ne remet pas vos baselines à zéro