Overview
Snuba’s query pipeline consists of multiple stages, each with its own processors:Processor Interface
All processors implement a common interface:Entity Processing Stage
Entity processors run after query parsing, before storage selection.snuba/pipeline/stages/query_processing.py:14
Common Entity Processors
TimeSeriesProcessor
TimeSeriesProcessor
Validates and processes time range queries:
- Ensures required time columns are present
- Validates time range is reasonable
- Adds time-based optimizations
ProjectRateLimit
ProjectRateLimit
Enforces project-level rate limits:
PrewhereProcessor
PrewhereProcessor
Optimizes queries using ClickHouse PREWHERE:
- Moves selective conditions to PREWHERE
- Improves query performance
Storage Processing Stage
Storage processors run after storage selection, before query execution.snuba/pipeline/stages/query_processing.py:16
Common Storage Processors
MappingOptimizer
MappingOptimizer
Optimizes column mapping and projection:
TableRateLimit
TableRateLimit
Enforces table-level rate limits:
ConsistencyEnforcer
ConsistencyEnforcer
Enforces consistency settings:
Creating Custom Processors
You can create custom processors for specific use cases:Processor Examples
Add Default Conditions
Transform Column Names
Add Query Metadata
Subscription Processors
Subscription-specific processors handle recurring queries:get_subscription_processors()
Query Validation
Validators check query constraints:Processor Registration
Processors are registered with entities and storages:Pipeline Execution
The full pipeline execution:snuba/web/query.py:36
Debugging Processors
Enable debug mode to see processor effects:Related
Datasets
Dataset and entity configuration
Query Builder
Build queries programmatically