
monitor v0.33.0
Monitoraggio in tempo reale e analisi dei slowlog per database Valkey e Redis con rilevamento di anomalie, audit ACL ed esportazione di metriche Prometheus.
BetterDB Monitor
Il livello di monitoraggio che Valkey merita.
BetterDB conserva ciò che Valkey scarta: slowlog, pattern di comandi, attività dei client, segnali di anomalia - così puoi eseguire il debug di ciò che è accaduto alle 3 di notte, 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.
Website | Docker Hub | npm | Documentation | Blog
BetterDB è sviluppato da BetterDB Inc., una società a beneficio pubblico che opera sotto l'OCV Open Charter.

Quick Start (Docker)```bash
docker run -d --name betterdb -p 3001:3001 betterdb/monitor:latest
Punta il browser su `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
Ti stai connettendo a un database sulla tua macchina host? All'interno del container
localhostè il container stesso, non il tuo host — quindi usahost.docker.internalcome host del database. Su Docker Desktop (macOS/Windows) funziona subito; su Linux aggiungi--add-host=host.docker.internal:host-gatewayal comandodocker runcosì il nome viene risolto. Il pulsante "connetti all'istanza locale" con un clic della dashboard rileva automaticamente questo e precompila l'host corretto per te.
Sono pubblicate due varianti di immagine, entrambe multi-architettura (linux/amd64, linux/arm64):
| Tag | Cosa è |
|---|---|
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 (porta il tuo Ollama; disabilitato di default tramite AI_ENABLED) |
Consulta Distribuzione di produzione Docker per archiviazione persistente, porte personalizzate, licenze e configurazioni air-gapped.
Avvio rapido (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
Allora `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 portati da te e la licenza 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 ti accompagna nella configurazione della connessione al database, del backend di archiviazione (SQLite, PostgreSQL o in-memory) e delle 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 di comandi, attività dei client e latenza su qualsiasi intervallo di tempo. I dati che sparivano dopo una rotazione dei log.
- **Supporto COMMANDLOG** - esclusivo di Valkey 8.1+. Richieste grandi e risposte grandi, non solo quelle lente.
- **Sessioni di cattura MONITOR** - registra il traffico reale su richiesta: live tail, filtro, replay, esportazione in JSON/CSV e confronto incrociato con la cronologia delle connessioni.
- **Tracciamento delle hot key** - chiavi principali per frequenza di accesso con movimento del ranking nel tempo. Key Analytics (Pro, gratuito in early access) aggiunge distribuzioni di tipo, TTL e dimensione dal campionamento live.
- **Visibilità del cluster** - grafici di topologia, heatmap SLOT-STATS, distribuzione di CPU e chiavi per slot.
- **Metriche CPU e thread I/O** - visibilità per thread che nessuno strumento Redis può fornire.
- **Analisi dei client** - vedi esattamente quale servizio è responsabile di cosa, attribuito per nome client e pattern.
- **Trail di audit ACL** - traccia chi ha acceduto a cosa, persistito per conformità e debug post-incidente.
### Comprendi e agisci
- **Rilevamento anomalie** (Pro, gratuito in early access) - apprendimento automatico della baseline con eventi correlati e diagnosi in linguaggio semplice. Più di 20 rilevatori, nessuna soglia manuale.
- **Previsione della capacità** - tempo previsto fino al limite per memoria, ops/sec, CPU e frammentazione.
- **Webhook** - consegne di alert firmate HMAC con retry e log di consegna completo.
- **Migrazione live** - spostati tra Redis e Valkey con un flusso di lavoro in tre fasi: analisi, esecuzione e validazione.
### Progettato per l'era dell'AI
- **Osservabilità della ricerca vettoriale** - ops/sec e latenza FT.SEARCH con salute 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 alert di violazione SLA (Pro, gratuito in early access).
- **Intelligenza della cache semantica** (Pro, gratuito in early access) - salute del tasso di hit, raccomandazioni sulla soglia di similarità e flusso di lavoro di proposte approva/rifiuta. Osservabilità della memoria dell'agente inclusa.
- **Trace AI** - waterfall di span OTLP dalla tua applicazione AI, correlati con lo stato live di Valkey sotto ogni richiesta.
### Si integra con tutto
- **Server MCP** - 60 strumenti per Claude Code, Cursor o qualsiasi client MCP tramite [`@betterdb/mcp`](https://github.com/betterdb-inc/monitor/blob/master/packages/mcp).
- **Endpoint Prometheus** - più di 100 metriche `betterdb_*`. Vedi [docs/prometheus-metrics.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-metrics.md).
- **OpenTelemetry** - rispecchia metriche ed eventi verso qualsiasi backend OTLP.
- **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 Impostazioni → Token MCP |
| 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 - es. `http://localhost:3001/health`.
## Database Supportati
| Database | Versione Minima | Funzionalità Supportate |
|----------|----------------|-------------------|
| **Valkey** | 8.0+ | Tutte le funzionalità inclusi COMMANDLOG (8.1+) e CLUSTER SLOT-STATS |
| **Redis** | 6+ | Tutte le funzionalità tranne COMMANDLOG e CLUSTER SLOT-STATS esclusivi di Valkey |
Il backend usa un adapter unificato sul client `iovalkey` compatibile via wire e rileva automaticamente Valkey vs Redis dalla risposta `INFO` (`DB_TYPE=auto`). Funzionalità 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 Docker in Produzione
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 (o usa l'archiviazione in memoria)
### Esegui 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 fai corrispondere il mapping -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 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 | Obbligatoria | Predefinita | 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 a riposo le password di connessione memorizzate e i segreti dei tunnel SSH. Senza di essa, i segreti vengono 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, esportazione OTLP, ottimizzazione webhook e soglie di health-gate: docs/configuration.md.
Tunnel SSH
Le connessioni possono raggiungere un database tramite un host bastion/jump 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 host SSH, porta e nome utente. È supportato un singolo hop.
L'autenticazione avviene tramite password o chiave privata. Le chiavi private provengono da una di due sorgenti:
- Incolla chiave (inline): il contenuto della chiave PEM viene inviato con la connessione. Viene memorizzata cifrata a riposo solo quando
ENCRYPTION_KEYè impostata (cifratura a busta); senza quella chiave viene memorizzata 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 e viene referenziata tramite percorso. Ciò richiede l'impostazione della variabile d'ambiente
BETTERDB_SSH_KEY_DIRsulla directory che contiene le chiavi consentite, e il percorso referenziato deve risolversi al suo interno, così l'API non può mai essere costretta a leggere file arbitrari. LasciareBETTERDB_SSH_KEY_DIRnon impostata per disabilitare questa opzione.
Opzionalmente, è possibile fissare l'impronta della chiave host del server SSH (SHA256:...) sulla connessione; quando impostata, il tunnel viene rifiutato a meno che il server non presenti una chiave corrispondente, prevenendo attacchi man-in-the-middle sul percorso 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é password SSH, passphrase delle chiavi e chiavi inline siano cifrate a riposo.
Limitazione nota — topologie cluster/Sentinel: solo la connessione configurata viene tunnellata. Il monitoraggio Cluster e Sentinel si espande agli altri nodi utilizzando gli indirizzi pubblicizzati da quei nodi (CLUSTER NODES / Sentinel), e quelle connessioni per-nodo vengono effettuate direttamente, non tramite il tunnel. Se gli altri nodi sono raggiungibili solo tramite il bastion (es. ElastiCache/MemoryDB in una subnet privata), le viste per-nodo non saranno disponibili. Utilizzare i tunnel SSH per il monitoraggio di nodi singoli/primari, oppure posizionare il monitor dove possa raggiungere direttamente i nodi del cluster.
Licenze e supporto Air-Gapped
BetterDB Monitor sblocca le funzionalità Pro/Enterprise in uno dei 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 (vedi sotto).
Come funziona la licenza air-gapped
Ogni diritto è un JWT RS256 firmato. Il monitor lo verifica localmente contro le chiavi pubbliche incorporate nell'immagine - non deve mai contattare un server di licenza per fidarsi di un token. Quindi un host air-gapped può eseguire livelli a pagamento con connettività zero:
- Su una macchina connessa a internet, accedi su
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 all'host air-gapped come preferisci (USB, gestione configurazione, un mount di segreto 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 alla 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` così che la licenza offline e
> il token di tolleranza per le interruzioni online sopravvivano ai riavvii. Il container viene eseguito come **UID 1001**,
> quindi un volume appena creato deve essere `chown`ato a tale utente (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)**.
### Dettagli dell'Immagine Docker
- **Immagine Base**: `node:20-alpine`
- **Dimensione compressa**: ~360MB (`latest` / `-no-ai`) / ~640MB (immagine versionata con le dipendenze LLM locali dell'AI Helper sperimentale)
- **Piattaforme**: `linux/amd64`, `linux/arm64`
- **Contiene**: API Backend + file statici del Frontend (serviti da Fastify)
- **Escluso**: supporto SQLite (usa PostgreSQL o archiviazione Memory)
### Operazioni sul Container```bash
docker logs -f betterdb-monitor # follow logs
docker stop betterdb-monitor # stop
docker rm betterdb-monitor # remove
Backend di Archiviazione
BetterDB Monitor salva il registro di controllo, le analisi, le acquisizioni e i dati sulle anomalie su uno dei tre 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 |
sqlite | Sviluppo locale / CLI | Non incluso nelle immagini Docker di produzione; STORAGE_SQLITE_FILEPATH opzionale |
Metriche Prometheus
Le metriche sono esposte su GET /api/prometheus/metrics in formato testo Prometheus: controllo ACL, connessioni client, pattern di slowlog/commandlog, memoria, throughput, keyspace, replica, statistiche degli slot del cluster e metriche di runtime 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 alle 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 autonomi. 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 | Harness di replay per il benchmarking delle cache semantiche |
Stack Tecnologico
- Backend: NestJS con adapter Fastify,
iovalkeyper connessioni Valkey/Redis, modalità strict di TypeScript. 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, imposta `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
Docker image builds:```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 corrispondenti chiamate API 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, niente `any`
- ESLint + Prettier configurati
## Licenza
- I contenuti in `docs/` sono concessi in licenza CC BY-SA 4.0.
- I contenuti in `proprietary/` sono coperti 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).