The LogQL query layer for ClickHouse® software

LogQL
On ClickHouse® software

Keep the selectors, filters, pipelines and aggregations your teams already know while PulsusDB translates LogQL into read plans for ClickHouse® software

logql.queryLOGS
LogQL{service_name="checkout"} |= "timeout"
PLAN↓index + time pruning
CLICKHOUSE SQL
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
Streams, metrics or live tailX-Pulsus-Explain: 1
LOGSLogQLCLICKHOUSE DATABASESTATELESS QUERY LAYER
A familiar language with a different read path

Resolve streams first Index whole words

PulsusDB treats the read path as part of the schema. Label indexes narrow the stream set and word indexes prune filters with indexable terms. Substring-only filters still scan those selected streams, while the query engine handles the LogQL pipeline and response shape

01

Selectors and filters

Match streams by label and filter lines with familiar LogQL syntax. Whole words can use the index; substrings cannot

02

Pipelines and metrics

Parse structured lines, transform labels, unwrap values and aggregate log-derived metrics

03

Search and live tail

Use range and instant queries, label and series discovery, index stats and WebSocket live tail

04

Loki compatibility

Enable flag-gated Loki query aliases when an existing datasource needs the familiar endpoint surface

From selector to compiled plan

See the query
See the SQL

Move from a simple selector to a complex expression and inspect the representative ClickHouse SQL shape PulsusDB produces at each level

01Simple LogQL

Select one log stream

The label selector is resolved first, so the sample scan starts with a small set of fingerprints instead of reading every log line

LOGQLRange query · newest 100 lines
{service_name="checkout"}
PLAN STAGES
  1. 01label index
  2. 02stream fingerprints
  3. 03time pruning
CLICKHOUSE SQLREPRESENTATIVE PLAN
SELECT fingerprint
FROM log_streams_idx
WHERE key = 'service_name' AND val = 'checkout'
GROUP BY fingerprint;

SELECT fingerprint, timestamp_ns, body, structured_metadata
FROM log_samples
PREWHERE service IN ('checkout')
WHERE fingerprint IN ({resolved_streams})
  AND timestamp_ns > {start} AND timestamp_ns <= {end}
ORDER BY timestamp_ns DESC, fingerprint DESC
LIMIT 100
Two bounded reads instead of a global log scanX-Pulsus-Explain: 1
SQL is shortened for readability and uses named placeholders Read the query lowering reference ↗
From expression to efficient read

Plan the query
Protect the answer

PulsusDB only pushes work into the ClickHouse database when it can preserve the language’s semantics. Everything else remains the query engine’s job

01
RESOLVE

Start with labels

Turn the stream selector into a bounded set of fingerprints before scanning log bodies

02
PRUNE

Use the word index

Prune indexable word searches in the ClickHouse database while leaving substring-only matching on the bounded stream scan

03
PIPELINE

Finish LogQL faithfully

Evaluate parsers, transformations and aggregations that belong in the query engine

Product-neutral by default

The API surface
your tools need

Use PulsusDB’s documented API directly. Compatibility aliases remain optional, so the platform is not defined by another product’s routing conventions

See the compatibility matrix ↗
GET/api/logs/v1/query_rangeRange query
GET/api/logs/v1/queryInstant query
WS/api/logs/v1/tailLive tail
One platform every signal

Keep following
the question

Move from one signal to the next without changing the observability data platform underneath