Voltar às atualizações
New releaseSep 3, 2026

monitor v0.41.0

Monitoramento em tempo real e análise de slowlog para bancos de dados Valkey e Redis com detecção de anomalias, auditoria de ACL e exportação de métricas do Prometheus.

Compartilhar

BetterDB Monitor

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

A camada de monitoramento que o Valkey merece.

O BetterDB persiste o que o Valkey descarta — slowlogs, padrões de comandos, atividade de clientes, sinais de anomalias — para que você possa depurar o que aconteceu às 3h da manhã, e não apenas o que está acontecendo agora. Construído para Valkey 8.x com suporte nativo a COMMANDLOG, CLUSTER SLOT-STATS e métricas de I/O por thread. Compatível com Redis 6+ para todo o resto.

Website | Docker Hub | npm | Documentação | Blog

O BetterDB é desenvolvido pela BetterDB Inc., uma empresa de benefício público que opera sob a OCV Open Charter.

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

Início Rápido (Docker)```bash

docker run -d --name betterdb -p 3001:3001 betterdb/monitor:latest

Aponte o seu navegador para `http://localhost:3001`. Para monitorar uma instância específica:```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

A ligar a uma base de dados na sua máquina anfitriã? Dentro do contentor, localhost refere-se ao próprio contentor, não ao seu anfitrião — por isso use host.docker.internal como anfitrião da base de dados. No Docker Desktop (macOS/Windows) funciona de imediato; no Linux adicione --add-host=host.docker.internal:host-gateway ao comando docker run para que o nome seja resolvido. O botão de "ligar à instância local" com um clique do painel deteta isto automaticamente e pré-preenche o anfitrião correto para si.

São publicadas duas variantes de imagem, ambas multi-arquitetura (linux/amd64, linux/arm64):

TagO que é
latest, X.Y.Z-no-aiImagem padrão - inclui todas as funcionalidades de monitorização, sem as dependências para o Assistente de IA local-LLM experimental
X.Y.ZAdiciona o Assistente de IA experimental (traga o seu próprio Ollama; desativado por predefinição via AI_ENABLED)

Consulte Implementação de Produção com Docker para armazenamento persistente, portas personalizadas, licenciamento e configurações em ambiente isolado (air-gapped).

Início Rápido (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

Então execute `kubectl port-forward -n betterdb svc/betterdb-monitor 3001:3001` e abra `http://localhost:3001`, ou habilite o ingress do chart. Histórico com suporte a PostgreSQL, Secrets trazidos por você e licenciamento em ambiente isolado (air-gapped) são todos abordados no [guia do Kubernetes](https://docs.betterdb.com/kubernetes) e no [README do chart](https://github.com/betterdb-inc/monitor/blob/master/charts/betterdb-monitor/README.md).

## Início Rápido (CLI)

Execute o BetterDB Monitor sem Docker:```bash
npx @betterdb/monitor

Na primeira execução, um assistente de configuração interativo orienta você pela conexão com o banco de dados, o backend de armazenamento (SQLite, PostgreSQL ou em memória) e as configurações do servidor. A configuração é salva em ~/.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

Requer Node.js >= 20.0.0 e uma instância Valkey ou Redis para monitorar. Para armazenamento SQLite, também `npm install -g better-sqlite3`.

## O Que Você Obtém

### Veja tudo, mantenha tudo

- **Analíticos históricos** - consulte slowlogs, padrões de comandos, atividade de clientes e latência em qualquer intervalo de tempo. Os dados que costumavam desaparecer após uma rotação de logs.
- **Suporte a COMMANDLOG** - exclusivo do Valkey 8.1+. Requisições grandes e respostas grandes, não apenas as lentas.
- **Sessões de captura MONITOR** - grave tráfego real sob demanda: acompanhamento ao vivo, filtro, replay, exportação para JSON/CSV e referência cruzada com o histórico de conexões.
- **Rastreamento de chaves quentes** - principais chaves por frequência de acesso com movimento de classificação ao longo do tempo. Key Analytics (Pro, gratuito em acesso antecipado) adiciona distribuições de tipo, TTL e tamanho a partir de amostragem ao vivo.
- **Visibilidade de cluster** - gráficos de topologia, mapas de calor SLOT-STATS, distribuição de CPU e chaves por slot.
- **Métricas de CPU e threads de I/O** - visibilidade por thread que nenhuma ferramenta Redis pode fornecer.
- **Analíticos de clientes** - veja exatamente qual serviço é responsável pelo quê, atribuído por nome e padrão de cliente.
- **Trilha de auditoria ACL** - rastreie quem acessou o quê, persistido para conformidade e depuração pós-incidente.

### Entenda e aja

- **Detecção de anomalias** (Pro, gratuito em acesso antecipado) - aprendizado automático de linha de base com eventos correlacionados e diagnósticos em linguagem simples. Mais de 20 detectores, sem limites manuais.
- **Previsão de capacidade** - tempo projetado até o teto para memória, ops/seg, CPU e fragmentação.
- **Webhooks** - entregas de alertas assinadas com HMAC, com novas tentativas e um registro completo de entregas.
- **Migração ao vivo** - mova entre Redis e Valkey com um fluxo de trabalho de análise, execução e validação em três fases.

### Construído para a era da IA

- **Observabilidade de busca vetorial** - ops/seg e latência de FT.SEARCH com saúde por índice para [valkey-search](https://github.com/valkey-io/valkey-search) e RediSearch. Veja [docs/vector-ai](https://github.com/betterdb-inc/monitor/blob/master/docs/vector-ai/README.md).
- **Latência de inferência** - p50/p95/p99 por índice, com alertas de violação de SLA (Pro, gratuito em acesso antecipado).
- **Inteligência de cache semântico** (Pro, gratuito em acesso antecipado) - saúde da taxa de acertos, recomendações de limite de similaridade e um fluxo de trabalho de proposta aprovar/rejeitar. Observabilidade de memória de agente incluída.
- **Rastreamentos de IA** - cascatas de spans OTLP do seu aplicativo de IA, correlacionadas com o estado Valkey ao vivo por trás de cada requisição. Veja [docs/opentelemetry.md](https://github.com/betterdb-inc/monitor/blob/master/docs/opentelemetry.md).

### Integra-se a tudo

- **Servidor MCP** - 60 ferramentas para Claude Code, Cursor ou qualquer cliente MCP via [`@betterdb/mcp`](https://github.com/betterdb-inc/monitor/blob/master/packages/mcp).
- **Endpoint Prometheus** - mais de 100 métricas `betterdb_*`. Veja [docs/prometheus-metrics.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-metrics.md).
- **OpenTelemetry** - ingira rastreamentos OTLP e espelhe métricas e eventos para qualquer backend OTLP. Veja [docs/opentelemetry.md](https://github.com/betterdb-inc/monitor/blob/master/docs/opentelemetry.md).
- **API REST** - tudo na interface é uma chamada de API, documentada via OpenAPI.

## Acesse Seus Dados do Seu Jeito

| Interface | Detalhes |
|-----------|---------|
| Web UI | `http://localhost:3001` |
| Servidor MCP | `npx @betterdb/mcp` (stdio) - crie um token em Configurações → Tokens MCP |
| Prometheus | `http://localhost:3001/api/prometheus/metrics` |
| API REST (OpenAPI) | `http://localhost:3001/docs` |
| Verificação de saúde | `http://localhost:3001/api/health` |

> **Nota**: Em builds de produção (Docker, CLI), as rotas da API são servidas sob o prefixo `/api`. No desenvolvimento local (`pnpm dev`) não há prefixo - ex.: `http://localhost:3001/health`.

## Bancos de Dados Suportados

| Banco de Dados | Versão Mínima | Recursos Suportados |
|----------|----------------|-------------------|
| **Valkey** | 8.0+ | Todos os recursos, incluindo COMMANDLOG (8.1+) e CLUSTER SLOT-STATS |
| **Redis** | 6+ | Todos os recursos, exceto COMMANDLOG e CLUSTER SLOT-STATS exclusivos do Valkey |

O backend usa um adaptador unificado sobre o cliente `iovalkey` compatível por fio e detecta automaticamente Valkey vs Redis a partir da resposta `INFO` (`DB_TYPE=auto`). Recursos como COMMANDLOG e SLOT-STATS são detectados por versão, e a interface degrada graciosamente quando um recurso não está disponível.

Serviços gerenciados também são suportados - guias para AWS ElastiCache, MemoryDB, Redis Cloud e Upstash estão em [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) alcança instâncias somente VPC por meio de um WebSocket de saída.

## Implantação de Produção com Docker

A imagem Docker contém o aplicativo de monitoramento (backend + frontend). Ela requer:
1. Uma instância Valkey/Redis para monitorar
2. Uma instância PostgreSQL para persistência de dados (ou use armazenamento em memória)

### Execute com Armazenamento 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

Executar numa Porta Personalizada

Defina a variável de ambiente PORT e faça corresponder o mapeamento -p:```bash docker run -d
--name betterdb-monitor
-p 8080:8080
-e PORT=8080
-e DB_HOST=your-valkey-host
betterdb/monitor

### Executar com Rede do Host (Acessar serviços localhost)

Se o seu Valkey e PostgreSQL estiverem rodando no mesmo 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

Variáveis de Ambiente

VariávelObrigatóriaPadrãoDescrição
DB_HOSTSimlocalhostHost Valkey/Redis a monitorar
DB_PORTNão6379Porta Valkey/Redis
DB_PASSWORDNão-Senha Valkey/Redis
DB_USERNAMENãodefaultNome de usuário ACL Valkey/Redis
DB_TYPENãoautoTipo de banco de dados: auto, valkey ou redis
STORAGE_TYPENãomemoryBackend de armazenamento: memory ou postgres
STORAGE_URLCondicional-URL de conexão PostgreSQL (obrigatória se STORAGE_TYPE=postgres)
PORTNão3001Porta HTTP da aplicação
NODE_ENVNãoproductionAmbiente Node
ANOMALY_DETECTION_ENABLEDNãotrueAtivar detecção de anomalias
ANOMALY_PROMETHEUS_INTERVAL_MSNão30000Intervalo de atualização do resumo Prometheus (ms)
BETTERDB_LICENSE_KEYNão-Chave de licença online (Pro/Enterprise), validada pela rede
BETTERDB_OFFLINE_LICENSE_FILENão-Caminho para uma licença offline assinada .jwt para hosts isolados (veja abaixo)
BETTERDB_OFFLINE_LICENSENão-Token de licença offline como string JWT inline
BETTERDB_DATA_DIRNão/app/dataDiretório para estado de licença persistido (monte um volume gravável)
ENCRYPTION_KEYNão-Chave (mín. 16 caracteres) usada para criptografar em envelope senhas de conexão armazenadas e segredos de túnel SSH em repouso. Sem ela, os segredos são armazenados em texto simples
BETTERDB_SSH_KEY_DIRNão-Diretório onde as chaves privadas SSH do lado do servidor devem residir. Habilita a fonte de chave "caminho de arquivo do servidor" para túneis SSH; o caminho da chave de uma conexão deve resolver dentro dele. Não definido desativa chaves baseadas em arquivo (chaves coladas inline ainda funcionam)
BETTERDB_TELEMETRYNãotrueDefina false para desativar telemetria anônima

Referência completa, incluindo IA, ajuste de webhooks e limites de health-gate: docs/configuration.md. Para ingestão de traces OTLP e exportação de métricas/eventos, veja docs/opentelemetry.md.

Túneis SSH

Conexões podem alcançar um banco de dados através de um host bastião/salto SSH em vez de conectar diretamente — útil para Valkey/Redis em uma sub-rede privada, ElastiCache ou MemoryDB. Ative Conectar via túnel SSH ao adicionar uma conexão e forneça o host SSH, porta e nome de usuário. Um único salto é suportado.

A autenticação é por senha ou chave privada. Chaves privadas vêm de uma de duas fontes:

  • Colar chave (inline): o conteúdo da chave PEM é enviado com a conexão. Ela é armazenada criptografada em repouso somente quando ENCRYPTION_KEY está definida (criptografia em envelope); sem essa chave, ela é armazenada em texto simples, como senhas de conexão. Funciona em qualquer lugar, incluindo implantações gerenciadas/nuvem.
  • Caminho de arquivo do servidor: a chave já existe no sistema de arquivos do servidor monitor e é referenciada por caminho. Isso requer definir a variável de ambiente BETTERDB_SSH_KEY_DIR para o diretório que contém as chaves permitidas, e o caminho referenciado deve resolver dentro dele, para que a API nunca possa ser coagida a ler arquivos arbitrários. Deixe BETTERDB_SSH_KEY_DIR não definido para desativar esta opção.

Opcionalmente, fixe a impressão digital da chave do host SSH do servidor (SHA256:...) na conexão; quando definida, o túnel é recusado a menos que o servidor apresente uma chave correspondente, prevenindo ataques man-in-the-middle no caminho do bastião. Deixado em branco, a identidade do servidor não é verificada (um aviso é registrado).

O túnel encaminha para o banco de dados via 127.0.0.1; quando TLS está habilitado, o certificado ainda é validado contra o nome de host real do banco de dados. Defina ENCRYPTION_KEY para que senhas SSH, frases secretas de chave e chaves inline sejam criptografadas em repouso.

Limitação conhecida — topologias cluster/Sentinel: apenas a conexão que você configura é tunelada. O monitoramento de Cluster e Sentinel se expande para os outros nós usando os endereços que esses nós anunciam (CLUSTER NODES / Sentinel), e essas conexões por nó são feitas diretamente, não através do túnel. Se os outros nós só forem alcançáveis via bastião (ex.: ElastiCache/MemoryDB em uma sub-rede privada), as visualizações por nó ficarão indisponíveis. Use túneis SSH para monitoramento de nó único/primário, ou coloque o monitor onde ele possa alcançar os nós do cluster diretamente.

Licenciamento e Suporte Isolado (Air-Gapped)

O BetterDB Monitor desbloqueia recursos Pro/Enterprise de uma de duas maneiras, dependendo se o host tem acesso à internet:

  • Chave de licença online - defina BETTERDB_LICENSE_KEY. O monitor a valida contra betterdb.com e armazena em cache um token assinado verificado localmente, para que seu nível continue funcionando através de interrupções curtas e reinicializações.
  • Token de licença offline / isolado - para hosts com nenhum acesso à internet de forma alguma (veja abaixo).

Como funciona o licenciamento isolado

Cada direito é um JWT RS256 assinado. O monitor o verifica localmente contra chaves públicas embutidas na imagem - ele nunca precisa alcançar um servidor de licença para confiar em um token. Então um host isolado pode executar níveis pagos com zero conectividade:

  1. Em uma máquina conectada à internet, faça login em betterdb.com/account/licenses e baixe seu token de licença offline (.jwt, Pro/Enterprise). Ele não contém segredos e não pode ser adulterado - qualquer edição quebra a assinatura.
  2. Transfira-o para o host isolado como preferir (USB, gerenciamento de configuração, um mount de segredo Docker/Kubernetes).
  3. Forneça-o via BETTERDB_OFFLINE_LICENSE_FILE (caminho), BETTERDB_OFFLINE_LICENSE (string inline), ou cole-o na interface sob Configurações → Licença → "Ambiente isolado? Ative uma licença offline."

Quando um token offline está configurado e nenhum BETTERDB_LICENSE_KEY está definido, o monitor faz zero requisições de saída - verificações de licença, telemetria e pings de atualização são todos desativados. Ele executa o nível concedido até o token expirar (licenças perpétuas são rebaixadas anualmente), então reverte para 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

Verifique com `GET /api/license/status` → `source: offline-token`, `mode: offline`,
`airGapped: true`.

> **Persistência:** monte um volume gravável em `/app/data` para que a licença offline e
> o token de tolerância a indisponibilidade online sobrevivam a reinicializações. O contêiner executa como **UID 1001**,
> portanto, um volume recém-criado deve ser `chown`ed para ele (mostrado acima) - caso contrário,
> a persistência falha com `EACCES … license.jwt`.

Para o fluxo completo, precedência de verificação e runbook de rotação de chaves, consulte
**[Licenças Offline e Air-Gapped](https://github.com/betterdb-inc/monitor/blob/master/docs/offline-licenses.md)** e a
**[Referência de configuração](https://github.com/betterdb-inc/monitor/blob/master/docs/configuration.md#license-configuration)**.

### Detalhes da Imagem Docker

- **Imagem Base**: `node:20-alpine`
- **Tamanho compactado**: ~360MB (`latest` / `-no-ai`) / ~640MB (imagem versionada com as dependências de LLM local do AI Helper experimental)
- **Plataformas**: `linux/amd64`, `linux/arm64`
- **Contém**: API de backend + arquivos estáticos do frontend (servidos pelo Fastify)
- **Excluído**: suporte a SQLite (use PostgreSQL ou armazenamento em memória)

### Operações do Contêiner```bash
docker logs -f betterdb-monitor        # follow logs
docker stop betterdb-monitor           # stop
docker rm betterdb-monitor             # remove

Backends de Armazenamento

O BetterDB Monitor persiste trilha de auditoria, análises, capturas e dados de anomalias em um de quatro backends:

BackendCaso de usoObservações
memoryTestes, ambientes efêmerosPadrão no Docker; todos os dados são perdidos ao reiniciar
postgresProduçãoSTORAGE_TYPE=postgres + STORAGE_URL=postgresql://user:pass@host:port/db
tursoProdução / SQLite sem servidorSTORAGE_TYPE=turso + STORAGE_URL=libsql://... + STORAGE_AUTH_TOKEN; funciona no Docker
sqliteDesenvolvimento local / CLIMódulo nativo removido da imagem Docker latest; STORAGE_SQLITE_FILEPATH opcional

Métricas do Prometheus

As métricas são expostas em GET /api/prometheus/metrics no formato de texto do Prometheus: auditoria de ACL, conexões de clientes, padrões de slowlog/commandlog, memória, throughput, keyspace, replicação, estatísticas de slots de cluster e métricas de runtime do Node.js - todas prefixadas com betterdb_.```yaml scrape_configs:

  • job_name: 'betterdb-monitor' metrics_path: '/api/prometheus/metrics' static_configs:
    • targets: ['your-monitor-host:3001']
Referência completa de métricas: [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).

## Desenvolvimento

### Estrutura do Projeto```
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

Pacotes

Este monorepo distribui vários pacotes independentes. Consulte packages/ para a lista completa.

PacoteLinguagemRegistro
@betterdb/monitorTypeScriptnpm
@betterdb/mcpTypeScriptnpm
@betterdb/agentTypeScriptnpm
@betterdb/semantic-cacheTypeScriptnpm
betterdb-semantic-cachePythonPyPI
@betterdb/agent-cacheTypeScriptnpm
betterdb-agent-cachePythonPyPI
cache-benchmarkPythonHarness de replay para benchmarking de caches semânticos

Stack Tecnológica

  • Backend: NestJS com adaptador Fastify, iovalkey para conexões Valkey/Redis, modo estrito TypeScript. Porta 3001.
  • Frontend: React + TypeScript, Vite, TailwindCSS, Recharts. Servidor de desenvolvimento na porta 5173.
  • Monorepo: pnpm workspaces + Turborepo.

Configuração Local

Pré-requisitos: 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

Para conectar ao Redis em vez do Valkey, defina `DB_PORT=6382` no `.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)

### Adicionar Novos Recursos

1. Adicionar novos endpoints em `apps/api/src/`
2. Adicionar chamadas de API correspondentes em `apps/web/src/api/`
3. Adicionar tipos compartilhados em `packages/shared/src/types/`

### Estilo de Código

- TypeScript em modo estrito, tipos de retorno explícitos, sem `any`
- ESLint + Prettier configurados

## Licença

- O conteúdo em `docs/` é licenciado sob CC BY-SA 4.0.
- O conteúdo em `proprietary/` é coberto por uma licença comercial (ver `proprietary/LICENSE`). Esses recursos são gratuitos durante o acesso antecipado.
- Todo o resto é [MIT](https://github.com/betterdb-inc/monitor/blob/master/LICENSE).

Categorias