Metrics
Counters, gauges and histograms — translated to ClickHouse SQL and held at 574/574 on the CNCF PromQL Compliance Tester.
A drop-in Prometheus, Loki & Tempo HTTP gateway for ClickHouse. Point Grafana at cerberus as three datasources — your existing PromQL, LogQL and TraceQL keep working, translated to ClickHouse SQL underneath.
Cerberus speaks each upstream HTTP API verbatim, so Grafana sees three ordinary datasources. Your dashboards, alerts and CLI tooling keep using the exact query languages they already use — cerberus does the translation.
Counters, gauges and histograms — translated to ClickHouse SQL and held at 574/574 on the CNCF PromQL Compliance Tester.
Stream selectors, line filters and metric queries — diffed against a real Loki on Grafana's own bench corpus.
Span filters and structural queries served through the upstream Tempo HTTP API — the newest of the three heads.
Metrics, logs and traces rarely share a store — the usual answer is Prometheus + Loki + Tempo: three retention policies and three storage bills for what is largely the same OTLP data sliced three ways. ClickHouse is a great single store for all three signals; cerberus supplies the missing query side.
Cerberus speaks each upstream HTTP API verbatim — /api/v1/query_range, /loki/api/v1/query_range, /api/search. Grafana sees three normal datasources.
PromQL, LogQL, TraceQL — exactly as your dashboards and alerts already use them. Nothing to relearn.
Imports prometheus/promql/parser, loki/logql/syntax and tempo/traceql directly. If upstream parses it, cerberus parses it.
Each head parses with its reference upstream parser and lowers to a shared plan IR. A rule-based optimiser rewrites it; a closed typed-Frag emitter produces parameterised, escape-free ClickHouse SQL; the engine streams results. The three HTTP heads plug in as thin Lang adapters — so a new optimisation costs one implementation, not three.
The three HTTP heads import their upstream parsers directly and lower into the same IR — so optimiser rules, the SQL builder and the execution engine are written once and shared. Cerberus reads the OpenTelemetry ClickHouse schema shape (column names, types, Map layout), not a specific exporter binary; CERBERUS_SCHEMA_* overrides handle SigNoz and custom layouts, and CERBERUS_AUTO_CREATE_SCHEMA bootstraps tables.
Between the parser and ClickHouse sits an optimiser, a typed SQL builder and an execution engine with the resilience controls you expect from something on the hot path of every dashboard, alert and on-call query.
The compose stack builds cerberus, boots single-node ClickHouse, loads a deterministic OTel fixture, and brings up Grafana pre-provisioned with cerberus as three datasources. A fresh dashboard populates in ~30s.
# clone, build, and boot the full demo stack
git clone https://github.com/tsouza/cerberus.git && cd cerberus
docker compose up --wait
# Grafana auto-login on :3000 · cerberus on :8080
open http://localhost:3000
# one stateless binary — pin an explicit tag
docker pull ghcr.io/tsouza/cerberus:1.5.0
docker run --rm -p 8080:8080 \
-e CERBERUS_CH_ADDR=clickhouse:9000 \
ghcr.io/tsouza/cerberus:1.5.0
# signed OCI chart — cosign + SLSA provenance
helm install cerberus \
oci://ghcr.io/tsouza/cerberus/charts/cerberus --version <x.y.z> \
--set clickhouse.addr='{clickhouse:9000}' \
--set clickhouse.existingSecret=ch-creds
Every head is diffed against its real upstream engine on shared, seeded data — pinning observed semantics on ClickHouse against an oracle, not just emitted SQL. No allow-lists.
Run through the third-party CNCF / PromLabs Compliance Tester against a real prom/prometheus seeded with identical data — the same suite the CNCF Prometheus Conformance Program uses. No allow-list.
Diffed query-for-query against a real Loki on Grafana's own pkg/logql/bench corpus — responses compared on ClickHouse against the upstream engine, not just the emitted SQL.
Served through the upstream Tempo HTTP API and diffed against a real Tempo on a maintained TXTAR query corpus — the newest head, validated the same case-for-case way.
Open source under Apache 2.0. Point Grafana at cerberus and your PromQL, LogQL and TraceQL just work.