Torna agli aggiornamenti
New releaseSep 18, 2026

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.

Condividi

BetterDB Monitor

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

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.

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

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 usate host.docker.internal come host del database. Su Docker Desktop (macOS/Windows) funziona immediatamente; su Linux aggiungete --add-host=host.docker.internal:host-gateway al comando docker run affinché 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):

TagCos'è
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 (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

VariabileRichiestaPredefinitoDescrizione
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 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_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, 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_DIR alla 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. Lasciare BETTERDB_SSH_KEY_DIR non 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 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 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:

  1. 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.
  2. Trasferiscilo sull'host air-gapped come preferisci (USB, gestione della configurazione, un mount di secret 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 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:

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
tursoProduzione / SQLite serverlessSTORAGE_TYPE=turso + STORAGE_URL=libsql://... + STORAGE_AUTH_TOKEN; funziona in Docker
sqliteSviluppo locale / CLIModulo 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.

PacchettoLinguaggioRegistry
@betterdb/monitorTypeScriptnpm
@betterdb/mcpTypeScriptnpm
@betterdb/agentTypeScriptnpm
@betterdb/semantic-cacheTypeScriptnpm
betterdb-semantic-cachePythonPyPI
@betterdb/agent-cacheTypeScriptnpm
betterdb-agent-cachePythonPyPI
cache-benchmarkPythonReplay harness per il benchmarking di cache semantiche

Stack Tecnologico

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

Categorie