Server-side filtering lets you subscribe to specific event types with rulekit expressions, reducing bandwidth and eliminating client-side filtering. Instead of receiving all events and discarding most, tell Qtap exactly what you want.
New in v0.14.0: Server-side filtering requires Qtap v0.14.0 or later. Earlier versions stream all events without filtering.
Why Server-Side Filtering?
Without Filtering
With Filtering
Receive all events, filter client-side
Receive only matching events
High bandwidth in busy environments
Minimal bandwidth usage
Client processes every event
Server handles filtering
Same data for all consumers
Different filters per connection
Use cases:
High-traffic environments: Subscribe only to errors instead of all HTTP transactions
Targeted monitoring: Watch specific containers or processes
Multi-consumer scenarios: Different dashboards subscribe to different event types
The response stream starts with system.connected confirming your subscription:
API Reference
Endpoint
Subscription Payload
The JSON payload uses a topics object to specify subscriptions:
Topic names must be lowercase: Use http, process, connection - not capitalized versions.
Subscription Semantics
Payload
Behavior
"*"
Subscribe to all events of that type
Filter expression
Subscribe to matching events only
Omit topic
No events of that type
Empty payload {}
Default: all topics with "*"
Examples
Filter Fields by Topic
Native properties (belonging to the event type) have no prefix. Relational properties (from associated entities) are prefixed.
Verified Fields: Fields marked with ✓ have been tested and verified to work with server-side filtering. Fields in the "Not Available" section are present in event data but cannot be used for server-side filtering.
Process Events
Fields available for process.started and process.stopped events:
Not available for server-side filtering (present in event data only):
req.path, req.url - Full path/URL available in decoded event payload
dst.domain - Use req.host instead
tls.enabled, tls.version, tls.sni - TLS info available in event data
process.user.id - Use process.user.name instead
Cross-Entity Filtering: Filters can apply across related entities. For example, filtering HTTP events by container.name == "nginx" will match HTTP requests from that container via connection cache lookup.
# Good: Only HTTP events
curl -sN -X POST ... -d '{"topics": {"http": "*"}}'
# Wasteful: All events when you only need HTTP
curl -sN -X POST ... -d '{}'
# Start simple
curl -sN -X POST ... -d '{"topics": {"http": "res.status >= 400"}}'
# Then add complexity
curl -sN -X POST ... -d '{"topics": {"http": "res.status >= 400 AND process.binary == \"python3.11\""}}'