Skip to content

Releases: tma1-ai/openfuse

v1.0.0-alpha.2

21 Jun 18:24

Choose a tag to compare

v1.0.0-alpha.2 Pre-release
Pre-release

Second alpha. This release focuses on ingestion throughput and correctness on the GreptimeDB write path. The product, public APIs, SDKs, and read-path parity are unchanged from v1.0.0-alpha.1 (still based on upstream Langfuse v3.184.1).

Highlights

  • Faster, stall-free ingestion drain. The live drain no longer stalls under load and is ~4× faster (~27 → ~108 traces/s in our 60k-trace benchmark). Three independent fixes: the protobuf encode + gRPC write moved to a worker_threads pool (off the worker event loop that was starving every job's raw_events read); a table-scoped raw_events flush keeps the per-event point read on prunable SSTs (~20× faster read); and a per-entity Redis watermark coalesces redundant rebuilds when draining a backlog.
  • No-delete EAV writes. The per-rebuild EAV DELETE is replaced by a read-time generation filter — reads keep only an entity's current generation, so a dropped key is excluded without a delete. Less write amplification on a single GreptimeDB.
  • Correctness fixes.
    • EAV generation is now unique within a millisecond — a same-millisecond re-append could otherwise collide and leave a stale EAV key visible.
    • Cold start no longer leaves observation cost empty: the worker waits for the schema/model-price seeding before it begins ingesting, so generations always get their cost computed.
    • The Sessions list query no longer 500s — the session_tags subquery now projects eav_generation so the generation-correlated tag join resolves.

For measured drain / query-latency / storage numbers vs upstream Langfuse on ClickHouse, see the benchmark report; for the new tuning knobs see operations.

Images

Published to Docker Hub, all tagged 1.0.0-alpha.2:

This is a pre-release, so latest does not move — pin the explicit tag.

Quickstart

git clone https://github.com/tma1-ai/openfuse.git
cd openfuse
git checkout v1.0.0-alpha.2
cp .env.quickstart.example .env
docker compose -f docker-compose.standalone.yml up -d

Full changelog: v1.0.0-alpha.1...v1.0.0-alpha.2

v1.0.0-alpha.1

21 Jun 04:20
590acec

Choose a tag to compare

v1.0.0-alpha.1 Pre-release
Pre-release

First public preview. Openfuse is a fork of Langfuse v3.184.1 that swaps the analytics store from ClickHouse to GreptimeDB. The Langfuse product, public APIs, and SDKs stay the same — GreptimeDB becomes the source of truth for traces, observations, scores, and the analytics behind dashboards.

LLM traces are observability data: timestamped wide events with high-cardinality context. That's exactly GreptimeDB's data model. Running Langfuse on it instead of a single-purpose columnar store buys two things today: start on a single container and scale to a cluster without losing data, and cheap long retention via object-storage-native tiered storage plus a plain-SQL TTL (LANGFUSE_GREPTIME_TTL) — where configurable retention is an Enterprise feature on ClickHouse-backed Langfuse.

What works

  • Ingestion — the public ingestion API and the OTel endpoint write to raw_events; the worker replays the full event history into merged projections.
  • Reads — traces, observations, scores, sessions, dashboards/metrics, datasets, experiments, daily metrics, exports, and the public GET endpoints all read from GreptimeDB.
  • Dashboards — the metrics query engine runs on GreptimeDB, including metadata, tag, and tool filters and breakdowns. Output is checked byte-for-byte against upstream Langfuse: 199 parity cases PASS, 0 FAIL (parity report).
  • Mutations, deletion, replay — UI edits and deletions append synthetic events to raw_events, so replay rebuilds the merged (or soft-deleted) state instead of resurrecting or losing it.
  • Automatic migrations — the web and standalone containers migrate both Postgres and the GreptimeDB schema on startup. No manual bootstrap.

Images

Published to Docker Hub, all tagged 1.0.0-alpha.1:

This is a pre-release, so latest does not move — pin the explicit tag.

Quickstart

git clone https://github.com/tma1-ai/openfuse.git
cd openfuse
git checkout v1.0.0-alpha.1
cp .env.quickstart.example .env
docker compose -f docker-compose.standalone.yml up -d

Open http://localhost:3000 and log in as demo@example.com / langfuse-dev, or point any Langfuse SDK at the bundled keys (pk-lf-1234567890 / sk-lf-1234567890). These are insecure dev defaults — for a real deployment start from .env.prod.example and set your own secrets, including GREPTIME_PASSWORD to enforce auth on the analytics store. Full guide: deployment.

Known limitations

This is an alpha — read Known limitations before depending on it. The short list:

  • Indexed full-text search is whole-term only — substring matching on indexed fields differs from upstream.
  • GreptimeDB migrations are idempotent DDL with no ledger — re-applied in full on every start, serialised by advisory lock, fail-closed.
  • Object storage is optional, not gone — media, the OTel carrier, and the eval blob store default to local filesystem; opt-in batch/blob exports still need an S3-compatible bucket.
  • dataset_run_items deletion is a projection hard-delete — the one source-of-truth exception to the replay model.

Compatibility

Based on upstream Langfuse v3.184.1. Existing Langfuse SDKs and the public ingestion/REST APIs work unchanged. Postgres migrations are upstream's and apply as-is; the GreptimeDB schema is fork-specific and migrates automatically on startup. The few intentional divergences are all cases where the fork is equal or more correct — see the parity ledger.

Openfuse is a community fork and is not affiliated with or endorsed by Langfuse.

What's next

Beta. And a direction a single-purpose store can't follow — PromQL-native metrics, logs ↔ traces correlation, OTLP-native ingestion, Flow continuous aggregation. Directional, not delivered; tracked in #8. Try it on real workloads and open issues — that's what gets it to beta.


What's Changed

  • feat(greptimedb): ingestion write path on GreptimeDB (design 02) by @killme2008 in #1
  • feat(greptimedb): 04 read-path foundation (SQL dialect + row contract + dataset_run_items projection) by @killme2008 in #2
  • feat(greptimedb): 04 P1 core entity reads on GreptimeDB by @killme2008 in #3
  • feat(greptimedb): P2 — UI rollup read path on GreptimeDB (traces/sessions/observations tables + dashboards) by @killme2008 in #4
  • feat(greptimedb): P3 — events *FromEvents collapse + dashboard executeQuery engine on GreptimeDB by @killme2008 in #5
  • feat(greptimedb): GAP-MUT write path for tRPC UI mutations + read-path fixes by @killme2008 in #6
  • feat(greptimedb): P4 — complete dataset/experiment read-path migration to GreptimeDB by @killme2008 in #9
  • feat(greptime): P5 — public API + streaming export + obs-from-events collapse by @killme2008 in #10
  • fix(greptime): dedupe relation measure in two-level dashboard query (home page 500) by @killme2008 in #11
  • P6 — worker cleaners, retention TTL, blob-file-log removal, export-to-sink → GreptimeDB by @killme2008 in #13
  • feat(media): add local file storage backend by @killme2008 in #12
  • feat(greptime): P7 — delete the ClickHouse client (GreptimeDB-only cutover) by @killme2008 in #14
  • feat(greptime): isolate batch write failures via group bisection by @killme2008 in #15
  • feat(greptime): score source-of-truth, project-delete guard, reconciliation by @killme2008 in #16
  • GreptimeDB query correctness: eval experiment join, obs filter pushdown, dashboard measures, experiment-LIST preagg by @killme2008 in #17
  • chore(greptime): P7 residual cleanup — remove dead ClickHouse code, drop @clickhouse/client, delete EE package, DB-neutral renames by @killme2008 in #19
  • GreptimeDB audit follow-up + index tier-1 (PR-A) by @killme2008 in #20
  • Remove v4-beta preview + events-backed v2 observations (PR-B) by @killme2008 in #21
  • GreptimeDB deployment track + CI/Docker fixes (PR-C) by @killme2008 in #22
  • feat: make MinIO/S3 optional — zero object storage by default by @killme2008 in #26
  • fix: self-hosted compose deploy fixes found in MinIO-optional smoke by @killme2008 in #27
  • Remove web/src/ee (Langfuse commercial Enterprise Edition) by @killme2008 in #29
  • GreptimeDB database-level retention (default 730d) by @killme2008 in #30
  • Drop orphaned v2-observations public-API readers by @killme2008 in #32
  • docs: GreptimeDB data-layer docs + CI speedups by @killme2008 in #31
  • F5: long-tail usage/cost key aggregation via an observation EAV table by @killme2008 in #34
  • perf(traces): COUNT(*) trace observations instead of fetching rows to size them by @killme2008 in #35
  • Post-merge cleanup: v2-obs types, retention env validation, dead UI + workflows by @killme2008 in #33
  • feat(greptime): fleet-wide reconciliation backfill orchestrator by @killme2008 in #38
  • perf(greptime): write only custom usage/cost keys to EAV table by @killme2008 in #36
  • feat(brand): rename user-visible UI from Langfuse to Openfuse by @killme2008 in #37
  • F5 perf: GreptimeDB SST metrics, by-type join skip, compaction runbook by @killme2008 in #40
  • feat(greptime): bulk Arrow Flight backfill for reconciliation by @killme2008 in #41
  • ci: Docker Hub image publishing + workflow cleanup by @killme2008 in #42
  • fix(greptime): metrics output parity with ClickHouse + Quality Gate C harness by @killme2008 in #44
  • feat(greptime): tool-name EAV tables for dashboard tool filters + breakdowns by @killme2008 in #45
  • docs: alpha-ready README, governance, and user-facing docs by @killme2008 in #46
  • feat(standalone): single-container image + automatic in-container GreptimeDB migration by @killme2008 in #47
  • docs: professionalize README + docs, ship 1.0.0-alpha.1 by @killme2008 in #49
  • feat(greptime): def...
Read more