Turning Noisy Telemetry Into Stable Incidents (Without Losing Determinism)
By Dimitri Lafleur
Real-world telemetry is messy. Even when sensors, collectors, and networks are "fine," the stream can still be unreliable in ways that create operational drag. You get spikes that mean nothing, values that go stale without going fully missing, brief dropouts that self-heal, and timing irregularities that make triage harder than it needs to be.
The design converts scan-driven telemetry into stable, testable incident signals for operators and downstream systems. It stays deterministic and keeps its memory use bounded.
This note leaves out thresholds, tuning strategy, edge-case handling, state transition rules, and grouping heuristics.
The failure mode: noise turns into work#
Raw telemetry tends to produce two bad outcomes at the same time:
- it generates frequent false "events" that waste attention
- it hides real issues inside a flood of churn
A single point can flicker around a threshold. A source can drift or intermittently report. A collector can miss a few updates and then recover. If alert logic treats every fluctuation as meaningful, you get alarm fatigue. If you over-suppress, you miss legitimate problems.
The goal is to stabilize meaning without smearing reality.
Constraints that drive the design#
Deterministic replay#
Given the same input stream, the pipeline must produce the same outputs every time. That means:
- no dependence on wall-clock time for core decisions
- stable ordering rules
- explicit state transitions instead of implicit timing behavior
Determinism enables regression testing, version comparison, and behavior audits after the fact.
Bounded memory and bounded state#
Per-signal state must be small and predictable. Telemetry streams can be large, so the design assumes fixed-size rolling context per signal and compact incident lifecycle state.
Scan-driven processing#
This is not batch analytics. Inputs arrive as scans or updates, and the pipeline responds incrementally. That pushes you toward lifecycle thinking and deterministic update rules.
Architectural shape#
The blocks are easy to name. The hard part is preserving determinism and stability at their edges.
1) Ingest (normalize, do not decide)#
Input samples are normalized into a consistent internal representation (value, timestamp when available, and optional quality hints). Ingestion is normalization, not decision-making.
2) Per-signal evidence (bounded, incremental)#
Each signal maintains lightweight rolling evidence about whether behavior is departing from expectations. Examples of evidence signals (non-exhaustive):
- staleness or missingness
- abrupt excursions inconsistent with recent context
- sustained slope changes
Exponential smoothing is one common choice:
y[n] = α x[n] + (1 − α) y[n−1]
The useful property is that it updates incrementally with bounded state.
3) Incidentization (evidence becomes stable incidents)#
Instead of "alert on condition," treat conditions as inputs to an incident lifecycle. The lifecycle uses persistence and hysteresis to reduce alert chatter while staying deterministic.
The outcome is a stable object with a start, an active period, and a clean resolution. Not spam on every scan.
4) Optional summarization#
Once you can create stable incidents per signal, you can reduce alert noise by summarizing related incidents into higher-level rollups using deterministic rules. I leave the grouping details out here.
5) Replay and evaluation#
Because the pipeline is deterministic, you can run historical streams through it and compare outputs across versions. This enables regression tests, behavior audits, and safe iteration.
A testing approach that holds up#
Testing focuses on behavior across time, not isolated units.
Golden outputs#
Pick representative synthetic streams (or sanitized streams) and record the expected incident timeline output. When logic changes, you can see exactly what moved.
Deterministic ordering rules#
If incidents can be emitted in different orders depending on timing, you do not have a testable system. Ordering is part of the contract.
Portable test vectors#
Test inputs should be small, explicit, and runnable anywhere:
- no dependence on environment clocks
- no dependency on special infrastructure
- no hidden state
If you cannot run the same test vector locally and in CI and get the same output, you are not deterministic.
What this buys you#
Raw telemetry is data. Incidents are meaning. The point is to create meaning that stays stable under noise, predictable under replay, and bounded as the stream grows.
Sampling is the constraint underneath all of this. Telemetry is discrete:
fs = 1 / Δt
That fact alone explains a large fraction of the artifacts people see in real systems.
Related work
Telemetry in two directions.
One link covers the simulator. The other covers the signal physics behind it.