Ferigolo
All projects

Professional project / Delivered

IASE Cloud

Automotive telemetry and live observability: MQTT acquisition, time series, Redis Streams and Vue dashboards for signals, fleets and service health.

My role
Backend developer · DevOps · architect
Technologies
Go · Python · Django · Channels · MQTT · Redis · TimescaleDB · PostGIS · Vue 3 · OpenTelemetry
Stage
Delivered

01 /The context

IASE Cloud connects acquisition devices to an automotive engineering platform. Experiments, sessions, firmware and fleet management form the domain; metrics and positions feed history, charts and maps. Two paths serve different needs: monitoring device signals and observing the platform’s own health.

02 /My contribution

I contribute as a backend developer, architect and DevOps engineer, connecting acquisition, processing, persistence and delivery of data to the interface. This case focuses on implemented telemetry and observability paths; Vue is described as part of the system integration.

Telemetry and observability architecture

01 / Acquisition and persistence

  1. Devices + MQTTDAQ signals, metrics and GPS
  2. Go bridgeSeparation and Protobuf envelope
  3. Redis StreamsDurable queue and consumer groups
  4. Go workersDecoding, batches and deduplication
  5. TimescaleDB + PostGISSession time series and positions

02 / Live signals and maps

  1. Workers → Redis Pub/SubPublication after persistence and ACK
  2. Relay + Django ChannelsPer-device groups and filters
  3. WebSocket · ProtobufHistory + new samples
  4. Vue · Chart.js · LeafletIncremental series and alarms

History: TimescaleDB → Django → WebSocket. Maps: state/geography → SSE API → Pinia → Leaflet.

03 / Platform health

  1. Redis + psutilStreams, queues, broker and resources
  2. HealthSnapshotsParallel collection and partial failures
  3. API · SSESnapshots targeting 2 s
  4. Vue · SystemHealthIndicators and operational history

04 / Traces and operational history

  1. Django + Celery + librariesOTel instrumentation and correlated logs
  2. Collector + PrometheusReferenced external dependencies
  3. PromQL queriesSpans/s, errors, p99 and 24 h window
  4. HealthSnapshots → SSEIntegration with the system panel
Telemetry and observability flows, with Collector/Prometheus as external services. Arrows indicate data direction; ACK follows persistence.

03 /Architecture and implementation

Acquisition and ingestion — device to database

Devices publish metrics, coordinates and binary data over MQTT. A Go bridge separates them into Redis Streams; workers decode Protobuf and DAQ samples, batch data and persist before acknowledging consumption. Ingestion keys deduplicate redelivered metrics and positions. Pending-message recovery and quarantine isolate failures while keeping durable ingestion separate from live distribution.

Time series — contextual history

TimescaleDB stores metric name, value, timestamp and session in hypertables; PostGIS stores geographic positions. Chart history filters variables and time range within the device’s latest session, averages values per second and sends time/value arrays. The screen starts with persisted data and appends new samples while retaining the experiment’s temporal reference.

Live charts — WebSocket and Protobuf

After persistence and ACK, workers publish binary data through Redis Pub/Sub. A relay forwards frames to per-device Django Channels groups; the WebSocket consumer applies selected filters and distinguishes history from new data. Vue decodes ArrayBuffer into series: history replaces the dataset and live samples append to it. Updates are grouped every 500 ms and incremental series retain up to 2,500 points per variable. Alarm events update the list alongside the charts.

Fleets and geography — SSE and maps

A separate Server-Sent Events flow delivers unit status and positions. A Pinia store receives an initial snapshot, updates units from the stream and attempts reconnection after interruptions. Leaflet presents locations and tracks while Chart.js presents time-series signals. Map SSE and experiment WebSocket use distinct contracts; each update does not require a full page reload.

Ingestion health — source-derived metrics

HealthSnapshots collects Redis Streams, Celery queues, Redis statistics and psutil. Backlog combines group pending messages and lag; the entry rate is estimated from cumulative counter differences between snapshots, rather than database insert counts. Dead letters, MQTT client counts from $SYS topics, queue lengths and process-visible resources feed the panel. Slow sources are read concurrently with timeouts; unavailable metrics remain unknown instead of becoming zero.

Observability — traces, logs and operational history

OpenTelemetry instruments Django, Celery, Redis, requests and psycopg2; spans are exported in batches over OTLP. Backend JSON logs include trace/span IDs, while Go services use structured slog with repeated-error rate limiting. The aggregator queries Prometheus for spans/s, error ratio, duration p99 and 24-hour history. The integration uses an OTLP collector and Prometheus series compatible with the aggregator queries.

System dashboard — SSE snapshots and connection state

The API streams health snapshots over SSE with a target cadence of 2 seconds, adjusted for collection time. Vue SystemHealth displays current indicators and historical charts; its consumer handles fragmented SSE frames, reconnects after stream loss and warns about potentially stale data. The enrichment panel adds periodically queried API usage, cache and error metrics. Device telemetry lives in TimescaleDB; operational history for this panel comes from Prometheus.

Other services — management, configuration and reports

Django/DRF manages devices, firmware, certificates, experiments and fleets. An A2L parser prepares acquisition configuration; report plugins query TimescaleDB and generate Matplotlib PDFs. The C++/MDF logger is a separate archival path. Docker Compose and GitLab CI support execution and delivery.

04 /Status and next steps

Version 2 with architectural refactor delivered.

Next projectDirectX 12 Engine

Let’s build the next idea.

Let’s talk about opportunities, projects and the engineering challenges ahead.

Connect on LinkedIn
Find me elsewhereGitHub