
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 anomalia - para que você possa depurar o que aconteceu às 3 da manhã, não apenas o que está acontecendo agora. Construído para o 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 | Documentation | 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 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
Conectando a um banco de dados na sua máquina host? Dentro do contêiner
localhosté o próprio contêiner, não o seu host — então usehost.docker.internalcomo host do banco de dados. No Docker Desktop (macOS/Windows) funciona imediatamente; no Linux adicione--add-host=host.docker.internal:host-gatewayao comandodocker runpara que o nome seja resolvido. O botão de um clique "conectar à instância local" do dashboard detecta isso automaticamente e pré-preenche o host correto para você.
Duas variantes de imagem são publicadas, ambas multi-arch (linux/amd64, linux/arm64):
| Tag | O que é |
|---|---|
latest, X.Y.Z-no-ai | Imagem padrão - todos os recursos de monitoramento incluídos, sem as dependências para o AI Helper local-LLM experimental |
X.Y.Z | Adiciona o AI Helper experimental (traga seu próprio Ollama; desabilitado por padrão via AI_ENABLED) |
Consulte Docker Production Deployment para armazenamento persistente, portas personalizadas, licenciamento e configurações 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
Em seguida, `kubectl port-forward -n betterdb svc/betterdb-monitor 3001:3001` e abra `http://localhost:3001`, ou ative o ingress do chart. Histórico com backend PostgreSQL, bring-your-own Secrets e licenciamento air-gapped estã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ê através da conexão com o banco de dados, do backend de armazenamento (SQLite, PostgreSQL ou em memória) e das 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 monitorizar. Para armazenamento SQLite, também `npm install -g better-sqlite3`.
## O Que Obtém
### Veja tudo, guarde tudo
- **Análise histórica** - 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 COMMANDLOG** - exclusivo do Valkey 8.1+. Pedidos grandes e respostas grandes, não apenas os lentos.
- **Sessões de captura MONITOR** - grave tráfego real a pedido: live tail, filtro, replay, exportação para JSON/CSV e referência cruzada com o histórico de conexões.
- **Rastreamento de hot keys** - principais chaves por frequência de acesso com movimento de ranking ao longo do tempo. O Key Analytics (Pro, gratuito em acesso antecipado) adiciona tipo, TTL e distribuições de tamanho a partir de amostragem em tempo real.
- **Visibilidade de cluster** - grafos de topologia, heatmaps SLOT-STATS, CPU por slot e distribuição de chaves.
- **Métricas de threads de CPU e I/O** - visibilidade por thread que nenhuma ferramenta Redis consegue fornecer.
- **Análise de clientes** - veja exatamente qual serviço é responsável pelo quê, atribuído por nome e padrão de cliente.
- **Trilha de auditoria ACL** - acompanhe quem acedeu ao quê, persistido para conformidade e depuração pós-incidente.
### Compreenda e aja
- **Deteção de anomalias** (Pro, gratuito em acesso antecipado) - aprendizagem automática de baseline com eventos correlacionados e diagnósticos em linguagem simples. Mais de 20 detetores, sem limiares manuais.
- **Previsão de capacidade** - tempo projetado até ao limite para memória, ops/seg, CPU e fragmentação.
- **Webhooks** - entregas de alertas assinadas com HMAC com tentativas repetidas e um registo completo de entregas.
- **Migração ao vivo** - mova entre Redis e Valkey com um fluxo de trabalho de três fases: análise, execução e validação.
### Construído para a era da IA
- **Observabilidade de pesquisa 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. Consulte [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ântica** (Pro, gratuito em acesso antecipado) - saúde da taxa de acertos, recomendações de limiar de similaridade e um fluxo de trabalho de proposta de aprovação/rejeição. Observabilidade de memória de agentes incluída.
- **Rastreios de IA** - cascatas de spans OTLP da sua aplicação de IA, correlacionadas com o estado Valkey ao vivo subjacente a cada pedido. Consulte [docs/opentelemetry.md](https://github.com/betterdb-inc/monitor/blob/master/docs/opentelemetry.md).
### Liga-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_*`. Consulte [docs/prometheus-metrics.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-metrics.md).
- **OpenTelemetry** - ingira rastreios OTLP e espelhe métricas e eventos para qualquer backend OTLP. Consulte [docs/opentelemetry.md](https://github.com/betterdb-inc/monitor/blob/master/docs/opentelemetry.md).
- **API REST** - tudo na UI é uma chamada à API, documentada via OpenAPI.
## Aceda aos Seus Dados à Sua Maneira
| Interface | Detalhes |
|-----------|---------|
| Web UI | `http://localhost:3001` |
| Servidor MCP | `npx @betterdb/mcp` (stdio) - crie um token em Settings → MCP Tokens (obrigatório na cloud, opcional em self-hosted) |
| 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`. Em desenvolvimento local (`pnpm dev`) não há prefixo - por exemplo, `http://localhost:3001/health`.
## Bases de Dados Suportadas
| Base de Dados | Versão Mínima | Funcionalidades Suportadas |
|----------|----------------|-------------------|
| **Valkey** | 8.0+ | Todas as funcionalidades, incluindo COMMANDLOG (8.1+) e CLUSTER SLOT-STATS |
| **Redis** | 6+ | Todas as funcionalidades exceto o COMMANDLOG e o CLUSTER SLOT-STATS exclusivos do Valkey |
O backend usa um adaptador unificado sobre o cliente `iovalkey` compatível com o protocolo e deteta automaticamente Valkey vs Redis a partir da resposta `INFO` (`DB_TYPE=auto`). Capacidades como COMMANDLOG e SLOT-STATS são detetadas por versão, e a UI degrada-se graciosamente quando uma funcionalidade não está disponível.
Serviços geridos 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 o [`@betterdb/agent`](https://github.com/betterdb-inc/monitor/blob/master/packages/agent) alcança instâncias apenas em VPC através de um WebSocket de saída.
## Implementação de Produção com Docker
A imagem Docker contém a aplicação de monitorização (backend + frontend). Requer:
1. Uma instância Valkey/Redis para monitorizar
2. Uma instância PostgreSQL para persistência de dados (ou use armazenamento em memória)
### Executar 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 em Porta Personalizada
Defina a variável de ambiente PORT e corresponda ao 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 em execução 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 |
DB_TLS | Não | false | Defina como true para conectar ao banco de dados monitorado via TLS (exigido por provedores gerenciados como Aiven ou ElastiCache Serverless) |
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) |
STORAGE_SSL_CA | Não | - | Caminho (ou URL HTTPS confiável) para um certificado CA usado para verificar o servidor PostgreSQL. Para provedores gerenciados com sua própria CA (ex.: Aiven), forneça a CA do projeto aqui para verificação completa de cadeia + hostname. Tem precedência sobre STORAGE_SSL_NO_VERIFY |
STORAGE_SSL_NO_VERIFY | Não | false | Conectar ao PostgreSQL via TLS sem verificar o certificado do servidor (criptografado mas não autenticado). Conveniência para provedores gerenciados que apresentam sua própria CA e forçam sslmode=require quando você não pode fornecer STORAGE_SSL_CA. Prefira STORAGE_SSL_CA em produção |
PORT | Não | 3001 | Porta HTTP da aplicação |
NODE_ENV | Não | production | Ambiente Node |
ANOMALY_DETECTION_ENABLED | Não | true | Habilitar 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 air-gapped (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 envelope-encrypt de 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 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 desabilita chaves baseadas em arquivo (chaves coladas inline ainda funcionam) |
BETTERDB_TELEMETRY | Não | true | Defina false para desabilitar telemetria anônima |
Referência completa, incluindo IA, ajuste de webhook 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 bastion/jump host SSH em vez de conectar diretamente — útil para Valkey/Redis em uma sub-rede privada, ElastiCache ou MemoryDB. Habilite 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. É armazenado criptografado em repouso apenas quando
ENCRYPTION_KEYestá definida (envelope encryption); sem essa chave é armazenado em texto simples, como senhas de conexão. Funciona em todos os lugares, incluindo implantações gerenciadas/cloud. - Caminho de arquivo do servidor: a chave já reside no sistema de arquivos do servidor de monitoramento 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 desabilitar esta opção.
Opcionalmente, fixe a impressão digital da chave do host do servidor SSH (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 bastion. 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 hostname real do banco de dados. Defina ENCRYPTION_KEY para que senhas SSH, passphrases 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 ramifica 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ão alcançáveis apenas via bastion (ex.: ElastiCache/MemoryDB em uma sub-rede privada), visualizações por nó estarã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 & Suporte Air-Gapped
O BetterDB Monitor desbloqueia recursos Pro/Enterprise de uma de duas maneiras, dependendo de o host ter 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 breves interrupções e reinicializações. - Token de licença offline / air-gapped - para hosts sem acesso à internet algum (veja abaixo).
Como funciona o licenciamento air-gapped
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. Assim, um host air-gapped 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 air-gapped 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 UI em Configurações → Licença → "Ambiente air-gapped? Ative uma licença offline."
Quando um token offline está configurado e nenhuma BETTERDB_LICENSE_KEY está definida, o
monitor faz zero requisições de saída - verificações de licença, telemetria e pings de atualização
são todos desabilitados. Ele executa o nível concedido até o token expirar (licenças
perpétuas são re-baixadas 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 falhas online sobrevivam a reinicializações. O contêiner é executado como **UID 1001**,
> portanto, um volume recém-criado deve receber `chown` para esse UID (conforme mostrado acima) - caso contrário, a
> persistência falhará com `EACCES … license.jwt`.
Para o fluxo completo, a precedência de verificação e o 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 comprimido**: ~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 | Notas |
|---|---|---|
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 serverless | 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 do cluster e métricas de runtime do Node.js - todas com o prefixo 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 disponibiliza vários pacotes autónomos. Consulte packages/ para a lista completa.
| Pacote | Linguagem | Registo |
|---|---|---|
@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 | Replay harness for benchmarking semantic caches |
Stack Tecnológica
- Backend: NestJS com adaptador Fastify,
iovalkeypara ligações Valkey/Redis, TypeScript strict mode. 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 se 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
Construções de imagens Docker:```bash pnpm docker:build # local build pnpm docker:publish # multi-arch build & push (requires buildx)
### Adicionando Novos Recursos
1. Adicione novos endpoints em `apps/api/src/`
2. Adicione as chamadas de API correspondentes em `apps/web/src/api/`
3. Adicione 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/` está licenciado sob CC BY-SA 4.0.
- O conteúdo em `proprietary/` é coberto por uma licença comercial (consulte `proprietary/LICENSE`). Esses recursos são gratuitos durante o acesso antecipado.
- Todo o restante está sob [MIT](https://github.com/betterdb-inc/monitor/blob/master/LICENSE).