MCPcopy Index your code
hub / github.com/BetterDB-inc/monitor

github.com/BetterDB-inc/monitor @agent-memory-v0.5.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release agent-memory-v0.5.0 ↗ · + Follow
7,241 symbols 22,684 edges 1,180 files 561 documented · 8%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

BetterDB Monitor

A monorepo application for monitoring Valkey/Redis databases with a NestJS backend and React frontend.

Website | Docker Hub | npm | Documentation | Blog

BetterDB is built by BetterDB Inc., a public benefit company operating under the OCV Open Charter.

Project Structure

betterdb-monitor/
├── apps/
│   ├── api/                 # NestJS backend (Fastify)
│   └── web/                 # React frontend (Vite)
├── packages/                # Published packages (see below)
├── docs/                    # Documentation site (Jekyll)
├── docker-compose.yml       # Local Valkey (port 6380) and Redis (port 6382) for testing
└── package.json             # Workspace root

Packages

This monorepo ships several standalone packages. See packages/ for the full list.

Caching

Package Language Registry
@betterdb/semantic-cache TypeScript npm
betterdb-semantic-cache Python PyPI
@betterdb/agent-cache TypeScript npm
betterdb-agent-cache Python PyPI

Tools

Package Language Registry
@betterdb/monitor TypeScript npm
@betterdb/mcp TypeScript npm
@betterdb/agent TypeScript npm

Benchmarking

Package Language Description
cache-benchmark Python Replay harness for benchmarking semantic caches against public datasets

Tech Stack

Backend

  • NestJS with Fastify adapter
  • iovalkey for Valkey/Redis connections
  • TypeScript with strict mode
  • Runs on port 3001

Frontend

  • React with TypeScript
  • Vite for build tooling
  • TailwindCSS for styling
  • Recharts for data visualization
  • Runs on port 5173

Monorepo

  • pnpm workspaces for dependency management
  • Turborepo for build orchestration

Quick Start

Prerequisites

  • Node.js >= 20.0.0
  • pnpm >= 9.0.0
  • Docker (for local Valkey or Redis instances)

Installation

  1. Install dependencies:
pnpm install
  1. Copy environment variables:
cp .env.example .env
  1. Start local database instances (Valkey on 6380, Redis on 6382):
pnpm docker:up

To connect to Redis instead of Valkey, update .env:

DB_PORT=6382
  1. Start development servers:
pnpm dev

The application will be available at: - Frontend: http://localhost:5173 - Backend API: http://localhost:3001

Individual Commands

Run only the API:

pnpm dev:api

Run only the web frontend:

pnpm dev:web

Stop Docker containers:

pnpm docker:down

Build for production:

pnpm build

CLI Installation (npx)

The easiest way to run BetterDB Monitor without Docker:

npx @betterdb/monitor

On first run, an interactive setup wizard will guide you through configuration: - Database connection (host, port, credentials) - Storage backend (SQLite, PostgreSQL, or in-memory) - Server port and other settings

Configuration is saved to ~/.betterdb/config.json.

Global Installation

npm install -g @betterdb/monitor
betterdb

CLI Options

betterdb --setup           # Re-run setup wizard, then start server
betterdb --port 8080       # Override server port
betterdb --db-host 1.2.3.4 # Override database host
betterdb --help            # Show all options

SQLite Storage (Optional)

To use SQLite storage with the CLI, install better-sqlite3:

npm install -g better-sqlite3

Requirements

  • Node.js >= 20.0.0
  • A Valkey or Redis instance to monitor

Docker Production Deployment

Building the Docker Image

pnpm docker:build

For multi-arch builds (AMD64 + ARM64), first set up buildx:

docker buildx create --name mybuilder --use --bootstrap

Then build:

pnpm docker:build:multiarch

Running the Docker Container

The Docker image contains only the monitoring application (backend + frontend). It requires: 1. A Valkey/Redis instance to monitor 2. A PostgreSQL instance for data persistence (or use memory storage)

Basic Run (Memory Storage)

docker run -d \
  --name betterdb-monitor \
  -p 3001:3001 \
  -e DB_HOST=your-valkey-host \
  -e DB_PORT=6379 \
  -e DB_PASSWORD=your-password \
  -e STORAGE_TYPE=memory \
  betterdb/monitor

Run on Custom Port

You can run the application on any port by setting the PORT environment variable with -e PORT=<port>:

docker run -d \
  --name betterdb-monitor \
  -p 8080:8080 \
  -e PORT=8080 \
  -e DB_HOST=your-valkey-host \
  -e DB_PORT=6379 \
  -e DB_PASSWORD=your-password \
  -e STORAGE_TYPE=memory \
  betterdb/monitor

Note: When not using --network host, make sure the -p flag port mapping matches the PORT environment variable (e.g., -p 8080:8080 -e PORT=8080).

Run with PostgreSQL Storage

docker run -d \
  --name betterdb-monitor \
  -p 3001:3001 \
  -e DB_HOST=your-valkey-host \
  -e DB_PORT=6379 \
  -e DB_PASSWORD=your-password \
  -e STORAGE_TYPE=postgres \
  -e STORAGE_URL=postgresql://user:pass@postgres-host:5432/dbname \
  betterdb/monitor

Run with Host Network (Access localhost services)

If your Valkey and PostgreSQL are running on the same host:

docker run -d \
  --name betterdb-monitor \
  --network host \
  -e DB_HOST=localhost \
  -e DB_PORT=6380 \
  -e DB_PASSWORD=devpassword \
  -e STORAGE_TYPE=postgres \
  -e STORAGE_URL=postgresql://dev:devpass@localhost:5432/postgres \
  betterdb/monitor

Auto-Remove Previous Container

To automatically remove any existing container with the same name:

docker rm -f betterdb-monitor 2>/dev/null; docker run -d \
  --name betterdb-monitor \
  -p 3001:3001 \
  -e DB_HOST=your-valkey-host \
  -e DB_PORT=6379 \
  -e DB_PASSWORD=your-password \
  -e STORAGE_TYPE=postgres \
  -e STORAGE_URL=postgresql://user:pass@postgres-host:5432/dbname \
  betterdb/monitor

Environment Variables

Variable Required Default Description
DB_HOST Yes localhost Valkey/Redis host to monitor
DB_PORT No 6379 Valkey/Redis port
DB_PASSWORD No - Valkey/Redis password
DB_USERNAME No default Valkey/Redis ACL username
DB_TYPE No auto Database type: auto, valkey, or redis
STORAGE_TYPE No memory Storage backend: memory or postgres
STORAGE_URL Conditional - PostgreSQL connection URL (required if STORAGE_TYPE=postgres)
PORT No 3001 Application HTTP port
NODE_ENV No production Node environment
ANOMALY_DETECTION_ENABLED No true Enable anomaly detection
ANOMALY_PROMETHEUS_INTERVAL_MS No 30000 Prometheus summary update interval (ms)

Accessing the Application

Once running, access the web interface at: - Web UI: http://localhost:3001 - Health Check: http://localhost:3001/health - Prometheus Metrics: http://localhost:3001/prometheus/metrics

Docker Image Details

  • Base Image: node:20-alpine
  • Size: ~188MB (optimized, no build tools)
  • Platforms: linux/amd64, linux/arm64
  • Contains: Backend API + Frontend static files (served by Fastify)
  • Excluded: SQLite support (use PostgreSQL or Memory storage)

Checking Container Logs

docker logs -f betterdb-monitor

Stopping the Container

docker stop betterdb-monitor
docker rm betterdb-monitor

Features

Current Features

  • Database connection health monitoring
  • Auto-detection of Valkey vs Redis
  • Version detection
  • Capability detection (Command Log, Slot Stats)
  • Auto-refresh every 5 seconds
  • Full Redis 6.x and 7.x support (85-90% feature parity with Valkey)
  • Graceful degradation for Valkey-only features

Vector / AI

For deployments running RediSearch or valkey-search, BetterDB ships a dedicated Vector / AI tab that surfaces FT.SEARCH ops/sec and average latency over time alongside per-index health (docs, records, deleted docs, indexing failures, backfill progress). Stale Prometheus labels are reconciled when indexes are dropped, and the tab hides automatically when the Search module isn't available. See docs/vector-ai/ for the full walkthrough and screenshots.

Supported Database Versions

Database Minimum Version Supported Features
Valkey 8.0+ All features including COMMANDLOG and CLUSTER SLOT-STATS
Redis 6.0+ All features except COMMANDLOG and CLUSTER SLOT-STATS

Feature Compatibility Matrix

Feature Command Valkey Redis
Server Info INFO Yes Yes
Health Check PING Yes Yes
Slowlog SLOWLOG Yes Yes (2.2+)
Client List CLIENT LIST Yes Yes (2.4+)
Latency Monitor LATENCY Yes Yes (2.8+)
Memory Stats MEMORY STATS Yes Yes (4.0+)
ACL Log ACL LOG Yes Yes (6.0+)
Command Log COMMANDLOG Yes (8.1+) No (Valkey-only)
Cluster Slot Stats CLUSTER SLOT-STATS Yes (8.0+) No (Valkey-only)

Architecture Highlights

Unified Adapter Pattern: The backend uses a unified UnifiedDatabaseAdapter that works seamlessly with both Valkey and Redis through the wire-compatible iovalkey client library.

Auto-detection: The application automatically detects whether it's connecting to Valkey or Redis by inspecting the INFO response.

Capability Detection: Features like Command Log (Valkey 8.1+) and Slot Stats (Valkey 8.0+) are automatically detected based on database type and version. The UI gracefully degrades when connecting to Redis, showing only supported features.

Graceful Degradation: When connected to Redis, Valkey-specific features return clear error messages indicating they're not supported, while all shared features work identically.

Prometheus Metrics

Metrics are exposed at GET /prometheus/metrics in Prometheus text format.

ACL Audit Metrics

Metric Type Labels Description
betterdb_acl_denied gauge - Total ACL denied events captured
betterdb_acl_denied_by_reason gauge reason ACL denied events by reason
betterdb_acl_denied_by_user gauge username ACL denied events by username

Client Connection Metrics

Metric Type Labels Description
betterdb_client_connections_current gauge - Current number of client connections
betterdb_client_connections_peak gauge - Peak connections in retention period
betterdb_client_connections_by_name gauge client_name Current connections by client name
betterdb_client_connections_by_user gauge user Current connections by ACL user

Slowlog Metrics

Metric Type Labels Description
betterdb_slowlog_pattern_count gauge pattern Number of slow queries per pattern
betterdb_slowlog_pattern_avg_duration_us gauge pattern Average duration in microseconds per pattern
betterdb_slowlog_pattern_percentage gauge pattern Percentage of slow queries per pattern

COMMANDLOG Metrics (Valkey 8.1+)

Metric Type Labels Description
betterdb_commandlog_large_request gauge - Total large request entries
betterdb_commandlog_large_reply gauge - Total large reply entries
betterdb_commandlog_large_request_by_pattern gauge pattern Large request count by command pattern
betterdb_commandlog_large_reply_by_pattern gauge pattern Large reply count by command pattern

Node.js Process Metrics

Metric Type Labels Description
betterdb_process_cpu_user_seconds_total counter - Total user CPU time spent in seconds
betterdb_process_cpu_system_seconds_total counter - Total system CPU time spent in seconds
betterdb_process_cpu_seconds_total counter - Total user and system CPU time spent in seconds
betterdb_process_start_time_seconds gauge - Start time of the process since unix epoch in seconds
betterdb_process_resident_memory_bytes gauge - Resident memory size in bytes
betterdb_process_virtual_memory_bytes gauge - Virtual memory size in bytes
betterdb_process_heap_bytes gauge - Process heap size in bytes
betterdb_process_open_fds gauge - Number of open file descriptors
betterdb_process_max_fds gauge - Maximum number of open file descriptors

Node.js Event Loop Metrics

Metric Type Labels Description
betterdb_nodejs_eventloop_lag_seconds gauge - Lag of event loop in seconds
betterdb_nodejs_eventloop_lag_min_seconds gauge - Minimum recorded event loop delay
`betterdb_nodejs

Extension points exported contracts — how you extend this code

RetrieverClient (Interface)
(no doc) [6 implementers]
packages/retrieval/src/retriever.ts
TelemetryPort (Interface)
(no doc) [8 implementers]
apps/api/src/common/interfaces/telemetry-port.interface.ts
TelemetryClient (Interface)
(no doc) [7 implementers]
apps/web/src/telemetry/telemetry-client.interface.ts
Analytics (Interface)
(no doc) [5 implementers]
packages/semantic-cache/src/analytics.ts
AnalyticsClient (Interface)
(no doc) [5 implementers]
packages/agent-memory/src/analytics.ts
Analytics (Interface)
(no doc) [5 implementers]
packages/agent-cache/src/analytics.ts
AuthProvider (Interface)
(no doc) [4 implementers]
packages/agent/src/auth/types.ts
IInferenceLatencyProService (Interface)
(no doc) [2 implementers]
packages/shared/src/types/inference-latency.ts

Core symbols most depended-on inside this repo

get
called by 1426
packages/agent-cache/src/analytics.ts
set
called by 555
packages/agent-cache/src/analytics.ts
query
called by 197
packages/retrieval/src/retriever.ts
initialize
called by 186
apps/api/src/common/interfaces/storage-port.interface.ts
parse
called by 152
apps/api/src/database/parsers/info.parser.ts
delete
called by 145
packages/retrieval/src/retriever.ts
fetchApi
called by 136
apps/web/src/api/client.ts
run
called by 130
apps/api/src/monitor/preflight.service.ts

Shape

Method 2,904
Function 2,646
Class 920
Interface 761
Enum 9
Route 1

Languages

TypeScript76%
Python24%

Modules by API surface

apps/api/src/storage/adapters/sqlite.adapter.ts137 symbols
apps/api/src/storage/adapters/postgres.adapter.ts137 symbols
apps/api/src/common/interfaces/storage-port.interface.ts133 symbols
apps/api/src/storage/adapters/memory.adapter.ts122 symbols
apps/web/src/pages/VectorSearch.tsx67 symbols
apps/api/src/database/adapters/unified.adapter.ts55 symbols
proprietary/agent/agent-database-adapter.ts53 symbols
apps/api/src/common/dto/metrics.dto.ts50 symbols
packages/semantic-cache/src/SemanticCache.ts49 symbols
apps/api/src/common/interfaces/database-port.interface.ts48 symbols
proprietary/entitlement/src/provisioning/provisioning.service.ts45 symbols
packages/semantic-cache-py/betterdb_semantic_cache/semantic_cache.py45 symbols

Datastores touched

betterdbDatabase · 1 repos
dbnameDatabase · 1 repos
postgresDatabase · 1 repos
(mysql)Database · 1 repos
dbDatabase · 1 repos
dbDatabase · 1 repos
entitlementDatabase · 1 repos

For agents

$ claude mcp add monitor \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact