Torna agli aggiornamenti
New releaseJul 30, 2026

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.

Condividi

BetterDB Monitor

Docker Pulls Docker Image Version Artifact Hub npm npm downloads API Tests License Valkey Redis

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.

BetterDB Monitor - Key Analytics with per-type key size distribution histograms

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 usa host.docker.internal come host del database. Su Docker Desktop (macOS/Windows) funziona subito; su Linux aggiungi --add-host=host.docker.internal:host-gateway al comando docker run così 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):

TagCosa è
latest, X.Y.Z-no-aiImmagine predefinita - include tutte le funzionalità di monitoraggio, senza le dipendenze per l'AI Helper locale-LLM sperimentale
X.Y.ZAggiunge 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

VariabileObbligatoriaPredefinitaDescrizione
DB_HOSTlocalhostHost Valkey/Redis da monitorare
DB_PORTNo6379Porta Valkey/Redis
DB_PASSWORDNo-Password Valkey/Redis
DB_USERNAMENodefaultNome utente ACL Valkey/Redis
DB_TYPENoautoTipo di database: auto, valkey o redis
STORAGE_TYPENomemoryBackend di archiviazione: memory o postgres
STORAGE_URLCondizionale-URL di connessione PostgreSQL (richiesto se STORAGE_TYPE=postgres)
PORTNo3001Porta HTTP dell'applicazione
NODE_ENVNoproductionAmbiente Node
ANOMALY_DETECTION_ENABLEDNotrueAbilita il rilevamento delle anomalie
ANOMALY_PROMETHEUS_INTERVAL_MSNo30000Intervallo di aggiornamento del riepilogo Prometheus (ms)
BETTERDB_LICENSE_KEYNo-Chiave di licenza online (Pro/Enterprise), validata tramite rete
BETTERDB_OFFLINE_LICENSE_FILENo-Percorso di una licenza offline firmata .jwt per host air-gapped (vedi sotto)
BETTERDB_OFFLINE_LICENSENo-Token di licenza offline come stringa JWT inline
BETTERDB_DATA_DIRNo/app/dataDirectory per lo stato della licenza persistito (montare un volume scrivibile)
ENCRYPTION_KEYNo-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_DIRNo-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_TELEMETRYNotrueImpostare 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_DIR sulla 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. Lasciare BETTERDB_SSH_KEY_DIR non 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 contro betterdb.com e 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:

  1. 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.
  2. Trasferiscilo all'host air-gapped come preferisci (USB, gestione configurazione, un mount di segreto Docker/Kubernetes).
  3. 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:

BackendCaso d'usoNote
memoryTest, ambienti effimeriPredefinito in Docker; tutti i dati vengono persi al riavvio
postgresProduzioneSTORAGE_TYPE=postgres + STORAGE_URL=postgresql://user:pass@host:port/db
sqliteSviluppo locale / CLINon 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.

PacchettoLinguaggioRegistry
@betterdb/monitorTypeScriptnpm
@betterdb/mcpTypeScriptnpm
@betterdb/agentTypeScriptnpm
@betterdb/semantic-cacheTypeScriptnpm
betterdb-semantic-cachePythonPyPI
@betterdb/agent-cacheTypeScriptnpm
betterdb-agent-cachePythonPyPI
cache-benchmarkPythonHarness di replay per il benchmarking delle cache semantiche

Stack Tecnologico

  • Backend: NestJS con adapter Fastify, iovalkey per 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).

Categorie