ClickHouse vs Langfuse
Both are catalogued under Observability & Evals. The figures come from the GitHub API; the assessments are ours.
At a glance
| At a glance | ClickHouse | Langfuse |
|---|---|---|
| License | Apache-2.0 | MIT |
| Languages | C++, Python | TypeScript, Python |
| Deployment | Self-hosted / Runs locally / Managed cloud | Self-hosted / Managed cloud |
| Maturity | Established | Established |
| Stars | 49.3k | 33.2k |
| Star growth over the last 7 days | — | +7 ★ |
| Forks | 8.8k | 3.6k |
| Open issues | 6.9k | 781 |
| Last commit | 16 Aug 2026 | 15 Aug 2026 |
| Activity | Active | Active |
What each one does
ClickHouse
A column-oriented engine for append-heavy, high-cardinality data, which is the shape agent telemetry takes: one row per model call, filtered later by model, cost or error. Langfuse moved its traces here from Postgres in December 2024 and ClickHouse acquired the project in January 2026, so a self-hosted observability stack increasingly means running this underneath. It is the wrong choice for anything transactional — updates and deletes rewrite whole column parts rather than edit rows — so treat it as where agent runs land, not as the database your application writes state to.
Full entry →Langfuse
Records what an agent actually did — every call, tool invocation and cost — and turns those traces into evaluation datasets. The managed service runs the same codebase you can self-host with Docker Compose, so migrating in either direction stays cheap. Some enterprise features sit outside the MIT core; check which tier you need before committing.
Full entry →What you can do
ClickHouse
- Store one row per model call — Columnar storage means a query filtering observations by model, cost or error status reads only those columns while multi-megabyte prompt and completion payloads stay on disk, and the engine is built for large batch inserts merged in the background rather than single-row writes — which is how a queued trace ingestion pipeline wants to write.
- Inherit the storage layer under Langfuse — Langfuse moved tracing data out of Postgres into ClickHouse in December 2024, and ClickHouse acquired Langfuse on 16 January 2026, saying the core stays MIT-licensed and self-hostable at production scale. ClickStack, its OpenTelemetry-native observability stack, runs on the same engine.
- Search embeddings without a second database — A
vector_similarityindex builds an HNSW graph overArray(Float32),Array(Float64)orArray(BFloat16)columns withL2Distance,cosineDistanceordotProduct, available from version 25.8. The index has to be loaded from disk into memory in full to serve a search, and building it slows inserts and merges. - Expect exact scans once you filter — Pre-filtering by metadata is, in the documentation's own words, an unsolved problem — ClickHouse falls back to exact nearest-neighbour search — and post-filtering can return fewer rows than the
LIMITasked for when candidates fail theWHEREclause. If narrow metadata filters over a large collection are your main access pattern, a dedicated vector store handles it better. - Let an agent query it over MCP — ClickHouse publishes
mcp-clickhousein a separate repository, exposinglist_databases,list_tablesandrun_queryplus a chDB tool for embedded queries. It runs read-only unlessCLICKHOUSE_ALLOW_WRITE_ACCESS=trueis set, withDROPandTRUNCATEbehind a second flag.
Langfuse
- Instrument an app function by function — Importing
from langfuse.openai import openaicaptures each OpenAI call with its model parameters, and every function you wrap in@observe()is recorded as its own nested step — the README'smain()andstory()pair — so retrieval and agent code appears in the trace only once it is decorated too. - Version prompts outside your code — Prompt Management holds prompts centrally with version control, and caching on both server and client means fetching the current version adds no latency to your application.
- Turn traces into test sets — Datasets build benchmarks for pre-deployment testing, scored with LLM-as-a-judge, code evaluators, manual labelling or collected user feedback.
- Retry failures in the playground — From a bad result in a trace you can jump straight into the LLM Playground and re-run it against a different prompt or model configuration.
- Self-host on your own infrastructure —
docker compose upfor a local instance, a Helm chart as the preferred production path on Kubernetes, and Terraform templates for AWS, Azure and GCP.