Loading learning content...
Time-series databases have moved from specialized niche solutions to essential infrastructure powering some of the world's most demanding applications. From Tesla's fleet telemetry processing millions of data points per vehicle per day, to Uber's marketplace dynamics tracking supply and demand across thousands of cities in real-time, to Netflix's streaming health monitoring billions of playback events—TSDBs underpin the real-time pulse of modern digital experiences.
Understanding these use cases isn't just academic. Each domain has unique characteristics that influence TSDB selection, schema design, and operational requirements. The patterns you learn from observability are different from IoT are different from financial analytics. This page explores real-world deployments across major domains, extracting practical insights you can apply to your own time-series challenges.
By the end of this page, you will understand: (1) How TSDBs power infrastructure monitoring and observability, (2) The unique requirements of IoT deployments at scale, (3) Financial time-series use cases and their precision demands, (4) Application performance monitoring (APM) patterns, (5) Emerging use cases in ML/AI pipelines and real-time analytics, and (6) How to match TSDB selection to domain requirements.
Infrastructure monitoring was the original killer application for time-series databases. Every server, container, network device, and cloud service generates metrics that operations teams need to collect, visualize, alert on, and analyze. This domain defined the core TSDB requirements we see today.
123456789101112131415161718192021222324252627282930313233343536373839404142
INFRASTRUCTURE MONITORING ARCHITECTURE====================================== ┌─────────────────────────────────────────────┐ │ SOURCES │ ├──────────────┬──────────────┬───────────────┤ │ Servers │ Containers │ Cloud APIs │ │ 10,000+ │ 50,000+ │ (AWS, GCP) │ └──────┬───────┴──────┬───────┴───────┬───────┘ │ │ │ ┌──────▼───────┬──────▼───────┬───────▼───────┐ │ Telegraf │ Prometheus │ CloudWatch │ │ (Agent) │ Exporter │ Exporter │ └──────┬───────┴──────┬───────┴───────┬───────┘ │ │ │ └──────────────┼───────────────┘ │ ┌─────────────────────▼──────────────────────┐ │ TIME-SERIES DATABASE │ │ (InfluxDB / TimescaleDB / VictoriaMetrics)│ │ │ │ Metrics stored: │ │ - cpu_usage{host,cpu,mode} │ │ - memory_used{host} │ │ - disk_io_bytes{host,device,direction} │ │ - network_bytes{host,interface,direction} │ │ - container_cpu{pod,namespace,container} │ └─────────────────────┬──────────────────────┘ │ ┌───────────────────────────┼───────────────────────────┐ │ │ │ ┌─────▼─────┐ ┌──────▼──────┐ ┌──────▼──────┐ │ Grafana │ │ Alerting │ │ Long-term │ │ Dashboard │ │ (PagerDuty)│ │ Storage │ └───────────┘ └─────────────┘ └─────────────┘ SCALE CHARACTERISTICS:- Collection interval: 10-60 seconds- Metrics per host: 100-500 baseline, 1000+ with custom- Cardinality: hosts × metrics × label combinations- Retention: 7-30 days raw, 1-2 years aggregated- Query patterns: dashboards (high read), alerts (continuous), ad-hoc (bursty)| Organization Scale | Hosts | Metrics/Second | Series Count | TSDB Choice |
|---|---|---|---|---|
| Small Startup | 10-100 | ~1K | ~10K | Prometheus, InfluxDB OSS |
| Mid-size Company | 100-1K | ~100K | ~1M | VictoriaMetrics, TimescaleDB |
| Large Enterprise | 1K-10K | ~1M+ | ~10M+ | Cortex, Thanos, M3, InfluxDB Cloud |
| Hyperscaler | 100K+ | ~100M+ | ~1B+ | Custom (Netflix Atlas, Uber M3) |
Prometheus has become the de facto standard for cloud-native monitoring, but its single-node design limits scale. Production deployments often use Prometheus for collection with a scalable TSDB backend: VictoriaMetrics, Cortex, Thanos, or M3. These accept Prometheus remote_write and provide long-term storage, high availability, and global query capabilities.
The Internet of Things generates time-series data at unprecedented scale. Billions of sensors—in vehicles, factories, smart cities, wearables, and homes—continuously stream measurements. IoT time-series has unique characteristics that differentiate it from IT infrastructure monitoring.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
IOT TIME-SERIES ARCHITECTURE============================ EDGE TIER ┌─────────────────────────────────────────────────┐ │ │ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ │ │Sensor │ │Sensor │ │Sensor │ │ ... │ │ │ │ (1ms) │ │(100ms)│ │ (1s) │ │ │ │ │ └───┬───┘ └───┬───┘ └───┬───┘ └───────┘ │ │ │ │ │ │ │ └──────────┼──────────┘ │ │ │ │ │ ┌─────▼─────┐ │ │ │ Edge │ Local buffering │ │ │ Gateway │ ◄── Compression │ │ │ │ Downsampling │ │ └─────┬─────┘ │ │ │ │ └─────────────────┼──────────────────────────────┘ │ │ MQTT / HTTP / gRPC │ (Cellular, LoRaWAN, WiFi) │ ┌─────────────────▼──────────────────────────────┐ │ CLOUD TIER │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ Message Broker │ │ │ │ (Kafka, MQTT Broker, AWS IoT Core) │ │ │ └────────────────────┬─────────────────────┘ │ │ │ │ │ ┌────────────────────▼─────────────────────┐ │ │ │ TIME-SERIES DATABASE │ │ │ │ (TimescaleDB, InfluxDB, QuestDB) │ │ │ │ │ │ │ │ Measurements: │ │ │ │ - temperature{device_id, location} │ │ │ │ - pressure{device_id, unit} │ │ │ │ - vibration{device_id, axis} │ │ │ │ - gps_position{vehicle_id} │ │ │ └────────────────────┬─────────────────────┘ │ │ │ │ │ ┌──────────────────┼──────────────────┐ │ │ │ │ │ │ │ ┌──▼──┐ ┌────▼────┐ ┌───▼───┐ │ │ │Real-│ │Analytics│ │ ML │ │ │ │time │ │ BI │ │Models │ │ │ │Alert│ │ │ │ │ │ │ └─────┘ └─────────┘ └───────┘ │ └────────────────────────────────────────────────┘ IOT-SPECIFIC CHALLENGES:1. Device cardinality: millions of unique device IDs2. Irregular intervals: sensors may report only on change3. Late data: connectivity issues cause out-of-order arrival4. Edge buffering: devices must store data when offline5. Geographic distribution: data arrives from global locations6. Data quality: sensors fail, produce outliers, drift over time| Domain | Device Count | Data Points/Day | Key Metrics |
|---|---|---|---|
| Connected Vehicles | 1-10 million | 1-10B per day | GPS, speed, fuel, engine diagnostics |
| Smart Manufacturing | 10K-100K sensors | 100M-1B per day | Temperature, pressure, vibration, throughput |
| Smart Grid/Utilities | Millions of meters | Billions per day | Power consumption, voltage, frequency |
| Wearables/Health | Millions of devices | Variable | Heart rate, activity, sleep, SpO2 |
| Smart Buildings | 1K-100K per building | 10M-100M per day | HVAC, occupancy, energy, access |
IoT naturally creates high cardinality: each device is unique. Traditional TSDBs like InfluxDB 1.x/2.x struggle when device_id is stored as a tag (in-memory index). Solutions: use InfluxDB 3.0 (Parquet-based), TimescaleDB (no in-memory index), or store device_id as a field (not indexed) with a separate device registry table.
Financial markets generate some of the most demanding time-series workloads. Stock prices, order book updates, trade executions, and market microstructure data arrive at microsecond granularity during trading hours. Financial time-series has unique requirements around precision, latency, and regulatory compliance.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
-- FINANCIAL TIME-SERIES SCHEMA (TimescaleDB)-- ============================================= -- Tick data: individual tradesCREATE TABLE trades ( time TIMESTAMPTZ NOT NULL, symbol TEXT NOT NULL, exchange TEXT NOT NULL, price NUMERIC(20, 8) NOT NULL, -- Precise decimal for currency quantity NUMERIC(20, 8) NOT NULL, trade_id TEXT, trade_type TEXT -- 'buy', 'sell', 'auction');SELECT create_hypertable('trades', 'time');CREATE INDEX ON trades (symbol, time DESC); -- OHLCV bars: aggregated candlesticksCREATE TABLE ohlcv_1min ( time TIMESTAMPTZ NOT NULL, symbol TEXT NOT NULL, open NUMERIC(20, 8), high NUMERIC(20, 8), low NUMERIC(20, 8), close NUMERIC(20, 8), volume NUMERIC(30, 8), trade_count INTEGER, vwap NUMERIC(20, 8) -- Volume-Weighted Average Price);SELECT create_hypertable('ohlcv_1min', 'time'); -- Order book snapshots (quote data)CREATE TABLE order_book ( time TIMESTAMPTZ NOT NULL, symbol TEXT NOT NULL, bid_price NUMERIC(20, 8), bid_size NUMERIC(20, 8), ask_price NUMERIC(20, 8), ask_size NUMERIC(20, 8), spread NUMERIC(20, 8) GENERATED ALWAYS AS (ask_price - bid_price) STORED);SELECT create_hypertable('order_book', 'time'); -- Continuous aggregate for OHLCV generationCREATE MATERIALIZED VIEW ohlcv_1min_aggWITH (timescaledb.continuous) ASSELECT time_bucket('1 minute', time) AS bucket, symbol, first(price, time) AS open, max(price) AS high, min(price) AS low, last(price, time) AS close, sum(quantity) AS volume, count(*) AS trade_count, sum(price * quantity) / sum(quantity) AS vwapFROM tradesGROUP BY bucket, symbol; -- Query: Get OHLCV for a symbol over a date rangeSELECT * FROM ohlcv_1min_aggWHERE symbol = 'AAPL' AND bucket >= '2024-01-01' AND bucket < '2024-01-15'ORDER BY bucket; -- Query: Calculate returns over timeSELECT bucket, symbol, close, (close - LAG(close) OVER (PARTITION BY symbol ORDER BY bucket)) / LAG(close) OVER (PARTITION BY symbol ORDER BY bucket) AS return_1mFROM ohlcv_1min_aggWHERE symbol = 'AAPL' AND bucket >= NOW() - INTERVAL '1 day';| Data Type | Volume | Latency Requirement | Retention |
|---|---|---|---|
| Tick Data | Millions/day per exchange | < 1ms for trading systems | 1-7 years (regulatory) |
| Quote Data | 100M+ updates/day | < 10ms for analysis | 90 days - 1 year |
| OHLCV (1min) | ~500K bars/day all symbols | < 100ms for dashboards | Forever (reference data) |
| Order Book Snapshots | Varies by frequency | Real-time for trading | 30-90 days |
| Fundamental Data | Quarterly per company | Not latency-sensitive | Forever |
Financial time-series often requires: (1) Full SQL with window functions for complex analytics, (2) NUMERIC types for precise decimal arithmetic, (3) JOINs with reference data (company info, instrument definitions). TimescaleDB's PostgreSQL foundation provides all of these out of the box, making it popular in fintech and quant finance.
Modern observability platforms rely on the 'three pillars': metrics, logs, and traces. Time-series databases store the metrics pillar, while specialized systems handle logs (Elasticsearch) and traces (Jaeger, Tempo). APM extends this with application-specific instrumentation for request latency, error rates, and dependency mapping.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
APPLICATION PERFORMANCE MONITORING=================================== THE THREE PILLARS OF OBSERVABILITY: 1. METRICS (Time-Series Database) ┌───────────────────────────────────────────────────────┐ │ http_request_duration_seconds{ │ │ service="api-gateway", │ │ endpoint="/api/users", │ │ method="GET", │ │ status_code="200" │ │ } = histogram buckets [0.1, 0.25, 0.5, 1, 2.5, 5] │ │ │ │ http_requests_total{...} = counter │ │ http_request_errors_total{...} = counter │ │ active_connections{service="..."} = gauge │ └───────────────────────────────────────────────────────┘ 2. LOGS (Log Aggregation System) ┌───────────────────────────────────────────────────────┐ │ { │ │ "timestamp": "2024-01-15T10:30:00.123Z", │ │ "level": "ERROR", │ │ "service": "payment-service", │ │ "trace_id": "abc123", │ │ "message": "Payment failed: card declined", │ │ "user_id": "user_456" │ │ } │ └───────────────────────────────────────────────────────┘ 3. TRACES (Distributed Tracing System) ┌───────────────────────────────────────────────────────┐ │ Trace ID: abc123 │ │ ├── Span: api-gateway (50ms total) │ │ │ ├── Span: auth-service (10ms) │ │ │ └── Span: payment-service (35ms) │ │ │ ├── Span: db-query (15ms) │ │ │ └── Span: stripe-api (18ms) │ │ └── Response returned │ └───────────────────────────────────────────────────────┘ RED METRICS (Request, Error, Duration):- Request Rate: requests per second per endpoint- Error Rate: percentage of failed requests- Duration: latency distribution (p50, p95, p99) USE METRICS (Utilization, Saturation, Errors):- CPU, Memory, Disk utilization- Queue depths, connection pool saturation- Resource-level error rates12345678910111213141516171819202122232425262728293031323334353637
# KEY APM QUERIES (PromQL / Flux equivalent patterns)# ================================================= # Request Rate (RED: R)sum(rate(http_requests_total{service="api-gateway"}[5m])) by (endpoint) # Error Rate (RED: E) sum(rate(http_requests_total{service="api-gateway",status_code=~"5.."}[5m])) / sum(rate(http_requests_total{service="api-gateway"}[5m])) * 100 # Latency Percentiles (RED: D)histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{service="api-gateway"}[5m])) by (le, endpoint)) # Apdex Score (Application Performance Index)# Apdex = (Satisfied + (Tolerating / 2)) / Total( sum(rate(http_request_duration_seconds_bucket{le="0.5"}[5m])) + sum(rate(http_request_duration_seconds_bucket{le="2.0"}[5m])) / 2) / sum(rate(http_requests_total[5m])) # Service Dependency Healthsum(rate(http_requests_total{status_code="200"}[5m])) by (upstream_service) / sum(rate(http_requests_total[5m])) by (upstream_service) # Saturation: Request Queue Depthavg(pending_requests{service="api-gateway"}) by (pod) # SLO Burn Rate( 1 - ( sum(rate(http_requests_total{status_code="200"}[1h])) / sum(rate(http_requests_total[1h])) )) / (1 - 0.999) # 99.9% SLO targetAPM often needs high-cardinality dimensions: user_id, request_id, trace_id. Traditional TSDBs can't handle these as tags. Solutions: (1) Store high-cardinality data in logs/traces, not metrics, (2) Use sampling to reduce cardinality, (3) Choose TSDBs designed for high cardinality (Honeycomb, InfluxDB 3.0, ClickHouse).
Beyond infrastructure and APM, time-series databases increasingly power real-time business analytics—tracking revenue, user engagement, conversion funnels, and operational KPIs as they happen, not hours or days later in batch reports.
| Domain | Metrics Tracked | Query Pattern | Latency Need |
|---|---|---|---|
| E-commerce | Orders, revenue, cart abandonment, inventory | Aggregates by product, region, time | < 1 minute freshness |
| Gaming | Concurrent players, in-game events, revenue | Leaderboards, engagement metrics | Real-time (< 10s) |
| Advertising | Impressions, clicks, conversions, spend | Campaign performance, A/B tests | < 5 minutes freshness |
| Streaming Media | Concurrent streams, quality metrics, engagement | By title, region, device type | Real-time (< 30s) |
| SaaS Platforms | Active users, feature usage, API calls | By customer, plan, feature | < 1 minute freshness |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
-- REAL-TIME E-COMMERCE ANALYTICS (TimescaleDB)-- ============================================= -- Event tracking tableCREATE TABLE user_events ( time TIMESTAMPTZ NOT NULL, event_type TEXT NOT NULL, -- 'page_view', 'add_to_cart', 'purchase' user_id TEXT, session_id TEXT, product_id TEXT, category TEXT, revenue NUMERIC(10, 2), region TEXT);SELECT create_hypertable('user_events', 'time'); -- Real-time revenue by category (last hour, updating every minute)CREATE MATERIALIZED VIEW revenue_by_category_hourlyWITH (timescaledb.continuous) ASSELECT time_bucket('1 minute', time) AS bucket, category, SUM(revenue) AS total_revenue, COUNT(*) FILTER (WHERE event_type = 'purchase') AS purchase_count, COUNT(DISTINCT user_id) AS unique_buyersFROM user_eventsWHERE event_type = 'purchase'GROUP BY bucket, category; SELECT add_continuous_aggregate_policy('revenue_by_category_hourly', start_offset => INTERVAL '5 minutes', end_offset => INTERVAL '1 minute', schedule_interval => INTERVAL '1 minute'); -- Live dashboard query: Revenue and conversion for last hourWITH funnel AS ( SELECT time_bucket('5 minutes', time) AS bucket, COUNT(*) FILTER (WHERE event_type = 'page_view') AS views, COUNT(*) FILTER (WHERE event_type = 'add_to_cart') AS add_to_carts, COUNT(*) FILTER (WHERE event_type = 'purchase') AS purchases, SUM(revenue) FILTER (WHERE event_type = 'purchase') AS revenue FROM user_events WHERE time > NOW() - INTERVAL '1 hour' GROUP BY bucket ORDER BY bucket)SELECT bucket, views, add_to_carts, purchases, revenue, ROUND(100.0 * add_to_carts / NULLIF(views, 0), 2) AS cart_rate, ROUND(100.0 * purchases / NULLIF(add_to_carts, 0), 2) AS conversion_rateFROM funnel; -- Anomaly detection: Significant revenue dropSELECT time_bucket('5 minutes', time) AS bucket, SUM(revenue) AS revenue, AVG(SUM(revenue)) OVER (ORDER BY time_bucket('5 minutes', time) ROWS 12 PRECEDING) AS moving_avg, SUM(revenue) < 0.5 * AVG(SUM(revenue)) OVER (ORDER BY time_bucket('5 minutes', time) ROWS 12 PRECEDING) AS is_anomalyFROM user_eventsWHERE event_type = 'purchase' AND time > NOW() - INTERVAL '2 hours'GROUP BY bucketORDER BY bucket;For pure analytics on event data, columnar OLAP databases like ClickHouse, Apache Druid, or DuckDB may outperform traditional TSDBs. However, when you need both time-series operations (rate calculations, gap filling) AND analytical queries (funnels, cohorts), TSDBs like TimescaleDB provide a unified solution without data movement between systems.
Time-series databases are expanding into new domains as organizations recognize the value of temporal data analysis in areas previously served by specialized or general-purpose databases.
1234567891011121314151617181920212223242526272829303132333435
-- ML FEATURE STORE USE CASE-- Point-in-time correct feature retrieval -- Feature table with versioned featuresCREATE TABLE user_features ( time TIMESTAMPTZ NOT NULL, user_id TEXT NOT NULL, feature_name TEXT NOT NULL, feature_value DOUBLE PRECISION NOT NULL);SELECT create_hypertable('user_features', 'time'); -- Insert features as they're computedINSERT INTO user_features VALUES('2024-01-15 10:00:00', 'user_123', 'purchase_count_30d', 5),('2024-01-15 10:00:00', 'user_123', 'avg_order_value', 87.50),('2024-01-15 10:00:00', 'user_123', 'days_since_last_purchase', 3); -- Point-in-time feature retrieval (no data leakage!)-- Get features as they were known at prediction time, not current valuesSELECT l.user_id, l.label_time, f.feature_name, f.feature_valueFROM labels lCROSS JOIN LATERAL ( SELECT DISTINCT ON (feature_name) feature_name, feature_value FROM user_features WHERE user_id = l.user_id AND time <= l.label_time -- Only features known before label ORDER BY feature_name, time DESC) fWHERE l.user_id = 'user_123';We're seeing convergence between TSDBs and other database categories. TimescaleDB adds analytics capabilities. ClickHouse adds time-series functions. QuestDB optimizes for both time-series AND OLAP. The future may be fewer, more capable databases rather than specialized tools for each use case.
With multiple TSDBs available, selection depends on matching your specific requirements to database strengths. No single TSDB is best for all use cases.
| Requirement | Best Options | Why |
|---|---|---|
| Full SQL support | TimescaleDB, QuestDB | PostgreSQL-compatible; familiar query language |
| Prometheus ecosystem | VictoriaMetrics, Cortex, Thanos | Native PromQL; drop-in Prometheus replacement |
| Maximum write throughput | QuestDB, ClickHouse, VictoriaMetrics | Optimized ingestion engines |
| IoT with high device cardinality | TimescaleDB, InfluxDB 3.0, QuestDB | Handle millions of unique device IDs |
| Unified observability platform | InfluxDB, Datadog, Grafana Cloud | Integrated collection, storage, visualization |
| Financial analytics (precise decimals) | TimescaleDB, QuestDB | Native NUMERIC types; window functions |
| Minimal operational overhead | InfluxDB Cloud, Timescale Cloud, Grafana Cloud | Fully managed services |
| Edge/embedded deployment | QuestDB (single binary), InfluxDB OSS | Small footprint; no dependencies |
For most organizations: Start with Prometheus + Grafana for infrastructure monitoring (it's free and ubiquitous). Add VictoriaMetrics or Thanos for scale. Use TimescaleDB if you need SQL analytics or IoT. Consider managed services to avoid operational burden. Don't over-engineer—you can migrate later if needed.
We've explored the breadth of time-series database applications—from infrastructure monitoring that birthed the category to emerging use cases in ML and sustainability.
Module Complete:
You've now completed the comprehensive exploration of time-series databases. From foundational concepts through specific technologies (InfluxDB, TimescaleDB), operational patterns (retention policies), and real-world applications—you have the knowledge to design, deploy, and operate time-series solutions at scale.
Key skills acquired:
Congratulations! You've mastered time-series databases at a depth suitable for production deployment. You understand when TSDBs are appropriate, how to select among options, and how to design for scale. Whether building IoT platforms, observability systems, or real-time analytics, you have the foundation to succeed.