Search retained logs through LogQL
Stream selectors narrow the read while word indexes prune candidate granules before LogQL pipelines process the matching lines.
PulsusDB brings familiar observability APIs to a ClickHouse® database backend built for large telemetry volumes. Ingest with OpenTelemetry, preserve existing clients and dashboards, and scale the stateless API tier independently from durable storage.
SELECT service, count() FROM log_samples PREWHERE ts BETWEEN … GROUP BY service PulsusDB separates the interface engineers use from the physical execution plan. PromQL, LogQL and TraceQL remain at the edge while purpose-built data models, columnar reads and SQL pushdown handle the volume underneath.
Explore the architecture →Stream selectors narrow the read while word indexes prune candidate granules before LogQL pipelines process the matching lines.
Scale readers and writers independently without moving durable state away from the ClickHouse database tier.
Automatically route eligible PromQL ranges to the coarsest resolution that preserves the requested result.
Compile filters, grouping, joins and eligible aggregation into SQL, reducing traffic between the stateless and database tiers.
PulsusDB parses each expression, selects the physical read path and pushes exact filters, grouping and eligible aggregation into the ClickHouse database. Only the required result crosses back to the stateless tier.
{service_name="checkout"} |= "timeout" Resolve labels first. Word indexes prune indexable terms; substring-only filters scan the selected streams.
SELECT ts, labels, body
FROM log_samples
PREWHERE ts BETWEEN $start AND $end
AND fingerprint IN (…)
WHERE body LIKE '%timeout%'
ORDER BY ts DESC LIMIT 100
sum by (service) (rate(http_requests_total[5m])) Keep the Prometheus API. Push safe work into the ClickHouse database, evaluate the rest faithfully.
SELECT service, toStartOfInterval(ts, 60)
AS bucket, sum(value) AS samples
FROM metric_samples
PREWHERE metric_name = $metric
AND ts BETWEEN $start AND $end
GROUP BY service, bucket
{ resource.service.name = "api" && duration > 1s } Search traces by the attributes engineers actually use, not only by trace ID.
SELECT trace_id, min(start_ts), max(end_ts)
FROM trace_spans
PREWHERE service = $service
AND start_ts BETWEEN $start AND $end
WHERE duration_ns > 1000000000
GROUP BY trace_id ORDER BY min(start_ts) DESC
Start with one process, then scale ingestion and query independently as traffic changes. Durable telemetry, rollups and distributed execution remain in the ClickHouse database tier.
Start small with all mode and a single ClickHouse node.
Split writer and reader modes as the workload grows.
Restart and load-balance PulsusDB freely; caches are rebuildable.
Connect Prometheus-compatible clients and observability tools to the APIs they already understand while PulsusDB changes the storage and execution path underneath them. Product-neutral endpoints remain available alongside optional compatibility routes.
PULSUS_COMPAT_ENDPOINTS=true PulsusDB is an AGPLv3 digitalis.io product under active development. Source code, architecture documents, query examples and implementation issues are public.
$ git clone digitalis-io/pulsusdb
Cloning into 'pulsusdb'...
$ cd pulsusdb
$