Releases: yaop-labs/amber
Releases · yaop-labs/amber
v0.3.0
Performance
Metrics engine
- Resident compact block index (columnar fields + dictionary labels), removing repeated directory
decodes and label-string allocations. - Series-partitioned parallelism for range-step queries across workers.
- Streamed exact path for dense-block queries; bulk read of the chunk section instead of one ReadAt per
series. - Binary block directory, byte-budgeted directory cache, range-step scratch reuse.
- Stats is now O(blocks) via manifest sample counts; catalog REGISTER records batched behind one commit
wait.
Index / FTS
- Replaced roaring with sorted-slice bitmap sets (ULID keys shattered roaring containers).
- Posting-list FTS format replaces the radix snapshot (38MB to 5MB per segment).
- pread-backed token lookups, df==1 tokens in a flat hash section, arena-backed seal build state.
Storage / Query
- 512KiB blocks with footer v3 per-block time bounds to prune reverse-window scans.
- pread-based segment scans; shared readers no longer serialize.
- Bitmap prefilter for multi-value service/host/level filters; result-cache invalidation scoped to the
ingest batch time range.
Durability and correctness
- Binary WAL with series/sample records and a flush gate against acked-sample loss.
- Fail-stop WAL/segment/catalog writers after fsync or partial-write errors; WAL CRC covers length and
sequence. - Recovery: truncate the uncheckpointed active segment to avoid replay duplication; heal orphan segments
from the create/saveMeta crash window. - Histogram sketches unified into the main store; crash-safe histogram compaction with marker recovery.
Features
- rate_range endpoint exposing per-step range rates for metrics.
- MemoryLimit option setting the Go soft memory limit at open.
- db.Flush durability barrier and data-dir locking.
Benchmarks
- New obsbench harness: datagen, ingest loadgen, memory sampler, preflight.
- Log scenarios Q1-Q4 and metrics scenarios QM1-QM4 (OTLP) with result-count equality gates.
- kill -9 durability-loss orchestration and queryable-count verification.
Other
- Documentation across all packages (model, storage, index, query, ingest, metricsengine, api/http,
runtime). - CI pipeline with static checks gating build and test.
- README updated with campaign medians; lint cleanup and go mod tidy.
v0.2.0
v0.2.0
Features
- Public embed API:
amber.Open,Options,Cardinality,S3config — stable surface for embedding amber into another binary. - S3 segment tiering:
SegmentStoreinterface withLocalStoreandS3Storeimplementations, automatic upload on seal. - Posting list index for
trace_id— replaces bitmap for high-cardinality fields. - Ribbon filter for segment-level pruning.
- Cardinality guard: caps attrs per entry, attr value length, and unique keys per service.
- Circuit breaker rejects writes after consecutive batch failures.
- Prometheus
/metricsendpoint with ingest and WAL counters (hand-rolled exporter, noclient_golangdependency). /readyzgate and per-request size limits on the HTTP API.- Timing-safe API key comparison, gated pprof.
Performance
- Zero-copy block scan: ~100k allocations -> ~40 per segment scan.
processBatchallocations halved via metric handles and zstd encoder reuse.
Bug fixes
- Segment header is now fsynced before WAL replay (fixes zero-byte segment after crash).
- WAL replay caps per-record size and surfaces corruption events.
- Writer state and
activeSizecorrectly restored after restart. - Atomic index writes; WAL checkpoint durability.
- Rotation no longer reopens readers; retention sort fixed; seal retry on failure.
Tests
- Real SIGKILL chaos test for WAL recovery (subprocess + atomic marker).
- Contract test for the public embed API (
amber_example_test.go). - White-box benchmarks for query, ingest, storage, and indexer paths.
- 10M-record self-tracking benchmark (
loadbench) with write/memory/read metrics. - Metrics exporter coverage: counters, escaping, exposition format.
Tooling
loadbench,lokibench,vlbench,httpbench— apples-to-apples benchmarks against Loki and VictoriaLogs over HTTP.lefthookpre-commit and pre-push hooks (gofmt, govet, golangci-lint, tests).