
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.
BetterDB Monitor
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.

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,
localhostrefere-se ao próprio contentor, não ao seu anfitrião — por isso usehost.docker.internalcomo anfitrião da base de dados. No Docker Desktop (macOS/Windows) funciona de imediato; no Linux adicione--add-host=host.docker.internal:host-gatewayao comandodocker runpara 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):
| Tag | O que é |
|---|---|
latest, X.Y.Z-no-ai | Imagem padrão - inclui todas as funcionalidades de monitorização, sem as dependências para o Assistente de IA local-LLM experimental |
X.Y.Z | Adiciona 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ável | Obrigatória | Padrão | Descrição |
|---|---|---|---|
DB_HOST | Sim | localhost | Host Valkey/Redis a monitorar |
DB_PORT | Não | 6379 | Porta Valkey/Redis |
DB_PASSWORD | Não | - | Senha Valkey/Redis |
DB_USERNAME | Não | default | Nome de usuário ACL Valkey/Redis |
DB_TYPE | Não | auto | Tipo de banco de dados: auto, valkey ou redis |
STORAGE_TYPE | Não | memory | Backend de armazenamento: memory ou postgres |
STORAGE_URL | Condicional | - | URL de conexão PostgreSQL (obrigatória se STORAGE_TYPE=postgres) |
PORT | Não | 3001 | Porta HTTP da aplicação |
NODE_ENV | Não | production | Ambiente Node |
ANOMALY_DETECTION_ENABLED | Não | true | Ativar detecção de anomalias |
ANOMALY_PROMETHEUS_INTERVAL_MS | Não | 30000 | Intervalo de atualização do resumo Prometheus (ms) |
BETTERDB_LICENSE_KEY | Não | - | Chave de licença online (Pro/Enterprise), validada pela rede |
BETTERDB_OFFLINE_LICENSE_FILE | Não | - | Caminho para uma licença offline assinada .jwt para hosts isolados (veja abaixo) |
BETTERDB_OFFLINE_LICENSE | Não | - | Token de licença offline como string JWT inline |
BETTERDB_DATA_DIR | Não | /app/data | Diretório para estado de licença persistido (monte um volume gravável) |
ENCRYPTION_KEY | Nã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_DIR | Nã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_TELEMETRY | Não | true | Defina 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_KEYestá 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_DIRpara 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. DeixeBETTERDB_SSH_KEY_DIRnã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 contrabetterdb.come 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:
- 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. - Transfira-o para o host isolado como preferir (USB, gerenciamento de configuração, um mount de segredo Docker/Kubernetes).
- 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:
| Backend | Caso de uso | Observações |
|---|---|---|
memory | Testes, ambientes efêmeros | Padrão no Docker; todos os dados são perdidos ao reiniciar |
postgres | Produção | STORAGE_TYPE=postgres + STORAGE_URL=postgresql://user:pass@host:port/db |
turso | Produção / SQLite sem servidor | STORAGE_TYPE=turso + STORAGE_URL=libsql://... + STORAGE_AUTH_TOKEN; funciona no Docker |
sqlite | Desenvolvimento local / CLI | Mó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.
| Pacote | Linguagem | Registro |
|---|---|---|
@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 de replay para benchmarking de caches semânticos |
Stack Tecnológica
- Backend: NestJS com adaptador Fastify,
iovalkeypara 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).