
monitor v0.44.0
Monitoraggio in tempo reale e analisi degli slowlog per database Valkey e Redis con rilevamento delle anomalie, audit delle ACL ed esportazione delle metriche Prometheus.
BetterDB Monitor
Il layer di monitoraggio che Valkey merita.
BetterDB conserva ciò che Valkey getta via - slowlog, pattern dei comandi, attività dei client, segnali di anomalia - così puoi fare debug di ciò che è accaduto alle 3 del mattino, non solo di ciò che sta accadendo ora. Progettato per Valkey 8.x con supporto nativo per COMMANDLOG, CLUSTER SLOT-STATS e metriche I/O per thread. Compatibile con Redis 6+ per tutto il resto.
Sito web | Docker Hub | npm | Documentazione | Blog
BetterDB è sviluppato da BetterDB Inc., una public benefit company che opera secondo la OCV Open Charter.

Avvio rapido (Docker)```bash
docker run -d --name betterdb -p 3001:3001 betterdb/monitor:latest
Apri il browser all'indirizzo `http://localhost:3001`. Per monitorare un'istanza specifica:```bash
docker run -d \
--name betterdb \
-p 3001:3001 \
-e DB_HOST=your-valkey-host \
-e DB_PORT=6379 \
-e DB_PASSWORD=your-password \
betterdb/monitor:latest
Connettersi a un database sulla propria macchina host? All'interno del container
localhostè il container stesso, non il vostro host — quindi usatehost.docker.internalcome host del database. Su Docker Desktop (macOS/Windows) funziona immediatamente; su Linux aggiungete--add-host=host.docker.internal:host-gatewayal comandodocker runaffinché il nome venga risolto. Il pulsante "connect to local instance" con un solo clic della dashboard rileva automaticamente questa configurazione e precompila l'host corretto per voi.
Sono pubblicate due varianti di immagine, entrambe multi-arch (linux/amd64, linux/arm64):
| Tag | Cos'è |
|---|---|
latest, X.Y.Z-no-ai | Immagine predefinita - include tutte le funzionalità di monitoraggio, senza le dipendenze per l'AI Helper locale-LLM sperimentale |
X.Y.Z | Aggiunge l'AI Helper sperimentale (portate il vostro Ollama; disabilitato per impostazione predefinita tramite AI_ENABLED) |
Consultate Docker Production Deployment per storage persistente, porte personalizzate, licenze e configurazioni air-gapped.
Quick Start (Kubernetes / Helm)```bash
helm repo add betterdb https://docs.betterdb.com/charts
helm repo update
helm install betterdb-monitor betterdb/betterdb-monitor
--namespace betterdb --create-namespace
--set db.host=my-valkey.default.svc.cluster.local
--set db.password=yourpassword
Poi `kubectl port-forward -n betterdb svc/betterdb-monitor 3001:3001` e apri `http://localhost:3001`, oppure abilita l'ingress del chart. La cronologia basata su PostgreSQL, i Secrets personalizzati e le licenze air-gapped sono tutti trattati nella [guida Kubernetes](https://docs.betterdb.com/kubernetes) e nel [README del chart](https://github.com/betterdb-inc/monitor/blob/master/charts/betterdb-monitor/README.md).
## Avvio rapido (CLI)
Esegui BetterDB Monitor senza Docker:```bash
npx @betterdb/monitor
Al primo avvio, una procedura guidata interattiva di configurazione ti accompagna attraverso la connessione al database, il backend di archiviazione (SQLite, PostgreSQL o in-memory) e le impostazioni del server. La configurazione viene salvata in ~/.betterdb/config.json.```bash
npm install -g @betterdb/monitor # global install
betterdb --setup # re-run setup wizard
betterdb --port 8080 # override server port
betterdb --db-host 1.2.3.4 # override database host
betterdb --help # all options
Richiede Node.js >= 20.0.0 e un'istanza Valkey o Redis da monitorare. Per l'archiviazione SQLite, anche `npm install -g better-sqlite3`.
## Cosa Ottieni
### Vedi tutto, conserva tutto
- **Analisi storiche** - interroga slowlog, pattern dei comandi, attività dei client e latenza su qualsiasi intervallo temporale. I dati che prima scomparivano dopo una rotazione dei log.
- **Supporto COMMANDLOG** - esclusivo di Valkey 8.1+. Richieste e risposte di grandi dimensioni, non solo quelle lente.
- **Sessioni di cattura MONITOR** - registra il traffico reale su richiesta: live tail, filtro, replay, esportazione in JSON/CSV e correlazione incrociata con la cronologia delle connessioni.
- **Tracciamento delle hot key** - chiavi più accedute per frequenza con movimento del rank nel tempo. Key Analytics (Pro, gratuito in early access) aggiunge distribuzioni di tipo, TTL e dimensione dal campionamento live.
- **Visibilità del cluster** - grafi della topologia, heatmap SLOT-STATS, CPU per slot e distribuzione delle chiavi.
- **Metriche dei thread CPU e I/O** - visibilità per thread che nessun tool Redis può fornire.
- **Analisi dei client** - vedi esattamente quale servizio è responsabile di cosa, attribuito per nome e pattern del client.
- **Audit trail ACL** - traccia chi ha acceduto a cosa, persistito per conformità e debug post-incidente.
### Comprendi e agisci
- **Rilevamento delle anomalie** (Pro, gratuito in early access) - apprendimento automatico della baseline con eventi correlati e diagnosi in linguaggio naturale. Oltre 20 rilevatori, nessuna soglia manuale.
- **Previsione della capacità** - tempo stimato al limite per memoria, ops/sec, CPU e frammentazione.
- **Webhook** - consegne di avvisi firmate HMAC con retry e un log completo delle consegne.
- **Migrazione live** - spostati tra Redis e Valkey con un flusso di lavoro in tre fasi: analisi, esecuzione e validazione.
### Costruito per l'era dell'AI
- **Osservabilità della ricerca vettoriale** - ops/sec e latenza di FT.SEARCH con stato per indice per [valkey-search](https://github.com/valkey-io/valkey-search) e RediSearch. Vedi [docs/vector-ai](https://github.com/betterdb-inc/monitor/blob/master/docs/vector-ai/README.md).
- **Latenza di inferenza** - p50/p95/p99 per indice, con avvisi di violazione SLA (Pro, gratuito in early access).
- **Intelligenza della cache semantica** (Pro, gratuito in early access) - stato dell'hit-rate, raccomandazioni sulla soglia di similarità e un flusso di lavoro di proposta approva/rifiuta. Osservabilità della memoria dell'agente inclusa.
- **Tracce AI** - waterfall degli span OTLP dalla tua applicazione AI, correlati con lo stato live di Valkey sottostante ogni richiesta. Vedi [docs/opentelemetry.md](https://github.com/betterdb-inc/monitor/blob/master/docs/opentelemetry.md).
### Si integra con tutto
- **Server MCP** - 60 tool per Claude Code, Cursor o qualsiasi client MCP tramite [`@betterdb/mcp`](https://github.com/betterdb-inc/monitor/blob/master/packages/mcp).
- **Endpoint Prometheus** - oltre 100 metriche `betterdb_*`. Vedi [docs/prometheus-metrics.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-metrics.md).
- **OpenTelemetry** - acquisisci tracce OTLP e rispecchia metriche ed eventi verso qualsiasi backend OTLP. Vedi [docs/opentelemetry.md](https://github.com/betterdb-inc/monitor/blob/master/docs/opentelemetry.md).
- **API REST** - tutto nella UI è una chiamata API, documentata tramite OpenAPI.
## Accedi ai Tuoi Dati a Modo Tuo
| Interfaccia | Dettagli |
|-----------|---------|
| Web UI | `http://localhost:3001` |
| Server MCP | `npx @betterdb/mcp` (stdio) - crea un token in Settings → MCP Tokens |
| Prometheus | `http://localhost:3001/api/prometheus/metrics` |
| API REST (OpenAPI) | `http://localhost:3001/docs` |
| Health check | `http://localhost:3001/api/health` |
> **Nota**: nelle build di produzione (Docker, CLI) le route API sono servite sotto il prefisso `/api`. Nello sviluppo locale (`pnpm dev`) non c'è prefisso - ad esempio `http://localhost:3001/health`.
## Database Supportati
| Database | Versione Minima | Funzionalità Supportate |
|----------|----------------|-------------------|
| **Valkey** | 8.0+ | Tutte le funzionalità incluso COMMANDLOG (8.1+) e CLUSTER SLOT-STATS |
| **Redis** | 6+ | Tutte le funzionalità tranne COMMANDLOG e CLUSTER SLOT-STATS, esclusivi di Valkey |
Il backend utilizza un adapter unificato sul client wire-compatible `iovalkey` e rileva automaticamente Valkey vs Redis dalla risposta `INFO` (`DB_TYPE=auto`). Capacità come COMMANDLOG e SLOT-STATS vengono rilevate per versione, e la UI degrada con grazia quando una funzionalità non è disponibile.
Anche i servizi gestiti sono supportati - guide per AWS ElastiCache, MemoryDB, Redis Cloud e Upstash si trovano in [docs/providers](https://github.com/betterdb-inc/monitor/blob/master/docs/providers), e [`@betterdb/agent`](https://github.com/betterdb-inc/monitor/blob/master/packages/agent) raggiunge istanze solo-VPC tramite un WebSocket in uscita.
## Deployment di Produzione con Docker
L'immagine Docker contiene l'applicazione di monitoraggio (backend + frontend). Richiede:
1. Un'istanza Valkey/Redis da monitorare
2. Un'istanza PostgreSQL per la persistenza dei dati (oppure usa l'archiviazione in memoria)
### Esecuzione con Archiviazione PostgreSQL```bash
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
Esecuzione su porta personalizzata
Imposta la variabile d'ambiente PORT e abbina la mappatura -p:```bash
docker run -d
--name betterdb-monitor
-p 8080:8080
-e PORT=8080
-e DB_HOST=your-valkey-host
betterdb/monitor
### Esecuzione con rete host (accesso ai servizi localhost)
Se il tuo Valkey e PostgreSQL sono in esecuzione sullo stesso host:```bash
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
Variabili d'ambiente
| Variabile | Richiesta | Predefinito | Descrizione |
|---|---|---|---|
DB_HOST | Sì | localhost | Host Valkey/Redis da monitorare |
DB_PORT | No | 6379 | Porta Valkey/Redis |
DB_PASSWORD | No | - | Password Valkey/Redis |
DB_USERNAME | No | default | Nome utente ACL Valkey/Redis |
DB_TYPE | No | auto | Tipo di database: auto, valkey, o redis |
STORAGE_TYPE | No | memory | Backend di archiviazione: memory o postgres |
STORAGE_URL | Condizionale | - | URL di connessione PostgreSQL (richiesto se STORAGE_TYPE=postgres) |
PORT | No | 3001 | Porta HTTP dell'applicazione |
NODE_ENV | No | production | Ambiente Node |
ANOMALY_DETECTION_ENABLED | No | true | Abilita il rilevamento delle anomalie |
ANOMALY_PROMETHEUS_INTERVAL_MS | No | 30000 | Intervallo di aggiornamento del riepilogo Prometheus (ms) |
BETTERDB_LICENSE_KEY | No | - | Chiave di licenza online (Pro/Enterprise), validata tramite rete |
BETTERDB_OFFLINE_LICENSE_FILE | No | - | Percorso di una licenza offline firmata .jwt per host air-gapped (vedi sotto) |
BETTERDB_OFFLINE_LICENSE | No | - | Token di licenza offline come stringa JWT inline |
BETTERDB_DATA_DIR | No | /app/data | Directory per lo stato della licenza persistito (montare un volume scrivibile) |
ENCRYPTION_KEY | No | - | Chiave (min 16 caratteri) usata per cifrare con envelope encryption le password di connessione memorizzate e i segreti dei tunnel SSH a riposo. Senza di essa, i segreti sono memorizzati in chiaro |
BETTERDB_SSH_KEY_DIR | No | - | Directory in cui devono risiedere le chiavi private SSH lato server. Abilita la sorgente di chiavi "percorso file server" per i tunnel SSH; il percorso della chiave di una connessione deve risolversi al suo interno. Se non impostata, disabilita le chiavi basate su file (le chiavi incollate inline funzionano comunque) |
BETTERDB_TELEMETRY | No | true | Impostare false per disabilitare la telemetria anonima |
Riferimento completo, inclusi AI, ottimizzazione dei webhook e soglie di health-gate: docs/configuration.md. Per l'ingest delle tracce OTLP e l'esportazione di metriche/eventi, vedere docs/opentelemetry.md.
Tunnel SSH
Le connessioni possono raggiungere un database attraverso un bastion/jump host SSH invece di connettersi direttamente — utile per Valkey/Redis in una subnet privata, ElastiCache o MemoryDB. Abilitare Connect via SSH tunnel quando si aggiunge una connessione e fornire l'host SSH, la porta e il nome utente. È supportato un singolo hop.
L'autenticazione avviene tramite password o chiave privata. Le chiavi private provengono da una di due sorgenti:
- Paste key (inline): il contenuto della chiave PEM viene inviato con la connessione. Viene memorizzato cifrato a riposo solo quando
ENCRYPTION_KEYè impostata (envelope encryption); senza quella chiave viene memorizzato in chiaro, come le password di connessione. Funziona ovunque, incluse le distribuzioni gestite/cloud. - Percorso file server: la chiave risiede già nel filesystem del server di monitoraggio ed è referenziata tramite percorso. Questo richiede di impostare la variabile d'ambiente
BETTERDB_SSH_KEY_DIRalla directory che contiene le chiavi consentite, e il percorso referenziato deve risolversi al suo interno, così l'API non può mai essere indotta a leggere file arbitrari. LasciareBETTERDB_SSH_KEY_DIRnon impostata per disabilitare questa opzione.
Opzionalmente, fissare la fingerprint della chiave host del server SSH (SHA256:...) sulla connessione; quando impostata, il tunnel viene rifiutato a meno che il server presenti una chiave corrispondente, prevenendo attacchi man-in-the-middle sul percorso del bastion. Se lasciata vuota, l'identità del server non viene verificata (viene registrato un avviso).
Il tunnel inoltra al database tramite 127.0.0.1; quando TLS è abilitato, il certificato viene comunque validato rispetto al nome host reale del database. Impostare ENCRYPTION_KEY affinché le password SSH, le passphrase delle chiavi e le chiavi inline siano cifrate a riposo.
Limitazione nota — topologie cluster/Sentinel: solo la connessione configurata viene incanalata nel tunnel. Il monitoraggio di cluster e Sentinel si dirama verso gli altri nodi usando gli indirizzi che quei nodi pubblicizzano (CLUSTER NODES / Sentinel), e quelle connessioni per-nodo vengono effettuate direttamente, non attraverso il tunnel. Se gli altri nodi sono raggiungibili solo tramite il bastion (ad es. ElastiCache/MemoryDB in una subnet privata), le viste per-nodo non saranno disponibili. Usare i tunnel SSH per il monitoraggio di singoli nodi/primari, oppure collocare il monitor dove può raggiungere direttamente i nodi del cluster.
Licenze e supporto air-gapped
BetterDB Monitor sblocca le funzionalità Pro/Enterprise in uno di due modi, a seconda che l'host abbia accesso a Internet:
- Chiave di licenza online - impostare
BETTERDB_LICENSE_KEY. Il monitor la valida controbetterdb.come memorizza nella cache un token firmato verificato localmente, così il tuo livello continua a funzionare durante brevi interruzioni e riavvii. - Token di licenza offline / air-gapped - per host con nessun accesso a Internet del tutto (vedi sotto).
Come funziona la licenza air-gapped
Ogni entitlement è un JWT RS256 firmato. Il monitor lo verifica localmente contro chiavi pubbliche incorporate nell'immagine - non deve mai raggiungere un server di licenza per fidarsi di un token. Quindi un host air-gapped può eseguire i livelli a pagamento con connettività zero:
- Su una macchina connessa a Internet, accedi a
betterdb.com/account/licenses e
scarica il tuo token di licenza offline (
.jwt, Pro/Enterprise). Non contiene segreti e non può essere manomesso - qualsiasi modifica rompe la firma. - Trasferiscilo sull'host air-gapped come preferisci (USB, gestione della configurazione, un mount di secret Docker/Kubernetes).
- Forniscilo tramite
BETTERDB_OFFLINE_LICENSE_FILE(percorso),BETTERDB_OFFLINE_LICENSE(stringa inline), oppure incollalo nell'interfaccia sotto Settings → License → "Air-gapped environment? Activate an offline license."
Quando un token offline è configurato e nessuna BETTERDB_LICENSE_KEY è impostata, il
monitor effettua zero richieste in uscita - controlli di licenza, telemetria e ping di aggiornamento
sono tutti disabilitati. Esegue il livello concesso fino alla scadenza del token (le licenze
perpetue vengono riscaricate annualmente), poi torna a Community.```bash
fully offline - no network required
docker volume create betterdb-data docker run --rm -v betterdb-data:/d alpine chown 1001:1001 /d # volume writable by UID 1001 (one-time)
docker run -d --name betterdb-monitor -p 3001:3001
-e DB_HOST=your-valkey-host -e DB_PORT=6379 -e DB_PASSWORD=your-password
-v /path/to/betterdb-license.jwt:/run/secrets/betterdb-license.jwt:ro
-e BETTERDB_OFFLINE_LICENSE_FILE=/run/secrets/betterdb-license.jwt
-v betterdb-data:/app/data
betterdb/monitor
Verifica con `GET /api/license/status` → `source: offline-token`, `mode: offline`,
`airGapped: true`.
> **Persistenza:** monta un volume scrivibile su `/app/data` in modo che la licenza offline e
> il token di tolleranza per interruzioni online sopravvivano ai riavvii. Il container viene eseguito come **UID 1001**,
> quindi un volume appena creato deve essere `chown`ato a tale UID (come mostrato sopra) - altrimenti
> la persistenza fallisce con `EACCES … license.jwt`.
Per il flusso completo, la precedenza di verifica e il runbook di rotazione delle chiavi consulta
**[Offline & Air-Gapped Licenses](https://github.com/betterdb-inc/monitor/blob/master/docs/offline-licenses.md)** e il
**[Configuration reference](https://github.com/betterdb-inc/monitor/blob/master/docs/configuration.md#license-configuration)**.
### Docker Image Details
- **Base Image**: `node:20-alpine`
- **Compressed size**: ~360MB (`latest` / `-no-ai`) / ~640MB (versioned image with the experimental AI Helper's local-LLM dependencies)
- **Platforms**: `linux/amd64`, `linux/arm64`
- **Contains**: Backend API + Frontend static files (served by Fastify)
- **Excluded**: SQLite support (use PostgreSQL or Memory storage)
### Container Operations```bash
docker logs -f betterdb-monitor # follow logs
docker stop betterdb-monitor # stop
docker rm betterdb-monitor # remove
Backend di archiviazione
BetterDB Monitor persiste audit trail, analytics, captures e dati di anomalia su uno dei quattro backend:
| Backend | Caso d'uso | Note |
|---|---|---|
memory | Test, ambienti effimeri | Predefinito in Docker; tutti i dati vengono persi al riavvio |
postgres | Produzione | STORAGE_TYPE=postgres + STORAGE_URL=postgresql://user:pass@host:port/db |
turso | Produzione / SQLite serverless | STORAGE_TYPE=turso + STORAGE_URL=libsql://... + STORAGE_AUTH_TOKEN; funziona in Docker |
sqlite | Sviluppo locale / CLI | Modulo nativo rimosso dall'immagine Docker latest; STORAGE_SQLITE_FILEPATH opzionale |
Metriche Prometheus
Le metriche sono esposte su GET /api/prometheus/metrics in formato testo Prometheus: audit ACL, connessioni client, pattern slowlog/commandlog, memoria, throughput, keyspace, replica, statistiche slot del cluster e metriche runtime di Node.js - tutte con prefisso betterdb_.```yaml
scrape_configs:
- job_name: 'betterdb-monitor'
metrics_path: '/api/prometheus/metrics'
static_configs:
- targets: ['your-monitor-host:3001']
Riferimento completo delle metriche: [docs/prometheus-metrics.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-metrics.md) e [docs/prometheus-integration.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-integration.md).
## Sviluppo
### Struttura del progetto```
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
Pacchetti
Questo monorepo distribuisce diversi pacchetti standalone. Vedi packages/ per l'elenco completo.
| Pacchetto | Linguaggio | Registry |
|---|---|---|
@betterdb/monitor | TypeScript | npm |
@betterdb/mcp | TypeScript | npm |
@betterdb/agent | TypeScript | npm |
@betterdb/semantic-cache | TypeScript | npm |
betterdb-semantic-cache | Python | PyPI |
@betterdb/agent-cache | TypeScript | npm |
betterdb-agent-cache | Python | PyPI |
cache-benchmark | Python | Replay harness per il benchmarking di cache semantiche |
Stack Tecnologico
- Backend: NestJS con adattatore Fastify,
iovalkeyper le connessioni Valkey/Redis, TypeScript in modalità strict. Porta 3001. - Frontend: React + TypeScript, Vite, TailwindCSS, Recharts. Server di sviluppo sulla porta 5173.
- Monorepo: pnpm workspaces + Turborepo.
Configurazione Locale
Prerequisiti: Node.js >= 20.0.0, pnpm >= 9.0.0, Docker.```bash pnpm install cp .env.example .env pnpm docker:dev # local Valkey (6380) and Redis (6382) pnpm dev # web on :5173, api on :3001
Per connettersi a Redis invece di Valkey, impostare `DB_PORT=6382` in `.env`.```bash
pnpm dev:api # API only
pnpm dev:web # frontend only
pnpm docker:dev:down # stop local databases
pnpm build # production build
pnpm test # API tests
Build delle immagini Docker:```bash pnpm docker:build # local build pnpm docker:publish # multi-arch build & push (requires buildx)
### Aggiunta di Nuove Funzionalità
1. Aggiungi nuovi endpoint in `apps/api/src/`
2. Aggiungi le chiamate API corrispondenti in `apps/web/src/api/`
3. Aggiungi i tipi condivisi in `packages/shared/src/types/`
### Stile del Codice
- TypeScript in modalità strict, tipi di ritorno espliciti, nessun `any`
- ESLint + Prettier configurati
## Licenza
- Il contenuto sotto `docs/` è concesso in licenza secondo CC BY-SA 4.0.
- Il contenuto sotto `proprietary/` è coperto da una licenza commerciale (vedi `proprietary/LICENSE`). Queste funzionalità sono gratuite durante l'accesso anticipato.
- Tutto il resto è [MIT](https://github.com/betterdb-inc/monitor/blob/master/LICENSE).