← Retour à Architecture Logiciel · Analyse

Python · KQL

Le langage de l'analyse. Python orchestre le pipeline depuis l'acquisition sur le CM4 jusqu'aux modèles prédictifs dans le cloud. KQL transforme des téraoctets de télémétrie en réponses sous la seconde pour le portail d'alertes.

Python dans IN-SIGHT

Python est le langage principal de la stack d'analyse d'IN-SIGHT, présent aux deux extrémités du système : edge et cloud. Sa combinaison de productivité de développement, d'un écosystème scientifique mature (NumPy, SciPy, scikit-learn) et de compilation JIT (numba) le rend viable aussi bien pour le code embarqué du CM4 que pour les pipelines d'analyse sur Azure.

Edge — Raspberry CM4 (Python 3.11)

  • Acquisition MEMS : Lecture SPI via spidev à 6 667 Hz avec double buffer pour éviter les gaps.
  • DSP : scipy.signal pour les filtres IIR, fenêtres de Hann et FFT. Modules critiques compilés avec numba @jit pour réduire la latence de 40 ms à 4 ms.
  • EKF : Implémentation NumPy vectorisée du Filtre de Kalman Étendu. Matrices d'état en mémoire contiguë (C-order) pour une efficacité de cache maximale.
  • MQTT : paho-mqtt avec reconnexion automatique et file persistante pour la résilience dans les tunnels.

Cloud — Azure Functions + AKS (Python 3.12)

  • Pipeline d'ingestion : Les Azure Functions traitent les événements d'IoT Hub, les enrichissent avec des métadonnées de flotte et les écrivent dans ADX.
  • EKF cloud : Exécution parallèle de l'EKF pour toute la flotte avec Dask. Un worker par véhicule, mise à l'échelle automatique.
  • API du portail : FastAPI sert les données d'alertes et de tendances au frontend du portail.
  • Modèles prédictifs : scikit-learn pour les modèles de RUL (Random Forest, Gradient Boosting). Ré-entraînement mensuel avec les données historiques d'ADX.

KQL — Kusto Query Language

KQL est le langage de requête déclaratif d'Azure Data Explorer. Sa philosophie est pipe-based : le résultat de chaque opérateur s'écoule vers le suivant, à la manière des pipes Unix mais avec une sémantique de tables et des optimisations natives pour les séries temporelles.

KQL inclut des primitives spécialisées qui seraient complexes à implémenter en SQL standard : series_fit_line() pour la régression sur séries, series_decompose_anomalies() pour la détection automatique d'anomalies, make_series pour pivoter les données en tableaux temporels denses, et des fonctions de corrélation croisée entre signaux.

Requêtes clés dans IN-SIGHT

// Tendance de dégradation — 4 dernières semaines
telemetry
| where metric == "bearing_rms"
  and vehicle_id == "TMB-5042"
  and timestamp > ago(28d)
| make-series rms_avg = avg(value)
    on timestamp
    from ago(28d) to now()
    step 1h
| extend anomalies = series_decompose_anomalies(
    rms_avg, 1.5, -1, 'linefit')
| render anomalychart

// Résumé de santé de flotte en temps réel
telemetry
| where timestamp > ago(5m)
| summarize
    last_rms   = take_any(value),
    alert_count = countif(alert_level != "OK")
    by vehicle_id
| join kind=leftouter (
    vehicles | project vehicle_id, line, depot
  ) on vehicle_id
| order by alert_count desc

Alertes programmées avec KQL

Azure Data Explorer permet de définir des scheduled queries : des requêtes KQL qui s'exécutent automatiquement toutes les N minutes et peuvent déclencher des notifications lorsque le résultat dépasse un seuil. IN-SIGHT utilise ce mécanisme pour détecter des tendances lentes que l'EKF local ne détecterait pas (l'EKF est optimal pour les anomalies soudaines ; les tendances graduelles sur des semaines nécessitent un contexte historique).

// Alerte de tendance — s'exécute toutes les 6 heures
telemetry
| where metric == "bearing_rms"
  and timestamp between (ago(7d) .. ago(1d))
| make-series v = avg(value)
    on timestamp step 6h
    by vehicle_id
| extend (slope, intercept, rsq) =
    series_fit_line_dynamic(v)
| where slope > 0.005    // dégradation > 0.5% RMS/heure
  and rsq > 0.7          // tendance statistiquement significative
| project vehicle_id, slope, rsq