Overview
Subscription configuration controls:- Aggregation limits: Maximum number of aggregations per query
- Disallowed operations: Operations not permitted in subscriptions
- Validation rules: Custom validators for subscription queries
- Processing logic: Custom processors for subscription execution
- Time column requirements: Time-based filtering rules
Configuration Levels
Subscription configuration exists at two levels:Entity-Level
Defined in entity YAML files. Applies to all subscriptions on that entity.
Storage-Level
Defined in writable storage YAML files. Controls subscription infrastructure.
Entity Subscription Configuration
Schema
Array of validator configurations for subscription queries.
Array of processor configurations for subscription execution.
Basic Example
Entity Subscription Config
Subscription Validators
Validators enforce rules on subscription queries:AggregationValidator
Controls aggregation complexity:Maximum number of aggregation functions allowed per query.
Array of clause types not allowed in subscriptions (e.g.,
having, orderby).Name of the time column that must be filtered in subscription queries.
Whether GROUP BY is allowed without WHERE conditions.
Aggregation Validator
Custom Validators
You can register custom validators:Custom Validator
Using Custom Validator
Subscription Processors
Processors transform subscription queries before execution:Subscription Processors
Common Processors
AddColumnProcessor
AddColumnProcessor
Automatically adds required columns to subscription queries.
MetricsTimeProcessor
MetricsTimeProcessor
Processes time-based aggregations for metrics subscriptions.
Storage Subscription Configuration
Writable storages configure subscription infrastructure:Storage Subscription Config
Subscription Stream Configuration
Kafka topic for scheduled subscription executions.
Kafka topic where subscription results are published.
Scheduler mode:
partition (per-partition scheduling) or global (global scheduling).Timestamp field for synchronization:
orig_message_ts- Use original message timestampreceived_p99- Use 99th percentile of received timestamp
Additional delay in seconds before executing subscriptions (0-120).
Complete Examples
Events Entity Subscriptions
events.yaml
Errors Storage Subscriptions
errors.yaml
Metrics Entity Subscriptions
metrics_counters.yaml
Subscription Scheduler Modes
Partition Mode
Schedules subscriptions per Kafka partition:Partition Mode
- Better parallelism
- Partition-level ordering guarantees
- Scales with Kafka partitions
- High subscription volume
- Partition-level ordering is sufficient
- Horizontal scaling is needed
Global Mode
Schedules subscriptions globally across all partitions:Global Mode
- Global ordering guarantees
- Simpler coordination
- Better for low-volume subscriptions
- Strict global ordering required
- Lower subscription volume
- Simpler deployment preferred
Subscription Delays
Control when subscriptions execute relative to data arrival:Subscription Timing
Synchronization Timestamps
orig_message_ts
orig_message_ts
Use the original message timestamp from the event.Advantages: Reflects actual event timeDisadvantages: Doesn’t account for ingestion delaysUse with: Higher delay_seconds (e.g., 60) to account for ingestion
received_p99
received_p99
Use the 99th percentile of message received time.Advantages: Accounts for ingestion delays automaticallyDisadvantages: May lag behind real-time slightlyUse with: Lower delay_seconds (e.g., 30)
Delay Seconds
Additional buffer time before executing subscriptions:- Low delay (10-30s): Fast results, may miss late-arriving data
- Medium delay (30-60s): Balanced, catches most data
- High delay (60-120s): Catches late data, slower results
The
subscription_delay_seconds must be between 0 and 120 seconds. Choose based on your data latency requirements.Query Examples
Subscription queries follow standard SnQL syntax with validation:Creating Subscriptions
Create subscriptions via the Snuba API:Create Subscription
Best Practices
Limit Complexity
Set reasonable max_allowed_aggregations to prevent expensive subscription queries.
Require Time Filters
Always require time column filters to prevent full table scans.
Use Partition Mode
Prefer partition mode for scalability with high subscription volumes.
Tune Delays
Balance between result freshness and data completeness with appropriate delays.
Monitoring Subscriptions
Monitor subscription health:- Scheduled topic lag: Check Kafka lag on scheduled topic
- Result topic throughput: Monitor result topic message rate
- Query execution time: Track subscription query performance
- Validation failures: Monitor validation error rates
Troubleshooting
Validation Failures
Validation Failures
Symptom: Subscriptions rejected with validation errorsSolutions:
- Check max_allowed_aggregations limit
- Verify required_time_column is filtered
- Remove disallowed clauses (HAVING, ORDER BY)
- Ensure GROUP BY has WHERE conditions if required
Late Results
Late Results
Symptom: Subscription results arrive later than expectedSolutions:
- Reduce subscription_delay_seconds
- Check Kafka consumer lag
- Verify subscription_synchronization_timestamp setting
- Monitor query execution times
Missing Data
Missing Data
Symptom: Subscriptions miss some eventsSolutions:
- Increase subscription_delay_seconds
- Use received_p99 synchronization timestamp
- Check Kafka retention settings
- Verify partition assignment
Related Configuration
Entities
Configure entity-level subscription validators
Storages
Set up storage-level subscription infrastructure
Overview
Configuration system overview