Aller au contenu principal

De bout en bout : surveillance de flotte

Avancé ⏱ 20 min iot · bout en bout · fenêtres + timers

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.

télémétrie → streaming:health (fenêtre) → rule-based:flag → webhook (NOC) · + watchdog (timers par clé)

Pré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.outbatt_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