
Scaling Observability with OpenTelemetry and vmagent Aggregation Strategies
This article explores Airbnb's technical journey in modernizing their massive metrics infrastructure from StatsD to a modern Prometheus ecosystem. It provides deep insights into achieving performance efficiency through vmagent sharding and solving data accuracy issues with an innovative 'Zero Injection' approach.
Essential reading for SREs and Backend Engineers balancing observability costs with data accuracy in high-scale environments. The 'Zero Injection' technique is a practical fix for anyone using Prometheus with sparse or high-cardinality data.
Airbnb needed to migrate from its legacy StatsD/Veneur metrics pipeline to a Prometheus-based storage system due to high CPU overhead and packet loss issues. The primary challenge was maintaining scale and accuracy, especially addressing the undercounting of sparse counters caused by how Prometheus handles resets.
The team implemented a dual-write strategy using OpenTelemetry (OTLP) and built a two-layer streaming aggregation architecture (Router/Aggregator) with VictoriaMetrics' vmagent. They also developed a 'Zero Injection' technique at the aggregation tier to ensure accurate rate calculations in Prometheus for newly created counters.
The migration reduced metrics-related CPU usage from 10% to less than 1% and scaled to handle over 100 million samples per second. It significantly cut infrastructure costs while improving the reliability and fidelity of high-cardinality metrics.
Trade-off
Adopting Delta Temporality for high-volume services reduced memory pressure but introduced the risk of data gaps during failures. Additionally, the Zero Injection technique causes the initial increment to lag by one flush interval before appearing in dashboards.
A lightweight metrics collector from VictoriaMetrics that supports streaming aggregation and horizontal scaling.
A technique that injects a synthetic zero value at the start of a metric stream to help Prometheus correctly calculate rates of change.
A reporting mode that sends only the changes since the last export, significantly reducing in-process memory state.




