Skip to content

v0.27.0

Choose a tag to compare

@KIvanow KIvanow released this 15 Jul 08:46
235f8bf

AI observability lands (Valkey-native cache/memory metrics, OTLP traces with a correlation waterfall), two new Valkey-issue-backed anomaly detectors, worst-offender sorting for the logs, and a redesigned first-run connect screen built to convert.

✨ Added

AI observability

  • AI Cache & Memory tab (#312) - auto-discovers BetterDB agent-cache, semantic-cache, agent-memory, and retrieval instances on the connected Valkey via the __betterdb:caches registry (heartbeat liveness, zero app-side config) and charts hit rate, cost saved, evictions, index size, and history. Per-tick hit rate is derived from counter deltas; samples persist in the new ai_cache_samples store across sqlite / postgres / memory with tier-based retention.
image
  • AI Traces: OTLP ingestion, waterfall, and Valkey correlation (#313) - POST /v1/traces OTLP ingestion (keeps @betterdb/* spans plus roots) feeding an AI Traces waterfall, then correlates spans with live Valkey state to explain why a hit or miss happened. New otel_spans store + per-trace summaries across all adapters, GET /ai/traces, GET /ai/traces/:traceId, and GET /ai/traces/:traceId/correlate. Ingest supports an optional bearer token and fails closed on cloud when no token is configured.
image
  • OTLP http/protobuf ingestion (#314) - /v1/traces now accepts the OTel SDK's default http/protobuf encoding alongside http/json, so exporters work without flipping a config flag. Decodes with a minimal inline proto (fixed64 timestamp precision preserved) and answers protobuf requests with protobuf responses per the OTLP/HTTP spec.

Anomaly detection

  • Connection saturation (#317, valkey#3918) - closes the "approaching the wall" gap before maxclients exhaustion locks out operators, and unbundles rejected_connections from ACL_DENIED so a connection-limit event is no longer misread as an auth attack.
  • Stuck orphaned replicas after primary loss (#310, valkey#2090) - after a primary is replaced by a fresh node (classic k8s pod restart), a surviving replica can keep replicating the dead primary forever. Detects the stuck state and recommends the maintainers' own remediation.

Logs

  • Magnitude sort (top-N worst offenders) (#316, valkey#3895) - SLOWLOG and COMMANDLOG queries take sortBy: 'recent' | 'magnitude'; magnitude returns the worst offenders first (µs for slow, bytes for large-request/large-reply). Because every entry is persisted durably, bursts of mildly-slow commands can't evict the genuine outliers the way Valkey's small in-memory log does.
image

Onboarding

  • Connect-screen redesign for first-time activation (#321) - the no-database screen is rebuilt to convert: quick connect by pasting a redis:// / rediss:// / valkey:// URL (failures hand off to the prefilled form), contextual per-page headlines instead of one generic dead end, one-click Connect localhost:6379 + Docker one-liner (self-hosted) or Create a 1 GB Valkey instance (cloud), provider setup-guide chips, a read-only trust line, and a troubleshooting link. Pasting a full URL into the Add Connection form's Host field fills every field.
image

🔧 Changed

  • Managed Valkey instance sizing (#321, cloud) - pod memory limit (2× maxmemory) and volume size (4×) now scale with the requested instance size instead of the fixed chart defaults; requested maxmemory is hard-capped at 2gb (DTO + service + sizing clamp) and a 1gb size option was added.
  • SlowLog storage refactor (#191) - SLOWLOG persistence extracted into a shared SlowLogRepository across the sqlite / postgres / memory adapters. No behavior change.

Full changelog: v0.26.0...v0.27.0

What's Changed

  • Adding OpenAI Agents SDK adapter by @amitkojha05 in #149
  • feat(semantic-cache): add Google AI (Gemini) embedding provider by @Vswaroop04 in #160
  • test(storage): skip CI-only-flaky cache_proposals constraint tests by @KIvanow in #309
  • feat(anomaly): detect stuck orphaned replicas after primary loss (valkey#2090) by @KIvanow in #310
  • feat(agent-cache-py): add Pydantic AI adapter by @amitkojha05 in #131
  • feat(semantic-cache): runtime-configurable defaultTtl via __config hash by @amitkojha05 in #161
  • refactor(storage): extract SlowLogRepository across all three storage adapters by @amitkojha05 in #191
  • feat(ai-observability): AI Cache & Memory tab (Valkey-native) by @KIvanow in #312
  • feat(ai-observability): OTLP traces, waterfall, and Valkey correlation by @KIvanow in #313
  • feat(ai-observability): OTLP protobuf ingestion by @KIvanow in #314
  • feat(anomaly): connection-saturation detection + unbundle rejected_connections (valkey#3918) by @KIvanow in #317
  • feat(logs): magnitude sort (top-N worst offenders) for slow/command log by @KIvanow in #316
  • feat(web): redesign no-connection screen for first-time activation by @KIvanow in #321

Full Changelog: v0.26.0...v0.27.0