Documentação

Documentação codeDB

Guia completo de instalação, configuração e uso da plataforma — do primeiro acesso ao monitoramento em produção.

Guia do Usuário

O que é o codeDBComo funcionaPré-requisitosPrimeiros PassosInstalação do AgenteUsando o DashboardQuery IntelligenceTabelas e ÍndicesIncidentesDashboard GerencialRelatórios (semanal e mensal)Insights InteligentesModo TV / WallConfigurando AlertasSegurança e LGPDHealth ScoreAnálise de IncidentesPadrões e CorrelaçõesAPI PúblicaDisponibilidade e CoberturaJanelas de ManutençãoMembros e ColaboraçãoPlanos e AssinaturaSubdomínio personalizadoRegras de Uso

Apêndice Técnico

A — ArquiteturaB — Config.envC — Permissões SQL ServerC.1 — PostgreSQLC.2 — Métricas de nuvemD — Múltiplas InstânciasE — Ciclo de Vida da AssinaturaF — Versões e AtualizaçõesG — Referência da API PúblicaH — Controle de Acesso e RolesI — Segurança e LGPD

O que é o codeDB

O codeDB é uma plataforma SaaS de monitoramento de bancos de dados (SQL Server e PostgreSQL) que coleta métricas em tempo real por meio de um agente instalado na sua infraestrutura e as apresenta em um portal web com dashboards, alertas automáticos e relatórios históricos.

A plataforma foi criada para DBAs e gestores de TI que precisam de visibilidade contínua sobre a saúde do banco de dados sem a complexidade de configurar ferramentas de observabilidade do zero.

TempDB — uso em tempo real
Queries lentas e bloqueios
SQL Agent Jobs
I/O e latência de disco
Memória e PLE
Alertas por e-mail

Como funciona

O codeDB é composto por três partes que trabalham em conjunto:

Agente (Windows)

Executável instalado no servidor Windows. A cada 5 minutos consulta as DMVs do SQL Server e envia as métricas para a API.

API (Nuvem)

Backend hospedado na nuvem. Recebe os snapshots, calcula o health score, avalia regras de alerta e persiste os dados.

Portal (Web)

Acesse pelo navegador em qualquer lugar. Visualize dashboards em tempo real, configure alertas e gerencie sua assinatura.

Fluxo resumido: Agente (coleta a cada 5 min) → API codeDB (processa e armazena) → Portal Web (exibe em tempo real).


Pré-requisitos

Instalando no Windows (SQL Server ou PostgreSQL)

RequisitoVersão mínimaObservação
Windows Server2012 R2 ou superiorTambém funciona em Windows 10/11 Pro
SQL Server2012 ou superiorExpress, Standard, Enterprise, Developer
ODBC Driver for SQL Serverv17 (recomendado) ou v18Download gratuito na Microsoft — não é necessário para monitorar PostgreSQL
PostgreSQL (em vez do SQL Server)11 ou superiorTestado no 16. Não precisa de driver: o agente já traz. Ver apêndice C.1
.NET Framework4.7.2 ou superiorNormalmente já presente no Windows Server
Acesso à internetPorta 443 (HTTPS)Para envio de dados ao codeDB

Instalando no Linux ou em container (PostgreSQL)

RequisitoVersão mínimaObservação
Distro Linux (pacote .deb)Debian 11+, Ubuntu 20.04+Instalação via apt, serviço systemd
Distro Linux (tarball)Qualquer uma com glibc 2.31+RHEL/Rocky 9+ e similares; RHEL/CentOS 8 (glibc 2.28) não roda
Runtime de containerDocker ou outro runtime OCITambém funciona em Kubernetes como um Pod comum
PostgreSQL11 ou superiorTestado no 16. Ver apêndice C.1 para privilégios e extensões
Acesso à internetPorta 443 (HTTPS)Para envio de dados ao codeDB — mesma regra do Windows

Nenhum dos dois exige driver de conexão: o agente já traz o necessário para PostgreSQL (psycopg) embutido no binário.

Permissões no banco

O login configurado no agente precisa da permissão VIEW SERVER STATE para consultar as DMVs de monitoramento. Veja o script completo na seção C — Permissões SQL Server do apêndice técnico. No PostgreSQL, o usuário de monitoração recebe o papel pg_monitor — nunca superusuário; veja C.1 — PostgreSQL.


Primeiros Passos

Formas de entrar no codeDB

Você pode criar sua conta e fazer login de três formas. Todas levam ao mesmo dashboard — a diferença é só como sua identidade é confirmada.

Forma de loginComo funcionaQuando usar
E-mail e senhaCadastro tradicional: nome, e-mail, senha, CPF/CNPJ e nome da empresaUso individual ou primeiro acesso da organização
GoogleUm clique em “Continuar com Google” — usa a conta Google já logada no navegadorQuem já usa Gmail ou Google Workspace na empresa
Microsoft (Entra ID / 365)Um clique em “Continuar com Microsoft” — usa a conta corporativa Microsoft 365 / Azure ADEmpresas com Microsoft 365 ou Active Directory
1

Crie sua conta

Acesse o portal codeDB e clique em Começar Gratuitamente. Preencha nome, e-mail, senha, CPF/CNPJ e nome da empresa — ou entre direto com Google ou Microsoft (veja abaixo). Você terá 30 dias de trial gratuito sem precisar inserir cartão de crédito. Se o cadastro foi com e-mail e senha, confirme o código de 6 dígitos enviado ao seu e-mail (ver Segurança e LGPD) antes de continuar.

Entrando com Google ou Microsoft

Na tela de login (/auth/login) ou cadastro (/auth/register), clique em Continuar com Google ou Continuar com Microsoft. Você é redirecionado para autenticar direto com o provedor — o codeDB nunca vê sua senha.

  • Primeiro acesso: se for a primeira vez que esse e-mail entra no codeDB, você completa um cadastro rápido (nome da empresa e CPF/CNPJ) e ganha os 30 dias de trial, igual ao cadastro tradicional.
  • Conta já existente com o mesmo e-mail: o login social é vinculado automaticamente à sua conta (desde que o e-mail seja confirmado pelo provedor) — você continua acessando o mesmo workspace de sempre.
  • Login Microsoft aceita apenas contas corporativas (Microsoft 365 / Azure AD) — contas pessoais (outlook.com, hotmail.com) não são aceitas.
2

Crie um Ambiente

Após o login, o assistente de onboarding será exibido automaticamente. Clique em Criar Ambiente e dê um nome (ex: "Produção", "Desenvolvimento"). Um token de agente será gerado para este ambiente — guarde-o com segurança, ele é exibido apenas uma vez.

3

Baixe e instale o agente

Para SQL Server, clique em Baixar Agente para baixar o instalador codeDB-Agent-Setup.exe e execute-o no servidor Windows onde o SQL Server está instalado. Para PostgreSQL, a mesma tela também oferece pacote Linux (.deb ou tarball) e imagem de container — veja a comparação completa em Instalação do Agente.

4

Configure e aguarde

No Windows, o instalador abre o Gerenciador de Instâncias automaticamente; no Linux e no container, edite o Config.env ou as variáveis de ambiente diretamente. Insira o token do ambiente, os dados de conexão e salve. Em até 5 minutos os primeiros dados aparecerão no portal.


Instalação do Agente

O agente existe em quatro formatos, dependendo do sistema operacional e do banco monitorado. SQL Server só é monitorado pelo agente Windows — os builds Linux e container não trazem driver ODBC, então recusam DB_ENGINE=sqlserver cedo, com mensagem clara. PostgreSQL pode ser monitorado por qualquer um dos quatro.

Qual formato usar

FormatoSistemaEnginesQuando usar
Instalador Windows (.exe)Windows Server 2012 R2+, ou Windows 10/11 ProSQL Server e PostgreSQLServidor Windows — único caminho para SQL Server
Pacote .debDebian 11+, Ubuntu 20.04+PostgreSQLDistros da família Debian/Ubuntu, com systemd
Tarball universalQualquer Linux com glibc 2.31+ (RHEL/Rocky 9+ etc.)PostgreSQLDistros fora da família Debian — RHEL/CentOS 8 (glibc 2.28) não roda o binário atual
Imagem de containerDocker, Kubernetes ou outro runtime OCIPostgreSQLAmbiente já containerizado, sem SO próprio para instalar um serviço

Os quatro formatos são baixados na mesma tela do portal — Configurações → Download do Agente — que mostra só as opções compatíveis com o engine do ambiente escolhido.

Onde cada formato guarda a configuração

WindowsLinux (.deb / tarball)Container
ConfiguraçãoConfig.env ao lado do .exe/etc/codedb-agent/Config.env (600)variáveis de ambiente
Chave de cifra da senhaCodeDB.key ao lado do .exe/etc/codedb-agent/CodeDB.key (600)— senha vem de arquivo de secret
Logs, estado e sondasao lado do .exe/var/lib/codedb-agent/ (700)volume Docker montado em /var/lib/codedb-agent
ServiçoNSSM ("codeDB Agent")systemd (codedb-agent)flag --restart unless-stopped
Atualizaçãoinstalador Inno, SHA-256 conferidotroca o binário, SHA-256 conferido, systemd reinicianão se atualiza sozinho — suba uma imagem nova

As variáveis CODEDB_CONFIG_DIR e CODEDB_STATE_DIR trocam essas pastas por outras, se precisar de um layout diferente do padrão.


Windows — Passo 1: executar o instalador

Execute codeDB-Agent-Setup.exe como administrador. O instalador copiará os arquivos para C:\Program Files\codeDB Agent\, instalará o gerenciador de serviço NSSM e registrará o agente como serviço Windows com inicialização automática.

Instalação MSP (um Agente para vários Ambientes)

Se você é uma empresa MSP e já criou um Agente na tela Agentes do portal, vinculando-o a um ou mais Ambientes, marque a opção "Esta é uma instalação MSP" na tela de pasta de instalação. A tela seguinte pede só o Token do Agente (enrollment) — gerado na tela Agentes, não o token de Ambiente — e, depois de validado, mostra a lista de Ambientes que essa instalação vai gerenciar antes de continuar.

Se o Agente ainda não tiver nenhum Ambiente vinculado, o instalador bloqueia e pede para associar um Ambiente ao Agente no portal antes de prosseguir. Deixe a opção desmarcada (padrão) se você não é MSP ou está instalando do jeito tradicional — o fluxo continua idêntico ao Passo 2 abaixo.

Windows — Passo 2: Gerenciador de Instâncias (GUI)

Ao final da instalação, o codeDB Agent Config é aberto automaticamente. Nele você irá:

  • Inserir o Agent Token gerado no portal
  • Selecionar a instância SQL Server (servidor e porta)
  • Escolher o tipo de autenticação (Windows Auth ou SQL Login)
  • Inserir usuário/senha do SQL (armazenados com criptografia AES)
  • Clicar em Salvar e Iniciar Serviço

Windows — Passo 3: verificar o serviço

Após salvar, o serviço codeDB-Agent aparece no Gerenciador de Serviços do Windows (services.msc) com status Em execução. O serviço reinicia automaticamente em caso de falha.


Linux — pacote .deb (Debian, Ubuntu)

O caminho mais direto em distros da família Debian/Ubuntu com systemd:

curl -fsSLO <url do .deb — copiado de Configurações → Download do Agente>
sudo apt install ./codedb-agent_<versão>_amd64.deb
sudo nano /etc/codedb-agent/Config.env      # cole o token do ambiente e os dados de conexão
sudo systemctl start codedb-agent
journalctl -u codedb-agent -f               # acompanhar o log em tempo real

Linux — tarball universal

Para qualquer outra distro com glibc 2.31 ou superior (RHEL/Rocky 9+, por exemplo):

curl -fsSL <url do tarball — copiado de Configurações → Download do Agente> | tar xz
sudo ./codedb-agent/install.sh              # idempotente: rodar de novo atualiza

Os dois formatos criam o usuário de sistema codedb-agent, dono do binário, da configuração e do estado. Se a senha for colada em texto plano no Config.env, o próprio agente a cifra na primeira execução — não precisa cifrar à mão.

Container

docker run -d --name codedb-agent --restart unless-stopped \
  -e CODEDB_API_URL=https://api.codedb.com.br \
  -e AGENT_TOKEN_FILE=/run/secrets/agent_token \
  -e DB_ENGINE=postgres -e DB_SERVER=<host> -e DB_PORT=5432 -e DB_DATABASE=postgres \
  -e DB_USERNAME=codedb_monitor -e DB_PASSWORD_FILE=/run/secrets/db_password \
  -v codedb-agent-state:/var/lib/codedb-agent \
  -v /caminho/dos/secrets:/run/secrets:ro \
  <imagem indicada em Configurações → Download do Agente>

Segredos entram só por arquivo (sufixo _FILE na variável) — uma variável de ambiente comum apareceria em docker inspect de qualquer pessoa com acesso ao host. O container roda com usuário sem privilégio (uid 10001, não root) e não é o servidor do banco: CPU, memória e disco ficam indisponíveis, e a Visão Geral explica isso no lugar de mostrar zero. O volume guarda o spool de sondas e esperas — recriar o container não perde o que foi coletado enquanto a API estava fora do ar.

O container não se atualiza sozinho: quando sair uma versão nova, troque a tag da imagem e recrie o container.


O que o agente faz depois de instalado

A partir da versão 1.19.2 o agente executa dois trabalhos independentes, em ritmos diferentes:

TrabalhoRitmoO que faz
Coleta de métricasA cada 5 min (definido pelo plano)Lê as DMVs, calcula o payload e envia para a plataforma
Sonda de disponibilidadeA cada 15 segundosTesta a conexão com um SELECT 1 e grava o resultado em disco

A sonda roda em thread separada: ela não espera a coleta de métricas terminar, e uma coleta lenta não atrasa a medição de disponibilidade. Se a instância estiver fora do ar, a coleta de métricas falha e o agente registra isso explicitamente, em vez de simplesmente ficar em silêncio.

Armazenamento local das sondas

No Windows, as medições ficam em C:\Program Files\codeDB Agent\probe\; no Linux, em /var/lib/codedb-agent/probe/; no container, dentro do volume montado. Em todos os casos: uma subpasta por instância, em arquivos de texto (uma linha por sonda), com permissão restrita ao dono do processo (SYSTEM e Administradores no Windows; usuário codedb-agent no Linux) — a mesma proteção do Config.env.

AspectoComportamento
ConteúdoApenas horário, sucesso/falha e classe do erro — nenhuma credencial, nenhum dado de negócio
VolumeCerca de 350 KB por dia por instância
EnvioJunto do ciclo de coleta; o arquivo só é apagado após confirmação da plataforma
Plataforma fora do arAs medições se acumulam em disco e sobem quando a comunicação volta
Limite de acúmuloTeto de tamanho: excedido, os registros mais antigos são descartados com aviso no log

Para desativar a sondagem, defina PROBE_ENABLED=false no Config.env. O intervalo é ajustável por PROBE_INTERVAL_SEC (padrão 15).

Adicionando mais instâncias SQL

Se o mesmo servidor hospedar mais de uma instância SQL Server nomeada (ex: SERVIDOR\DEV e SERVIDOR\PROD), abra o codeDB Agent Config novamente, clique em + Adicionar Instância e reutilize o token do mesmo ambiente — todas as instâncias do mesmo servidor entram no mesmo ambiente. Só use o token de um segundo ambiente se estiver monitorando um servidor diferente (ver seção abaixo).

Agent language / Idioma do Gerenciador de Instâncias

The codeDB Agent Config GUI auto-detects your Windows display language (Portuguese or English). To force a specific language regardless of the Windows locale, set the environment variable CODEDB_LANG=en (or CODEDB_LANG=pt-BR) before launching codeDB-Agent-Config.exe. The Windows service itself (codeDB-Agent.exe) has no UI — its logs stay in English regardless of locale.

Ambientes e servidores

Cada ambiente representa um servidor SQL Server ou, no PostgreSQL, um cluster (os databases dele aparecem como dimensão da métrica, não como ambientes separados). Todas as instâncias adicionadas a um ambiente precisam estar nesse mesmo servidor/cluster — o portal identifica automaticamente qual servidor está vinculado ao ambiente assim que a primeira instância envia dados, e passa a exibi-lo no card do ambiente. Para monitorar um segundo servidor, crie um segundo ambiente (isso consome um slot adicional de ambiente do seu plano).

Ambiente "Produção" → servidor 10.11 ├─ Instância 10.11 ✓ mesmo servidor └─ Instância 10.11\DEV ✓ mesmo servidor Ambiente "Servidor Teste" → servidor 10.32 └─ Instância 10.32\TESTE ✓ servidor diferente → ambiente separado

Se você tentar adicionar uma instância de um servidor diferente ao mesmo ambiente, o codeDB recusa o cadastro e sugere criar um novo ambiente.


Usando o Dashboard

Idioma do portal

O portal está disponível em Português (Brasil) e English. Troque o idioma pelos botões PT/EN no rodapé do menu lateral, ou em Meu Perfil → Preferências. A preferência é salva na sua conta e aplicada automaticamente no próximo login.

Visão geral

A tela principal do portal exibe um card por instância monitorada com o Health Score (0–100), contador de alertas ativos e hora da última coleta. A cor indica a situação atual:

Verde (80–100) — Saudável

Amarelo (50–79) — Atenção

Vermelho (0–49) — Crítico

Detalhes de uma instância — 10 abas

Clique em qualquer card para abrir o painel de instância com 10 abas, na ordem "o que está acontecendo agora → onde estão os dados → operação → inteligência derivada", atualizadas automaticamente a cada 60 segundos. A tabela abaixo descreve o SQL Server — para o que muda no PostgreSQL, veja a tabela seguinte.

AbaConteúdo
1 — Visão GeralTrês quadros: Servidor (CPU do SQL Server, RAM física, conexões, espaço livre por disco, séries de 48h), SQL Server (sessões, bloqueios, PLE, buffer cache, waits) e TempDB
2 — PerformanceWait stats, PLE, buffer cache hit ratio, top queries por CPU e leituras, I/O por arquivo
3 — Sessões e BloqueiosSessões ativas, queries em execução, chains de bloqueio
4 — Query IntelligenceRanking de queries por impacto (Score 0-100), tendências de crescimento e degradação, sugestões de índice e correlação com incidentes
5 — Tabelas e ÍndicesAs 50 maiores tabelas de cada banco com crescimento em 7/30/90 dias; os 50 maiores índices com fragmentação, uso real e colunas
6 — CapacidadeTamanho alocado, usado e % de log por banco; espaço em disco por volume; projeção de esgotamento
7 — Jobs e BackupsStatus dos SQL Agent Jobs, histórico de falhas, status de backups
8 — Insights InteligentesRecomendações automáticas baseadas em regras e histórico
9 — AnomaliasDetecção de anomalias estatísticas em métricas históricas
10 — Análise de IncidentesRoot Cause Timeline: causa raiz, sequência de eventos, Health Score

O que muda no PostgreSQL

O mesmo painel de 10 abas existe para ambientes PostgreSQL — só o conteúdo de cada aba muda para refletir os conceitos do engine. Abas sem equivalente ainda ficam escondidas (não aparece aba vazia): é o caso hoje de 2 — Performance, cujo equivalente (cache hit, I/O por arquivo) já está coberto dentro da própria 1 — Visão Geral.

AbaNo PostgreSQL
1 — Visão GeralAtividade (sessões, bloqueios, cache hit, query mais longa), Saúde (conexões, autovacuum pendente, idade de XID, WAL/archiver) e Servidor (CPU, RAM, disco — quando o agente roda na própria máquina do banco)
3 — Sessões e BloqueiosMesmas sessões e cadeias de bloqueio, vindas de pg_stat_activity/pg_locks em vez das DMVs
4 — Query IntelligenceRanking por pg_stat_statements — requer a extensão instalada; sem ela, a aba mostra o passo a passo para habilitar (ver apêndice C.1)
5 — Tabelas e ÍndicesAs mesmas 50 maiores tabelas/índices, com bloat no lugar de fragmentação (medido com pgstattuple, ou estimado sem ela) e sequência/IDENTITY no lugar do IDENTITY do SQL Server
6 — CapacidadeMesma projeção de esgotamento de disco; TempDB vira temp files. Em hospedagem gerenciada (RDS, Azure Flexible, Cloud SQL), a aba vira "Cloud Intelligence" — sem disco visível, destaca conexões e autovacuum
7 — Jobs e BackupsPostgreSQL não tem agendador nativo — a aba mostra o status do WAL arquivado e do backup (pgBackRest ou outro), sem a parte de jobs
8/9/10 — Insights, Anomalias, Análise de IncidentesMesmas telas, com regras e causas-raiz próprias do PostgreSQL (autovacuum parado, risco de XID wraparound, lag de replicação, entre outras)

Query Intelligence

Disponível na aba 4 — Query Intelligence dentro do painel de uma instância. Identifica automaticamente as consultas SQL que merecem atenção usando regras determinísticas (sem IA) — não armazena todas as queries, apenas as que satisfazem critérios de relevância.

Os dados são agregados diariamente às 01:50 BRT e ficam disponíveis em quatro sub-abas:

Sub-abaO que mostra
Top ImpactRanking de queries por Impact Score (0–100). O score é calculado por percentil relativo: um score 85 significa que a query consome mais que 85% das outras queries do ambiente.
CrescendoQueries com CPU crescendo mais de 20% em 7 dias (regressão linear). Badge '+XX% em 7d'. Requer 7 dias de histórico.
DegradadasQueries com CPU atual acima de 1,5× o baseline dos últimos 14 dias. Badge 'XX× baseline'. Requer 14 dias de histórico.
Missing IndexesSugestões de índice detectadas automaticamente pelo SQL Server. DDL do CREATE INDEX pronto para copiar.
RecomendaçõesRegras QRULE_* disparadas, com severidade, explicação e ação recomendada.

Regras QRULE_* — o que cada uma detecta

RegraCondiçãoAtiva desde
QRULE_001CPU excessiva: avg_cpu_ms > 5.000ms com ≥ 10 execuçõesDia 1
QRULE_002Alta frequência: > 50.000 execuções por dia (possível loop de aplicação)Dia 1
QRULE_003Leitura excessiva: avg_logical_reads > 100.000 páginas por execuçãoDia 1
QRULE_004Crescimento acelerado: CPU cresceu > 20% em 7 dias (regressão linear)Dia 7
QRULE_005Degradação vs baseline: CPU atual > 1,5× a média dos 14 dias anterioresDia 14
QRULE_006Índice ausente: alta leitura física + sugestão de índice detectada no mesmo bancoDia 1
QRULE_007Correlação com incidente: query estava ativa durante janela de incidente (48h)Dia 1
QRULE_009Concentração de CPU: query representa > 30% do total de CPU da instância no diaDia 1

As regras QRULE_004 e QRULE_005 exigem histórico mínimo (7 e 14 dias, respectivamente) — elas ativam automaticamente conforme os dados acumulam, sem nenhuma configuração necessária.

Impact Score (0–100)

O Impact Score é calculado diariamente para cada query com base em 6 dimensões ponderadas:

DimensãoPeso
CPU acumulada (total_cpu_ms)30%
Leituras lógicas totais25%
Elapsed × execuções20%
Writes totais10%
Frequência de execução10%
Tendência de CPU (slope 7d)5%

O score é relativo ao ambiente — não há threshold fixo. Queries com score alto são as que mais consomem recursos em comparação com as demais queries da mesma instância. Clique em qualquer query para abrir um drawer com o gráfico de tendência (Avg CPU e Max CPU nos últimos 14 dias) e o texto SQL da query.

No PostgreSQL

A mesma aba existe, alimentada por pg_stat_statements em vez das DMVs — sem a extensão instalada, a aba mostra o passo a passo para habilitar (apêndice C.1) em vez de ficar vazia. Como o Postgres não separa CPU de tempo total gasto por query (total_exec_time), o Impact Score redistribui o peso de CPU para tempo decorrido. No lugar de Missing Indexes, a sub-aba mostra varreduras sequenciais dominantes — tabelas onde o otimizador prefereSeq Scan a um índice, sem sugestão de DDL pronta (o Postgres não gera essa recomendação como o SQL Server gera).


Tabelas e Índices

Disponível na aba 5 — Tabelas e Índices (planos Professional e Business). Responde às perguntas que um DBA faz todo dia sem precisar rodar scripts: quais tabelas estão crescendo, quais índices estão fragmentados e quais índices existem mas ninguém usa.

SeçãoO que mostra
Top 10 crescimentoGráfico de barras com as tabelas que mais cresceram na janela escolhida (7, 30 ou 90 dias).
Tabelas que mais consomem espaçoAs 50 maiores tabelas de cada banco: linhas, espaço reservado, dados, índices, não usado, valor atual da IDENTITY, tamanho N dias atrás e crescimento em GB e %.
Índices por tamanhoOs 50 maiores índices rowstore de cada banco: fragmentação, páginas, tamanho, uso total (seeks + scans + lookups), escritas, colunas-chave e incluídas. Índice com escritas e nenhuma leitura fica destacado.

Como é coletado: uma vez por dia, na madrugada do servidor SQL (janela 03:00–05:00 por padrão; ajustável com SCHEMA_INVENTORY_HOUR noConfig.env do agente). A fragmentação usa dm_db_index_physical_statsem modo LIMITED, apenas nos índices já selecionados e com mais de 1.000 páginas, com timeout por índice — por isso a coleta nunca roda em horário comercial. Requer agente1.20.0 ou superior; a coluna de crescimento fica vazia até existir histórico.

Os dados alimentam três insights automáticos — tabela em crescimento acelerado,índices grandes com fragmentação ≥ 80% e índices sem uso — e duas seções do relatório semanal.

No PostgreSQL

A mesma aba existe, com bloat no lugar de fragmentação — medido com pgstattuple quando a extensão está instalada, ou estimado (com um selo indicando isso) quando não está. O uso de índice vem de idx_scan em vez de seeks/scans/lookups, e a coluna de sequência (nextval) ocupa o lugar do IDENTITY do SQL Server. A coleta também roda uma vez por dia, agendável por ambiente (padrão: madrugada, com orçamento de tempo configurável) — nunca em horário comercial. Insights próprios do engine (autovacuum parado numa tabela, risco de XID wraparound) aparecem na aba 8 — Insights Inteligentes.


Incidentes

Acesse em Incidentes no menu lateral. Esta tela centraliza, em três abas, toda a inteligência sobre problemas passados e recorrentes em todas as instâncias do ambiente.

AbaO que mostra
IncidentesLista de todos os incidentes detectados: instância, causa raiz (com confiança), duração, queda de Health Score e status. Permite filtrar por período (7–90 dias) e exportar o relatório HTML de cada incidente (ícone ⬇).
Padrões RecorrentesProblemas que se repetem no mesmo dia da semana e bloco de horário — sinal de causa sistêmica (ex: job de manutenção, pico de carga diário). Mínimo de 2 ocorrências nos últimos 90 dias.
CorrelaçõesIncidentes que afetaram múltiplas instâncias em menos de 15 minutos — indica problema de infraestrutura compartilhada (storage, hypervisor, rede).

Dashboard Gerencial

Acesse em Gerencial no menu lateral. É o panorama da empresa inteira — todos os ambientes e instâncias (SQL Server e PostgreSQL) numa única tela, pensada para gestores e líderes de TI entenderem a situação em poucos segundos e, depois, aprofundarem onde for preciso. Um card "Gerencial do mês" na tela inicial leva até ela.

Como os dados são gerados: toda madrugada o codeDB consolida o dia anterior de cada instância (conexões e bloqueios por hora, esperas, latência de disco, volumes). O Gerencial lê só esses consolidados — abrir a tela não pesa no seu SQL Server nem no monitoramento, e o histórico continua disponível mesmo depois do prazo de retenção das métricas detalhadas do seu plano.

Filtros e períodos

ControleO que faz
Ambiente"Todos os ambientes" (padrão) ou um ambiente específico
Período30, 60 ou 90 dias no plano Professional; 180 e 365 dias também no Business. Períodos fora do seu plano aparecem com cadeado
Chips de instânciaLigam e desligam a instância em todos os gráficos ao mesmo tempo — cada instância tem cor e traço fixos em toda a tela

O que a tela mostra

BlocoO que representa
Resumo (6 indicadores)Health Score médio, disponibilidade medida, incidentes (com % de madrugada), tempo médio de resolução (MTTR), alertas evitados pela supressão e oportunidades (GB em índices sem leitura + sugestões de índice de alto impacto). Cada um mostra a variação ▲▼ contra o período anterior e uma mini-tendência semanal
Pontos de atençãoOs 5 problemas mais importantes do período, ordenados por gravidade, com a ação recomendada (ex.: tempdb lento, disco perto do limite, estatísticas desatualizadas, backup atrasado)
Mapa da frotaUma linha por instância com nota verde / amarelo / vermelho em Estabilidade, Disponibilidade, I/O, Capacidade, Eficiência e Manutenção — a visão de onde agir primeiro
EstabilidadeIncidentes e saúde por semana, mapa de calor dia × hora (revela janelas de job e backup), causas raiz e disponibilidade semanal
CargaConexões, % do tempo com bloqueio e CPU ao longo do dia, e em que as esperas se concentram (disco, CPU, lock, memória, rede)
ArmazenamentoUso dos volumes, crescimento em GB/mês, dias até encher (runway) e dias com log de transações acima de 80%
EficiênciaQuanto da CPU a query nº 1 e as 5 mais caras consomem, índices sem leitura, sugestões de índice e estatísticas desatualizadas
Específico por engineSQL Server: latência de leitura/escrita de dados, log e tempdb. PostgreSQL: idade de XID, atraso de replicação, cache hit, dead tuples e autovacuum

Cada bloco traz uma frase-resumo gerada automaticamente (ex.: "45% dos incidentes aconteceram de madrugada e a causa mais comum é gargalo de I/O"), para a leitura não depender de interpretar o gráfico.

Relatório PDF

O botão Relatório PDF gera um relatório executivo em A4, pronto para apresentar em reunião ou enviar ao cliente. Escolha os últimos 30, 60 ou 90 dias ou um mês fechado(comparado com o mês anterior). O relatório tem três partes:

ParteConteúdo
CapaOs 6 indicadores com variação, os pontos de atenção mais graves e o índice das histórias
HistóriasDe 5 a 8 páginas, uma por achado relevante do período — manchete com o número, gráfico, "o que isso significa" e "ação recomendada". Só entram achados com dado suficiente
AnexosA lista do que fazer, com nomes: queries que mais consomem CPU (com trecho do SQL), índices sem leitura (tamanho e custo de escrita), tabelas que mais cresceram, estatísticas desatualizadas, situação dos backups e incidentes mais graves

Clientes MSP com marca própria recebem o relatório com o próprio logo. O owner também pode gerar uma versão anonimizada (instâncias viram "Servidor A, B…", sem nomes de bancos, tabelas ou queries) — útil para apresentar um caso sem expor o ambiente; toda geração anonimizada fica registrada na auditoria.

Exportar dados

Exportar HTML gera um arquivo interativo (gráficos com tooltip e chips de instância) que abre em qualquer navegador. Exportar Excel gera uma planilha com uma aba por painel, com números como número — pronta para filtros, gráficos próprios ou BI.

O codeDB separa Disponibilidade de Cobertura de Monitoramento: uma indisponibilidade da própria plataforma codeDB nunca reduz a disponibilidade do seu SQL Server. Consulte a seção Disponibilidade e Cobertura para entender o modelo de estados UP / DOWN / UNKNOWN.


Relatórios (semanal e mensal)

Acesse em Relatórios no menu lateral. Todo domingo à noite o codeDB gera e envia automaticamente um relatório por e-mail para os responsáveis do ambiente. O e-mail chega segunda-feira às 08h (BRT) e resume toda a semana.

Seção do relatórioConteúdo
Health Score por instânciaRanking do pior ao melhor, com média da semana
AlertasTotal disparados, críticos e resolvidos no período
DisponibilidadePercentual de uptime por instância
Riscos de backupBancos com backup atrasado ou com falha
Insights automáticosRecomendações geradas durante a semana
Top incidentesOs 3 com maior queda de Health Score, com causa raiz e recomendação

Na página de Relatórios você também pode disparar o envio manualmente e consultar o histórico de envios anteriores com data, destinatário e status (enviado / falhou / ignorado).

Relatório mensal do Gerencial

Nos planos Professional e Business, todo dia 1º o codeDB gera automaticamente o Relatório PDF do Gerencial do mês anterior e envia ao owner um e-mail com o link. Os relatórios ficam na seção Relatórios mensais do Gerencial desta página, com os dados congelados — o relatório de setembro mostra sempre o que aconteceu em setembro. O owner ou um admin pode desligar o e-mail em Configurações; o relatório continua sendo gerado e fica disponível para download.


Insights Inteligentes

Acesse em Insights no menu lateral. Lista centralizada das recomendações operacionais geradas diariamente pelo codeDB para todas as instâncias do ambiente, com base em 14 regras que cruzam métricas históricas, tendências e padrões de uso.

SeveridadeExemplos de insight gerado
Crítico 🔴Disco esgota em menos de 7 dias; TempDB com apenas 1 arquivo sob alta contenção
Atenção 🟡PLE médio abaixo de 1.000s nos últimos 7 dias; job de backup com falha recorrente
Info ⚪Índice fragmentado acima de 80%; query com varredura completa em tabela grande

Filtre por ambiente e severidade. Clique em qualquer insight para abrir diretamente o painel da instância afetada.


Modo TV / Wall

Disponível dentro do painel de uma instância, no ícone de TV no canto superior. O Modo TV exibe o monitoramento em tela cheia, pensado para NOCs, war rooms e monitores em salas de operação — atualiza automaticamente a cada 30 segundos sem interação.

CategoriaWidgets disponíveis
KPIsHealth Score (gauge colorido), PLE, TempDB %, sessões ativas, bloqueios, RAM %, buffer cache, queries longas, deadlocks, jobs com falha
GráficosTop wait types (barras), latência de I/O, histórico de Health Score (24h)
ListasAlertas disparados no momento, status de backups por banco

Os widgets são configuráveis: ative, desative e reordene pelo painel de configurações (ícone de engrenagem). Preferências ficam salvas no perfil. O gauge do Health Score muda de cor conforme o status: verde (≥ 80), amarelo (50–79), laranja (30–49) e vermelho (< 30).


Segurança e LGPD

Autenticação em dois fatores (MFA)

O codeDB suporta TOTP (Time-based One-Time Password) para proteger sua conta com um segundo fator além da senha. Use Google Authenticator, Authy, Microsoft Authenticator ou qualquer app compatível com TOTP.

1

Acesse seu Perfil

Clique no seu avatar no canto superior direito e acesse Perfil.

2

Ative o MFA

Na seção Segurança, clique em Ativar autenticação em dois fatores. Um QR Code será exibido para parear com o seu app autenticador.

3

Confirme com o código

Insira o código de 6 dígitos gerado pelo app para confirmar o pareamento. A partir desse momento, cada login exigirá o código atual.

O secret TOTP é armazenado criptografado no banco de dados — nunca em texto claro. Para desativar o MFA, acesse o mesmo menu e informe a senha e um código válido.

Verificação de e-mail no cadastro

Ao criar conta com e-mail e senha, o codeDB envia um código de 6 dígitos para o e-mail informado, na própria tela de cadastro. O código expira em 20 minutos e permite até 5 tentativas antes de exigir um reenvio. Enquanto o e-mail não é confirmado, o login fica bloqueado — se você fechar a aba antes de confirmar, o próximo login pede o código de novo.

Contas criadas por convite de um membro do workspace ou por Google/Microsoft não passam por essa etapa — o e-mail já é considerado confiável nesses casos.

Proteção de tokens e chaves

ItemComo é protegido
Token do agentVerificado via SHA-256 — nunca armazenado em texto claro
API KeysArmazenadas como hash SHA-256 — visíveis apenas no momento da criação
Auto-update do agentInstalador verificado por SHA-256 antes da aplicação; sem correspondência o update é bloqueado
Senha do banco (Config.env)Criptografada com Fernet/AES-128 — prefixo ENC: no arquivo

Trate tokens e API Keys como senhas: não inclua em código-fonte, repositórios Git ou logs. Use variáveis de ambiente ou cofres de secrets (AWS Secrets Manager, Azure Key Vault, etc.).

Privacidade de queries coletadas

Cada ambiente tem um modo de visibilidade para o texto das queries SQL coletadas pelo agente. Configure em Configurações → card do ambiente → Privacidade de Queries:

ModoComportamento
full (padrão)Texto completo da query armazenado e visível no portal
maskedTexto truncado/ofuscado antes do armazenamento
disabledTexto nunca armazenado — apenas estatísticas de performance

Seus direitos — LGPD Art. 18

DireitoComo exercer no codeDB
Exclusão de conta e dadosPerfil → Excluir minha conta (requer senha + MFA se ativo). Todos os dados do workspace são removidos permanentemente.
Portabilidade / exportaçãoConfigurações → Exportar dados. Gera um arquivo ZIP com todos os dados do ambiente, disponível por 48h para download.
Visualizar dados coletadosDashboard, alertas, incidentes e histórico — todos visíveis e acessíveis pelo portal.
Anonimização de IPEndereços IP são truncados automaticamente antes do armazenamento (/24 IPv4, /48 IPv6).

Para detalhes completos consulte a Política de Privacidade e a Política de Cookies.

Termos de Uso e modelo de contrato

O codeDB usa o modelo click-wrap: ao clicar em "Criar Conta", o usuário aceita os Termos de Uso e a Política de Privacidade. Não há contrato separado para assinar. O aceite é registrado automaticamente no momento do cadastro, vinculado ao usuário e ao workspace.

DocumentoOnde encontrar
Termos de Uso/termos
Política de Privacidade/privacidade
Política de Cookies/cookies

Na primeira visita ao portal, um banner de cookies permite aceitar, recusar ou configurar as preferências de rastreamento. O consentimento é registrado no backend com timestamp e IP anonimizado. Para organizações que exigem MSA, DPA ou SLA assinado, entre em contato com o suporte — o aceite click-wrap atende à maioria dos casos.


Health Score

O Health Score é um número de 0 a 100 que resume a saúde da instância em um único valor, calculado a cada 5 minutos — mesma escala nos dois engines, mas cada um penaliza sinais diferentes (a lista de SQL Server vem primeiro; PostgreSQL logo abaixo).

ScoreClassificaçãoO que significa
90–100ExcelenteInstância funcionando dentro dos parâmetros ideais
70–89BomPequenas anomalias, sem impacto relevante
50–69AtençãoDegradação moderada — investigar logo
30–49CríticoProblema ativo afetando performance
0–29EmergênciaSituação grave, intervenção imediata necessária

O que compõe o score

  • PLE (Page Life Expectancy) — principal indicador de pressão de memória. Valores abaixo de 300s penalizam significativamente o score.
  • Buffer Cache Hit Ratio — abaixo de 95% indica leituras físicas frequentes do disco.
  • TempDB — uso acima de 85% começa a penalizar o score.
  • Bloqueios ativos — penalidade proporcional ao número de sessões bloqueadas.
  • Jobs com falha — cada SQL Agent Job com falha reduz o score.
  • Latência de I/O — arquivos com latência acima de 50ms indicam gargalo de disco.
  • Wait stats dominantes — tipos de espera com mais de 40% do tempo total.
  • Espaço em disco — volume com menos de 20% livre desconta 10 pts; menos de 10% desconta 25 pts (apenas o volume mais crítico penaliza).
  • Crescimento súbito de log — arquivo .ldf crescendo ≥ 500 MB em um ciclo (~5 min) desconta 10 pts; ≥ 2.000 MB desconta 20 pts.

O que compõe o score no PostgreSQL

  • Cache hit — ocupa o lugar do PLE (não é "PLE do Postgres": o mecanismo de cache é outro). Abaixo de 95% desconta 10 pts; abaixo de 90% desconta 20 pts.
  • Query em execução há mais de 30/60 min — mesmos limiares e pesos do SQL Server.
  • Bloqueios ativos — mesma regra do SQL Server, via pg_blocking_pids().
  • Espaço em disco — idêntico ao SQL Server: só o volume mais crítico penaliza.
  • Saturação de conexões — sem equivalente no SQL Server. 80% de max_connections desconta 10 pts; 95% desconta 20 pts — esgotar as conexões derruba a aplicação inteira.
  • Idade de XID (risco de wraparound) — sem equivalente no SQL Server, e o fator de maior peso do perfil: 75% de autovacuum_freeze_max_age desconta 15 pts; 90% desconta 30 pts. Chegar ao wraparound põe o cluster em somente-leitura.
  • Arquivamento de WAL falhando — ocupa o lugar do crescimento súbito de log: qualquer falha do archiver desconta 20 pts.
  • Lag de replicação — acima de 1 GB desconta 10 pts.
  • Autovacuum pendente — uma ou mais tabelas aguardando desconta 5 pts; 10 ou mais tabelas com linhas mortas acumuladas desconta 10 pts.
  • Spill de arquivos temporários — mais de 100 MB no ciclo desconta 5 pts; mais de 1 GB desconta 15 pts.

Quando o Health Score cai 10 ou mais pontos em dois snapshots consecutivos (~10 minutos), o sistema detecta automaticamente um incidente e inicia a análise de causa raiz — nos dois engines.


Análise de Incidentes

A Análise de Incidentes (Root Cause Timeline) é a funcionalidade central do codeDB. Em vez de alertas isolados, ela constrói a narrativa completa de um incidente: o que aconteceu, em que sequência, qual a causa provável e o que fazer.

Acesse em Aba 7 — Análise de Incidentes dentro do painel de uma instância, ou em Incidentes no menu lateral para a visão global de todas as instâncias.

Como incidentes são detectados e encerrados

EventoCritério
Abertura de incidenteHealth Score cai ≥ 10 pontos em 2 snapshots consecutivos (~10 min)
Encerramento de incidenteScore sobe de forma estável por 3 snapshots consecutivos e fica ≥ 5 pts acima do mínimo atingido

Fechamento refinado: oscilações pequenas (≤ 4 pontos) no Health Score não reiniciam o contador de estabilidade. Apenas quedas de ≥ 5 pontos recomeçam a contagem — evitando que ruído de coleta prolongue artificialmente um incidente que já foi resolvido.

Tipos de evento na timeline

SeveridadeTipos de evento
Críticohealth_drop, ple_critical, tempdb_critical, alert_fired (crítico)
Atençãople_warning, memory_pressure, blocking_start, wait_spike, tempdb_high, job_failure, deadlock, io_latency_high
Infohealth_recover, blocking_end, alert_resolved

Agrupamento por hora: quando um incidente tem mais de 20 eventos, a timeline os agrupa automaticamente em blocos de 1 hora — por exemplo: "09/06 09:00–10:00 — 12 críticos, 8 atenção". Cada grupo é colapsável, permitindo navegar rapidamente em incidentes de longa duração sem perder o detalhe de nenhum evento.

Os 6 tipos de causa raiz

O codeDB classifica automaticamente a causa raiz entre 6 tipos. Expanda cada um para ver os sinais que confirmam o diagnóstico e as ações recomendadas.

Sinais: PLE abaixo de 300s, Buffer Cache Hit Ratio abaixo de 95%, wait type RESOURCE_SEMAPHORE com alto percentual.

Ações: Verificar MAX SERVER MEMORY; identificar queries com Memory Grant excessivo; verificar outros processos consumindo RAM no servidor.

Sinais: Latência de leitura ou escrita acima de 50ms em arquivos de dados, wait types PAGEIOLATCH_SH, PAGEIOLATCH_EX ou WRITELOG dominantes.

Ações: Verificar fragmentação de índices; verificar VLFs no log; avaliar migração para SSD; separar arquivos de dados e log em discos diferentes.

Sinais: active_blocks acima de zero por múltiplos snapshots, wait types LCK_M_X, LCK_M_S ou LCK_M_U com alto percentual.

Ações: Identificar o head blocker e a query em execução; verificar transações abertas sem COMMIT; considerar READ COMMITTED SNAPSHOT (RCSI).

Sinais: Wait type SOS_SCHEDULER_YIELD dominante, CXPACKET alto (paralelismo excessivo), muitas sessões com alto consumo de CPU simultâneas.

Ações: Identificar queries com maior consumo de CPU; ajustar MAXDOP e Cost Threshold for Parallelism; verificar estatísticas desatualizadas.

Sinais: usage_pct acima de 85% (atenção) ou 95% (crítico), wait types PAGELATCH_UP ou PAGELATCH_EX no TempDB.

Ações: Identificar sessões que mais consomem TempDB (Aba 2); adicionar mais arquivos de dados ao TempDB; verificar cursors e tabelas temporárias desnecessários.

Sinais: failed_jobs ≥ 1.

Ações: Verificar histórico do job no SQL Agent para o erro exato; verificar permissões da conta do job; jobs de manutenção com falha causam degradação progressiva.

Nível de confiança da causa raiz

ConfiançaO que significa
AltaMúltiplos indicadores convergindo — diagnóstico confiável
MédiaAlguns indicadores presentes — investigar, mas considerar causas alternativas
BaixaPoucos dados disponíveis — incidente breve ou problema menos comum

Padrões Recorrentes e Correlações

Padrões Recorrentes

Disponível em Incidentes → aba Padrões Recorrentes. O codeDB analisa os últimos 90 dias e identifica o mesmo tipo de problema acontecendo no mesmo dia da semana e no mesmo bloco de horário — sinal de uma causa sistêmica recorrente (ex: job de manutenção semanal, pico de carga diário).

CampoSignificado
DiaDia da semana em que o padrão ocorre
HorárioBloco de 4 horas (ex: 08–12h)
Causa RaizTipo de problema que se repete
OcorrênciasNúmero de vezes detectado no período analisado (mín. 2)
Queda MédiaMédia de pontos de Health Score perdidos por incidente
Duração MédiaMédia de minutos de duração do incidente

Exemplo: Segunda | 00–04h | Pressão de Memória | 4 ocorrências | −18 pts | 45 min — toda segunda de madrugada há pressão de memória por ~45 min. Hipótese provável: job de rebuild de índices consumindo muita memória. Ação: revisar o job ou ajustar MAX MEMORY GRANT.

Correlações entre Instâncias

Disponível em Incidentes → aba Correlações. Quando múltiplas instâncias do mesmo ambiente sofrem incidentes em um intervalo de 15 minutos entre si, o codeDB as agrupa como incidentes correlacionados — sinal de uma causa compartilhada de infraestrutura.

CenárioCausa provável
3 instâncias com gargalo de I/O simultâneoStorage compartilhado (SAN/NAS) com problema
2 instâncias com pressão de memória ao mesmo tempoMemória insuficiente no hypervisor (VMs)
Múltiplas instâncias com jobs falhandoSQL Agent ou conta de serviço com problema
Incidentes em todas as instâncias de um ambienteProblema de rede ou no host físico

API Pública

O codeDB disponibiliza uma API REST pública que permite integrar dados de incidentes e status das instâncias com ferramentas externas como Zabbix, Microsoft Teams, Grafana, ServiceNow e qualquer sistema que faça chamadas HTTP.

Criando uma API Key

1

Acesse Configurações no menu lateral

Role até a seção API Keys — Integração Pública.

2

Clique em Nova API Key

Informe um nome descritivo (ex: "Zabbix Produção", "Teams NOC").

3

Copie a chave gerada

A chave tem o formato cdb_v1_<48 caracteres> e é exibida apenas uma vez. Trate-a como uma senha — use variáveis de ambiente, nunca inclua em código-fonte ou repositórios Git.

Endpoints disponíveis

EndpointDescriçãoParâmetros
GET /api/v1/incidentsLista incidentes detectados e classificadosdays (1–90), instance_id, environment_id
GET /api/v1/instancesLista instâncias monitoradas com status básico—

Exemplos de uso

curl (Linux/macOS):

# Listar incidentes das últimas 24h
curl -s -H "X-API-Key: cdb_v1_SUA_CHAVE" \
  "https://<api>/api/v1/incidents?days=1"

# Verificar instâncias ativas
curl -s -H "X-API-Key: cdb_v1_SUA_CHAVE" \
  "https://<api>/api/v1/instances"

PowerShell:

$headers = @{ "X-API-Key" = "cdb_v1_SUA_CHAVE" }
$resp = Invoke-RestMethod -Uri "https://<api>/api/v1/incidents?days=1" -Headers $headers

$ativos = ($resp.incidents | Where-Object { $_.status -eq "active" }).Count
Write-Host "Incidentes ativos: $ativos"

$resp.incidents | Where-Object { $_.status -eq "active" } | ForEach-Object {
  $rc = $_.root_cause
  Write-Warning "$($rc.label) | Queda: $($_.max_health_drop) pts | Conf: $($rc.confidence)"
}

Integração com Zabbix (External Check):

Crie o script /usr/lib/zabbix/externalscripts/check_codedb.py no servidor Zabbix, depois crie itens e triggers com base nos valores retornados:

#!/usr/bin/env python3
# check_codedb.py <metric>
# Métricas: active_incidents | incidents_today | max_health_drop | agent_offline_count
import sys, json, urllib.request

API_BASE = "https://<api>"
API_KEY  = "cdb_v1_SUA_CHAVE"

def api_get(path):
    req = urllib.request.Request(f"{API_BASE}{path}", headers={"X-API-Key": API_KEY})
    with urllib.request.urlopen(req, timeout=10) as r:
        return json.loads(r.read())

metric = sys.argv[1] if len(sys.argv) > 1 else "active_incidents"
data = api_get("/api/v1/incidents?days=1")
incidents = data.get("incidents", [])

if metric == "active_incidents":
    print(sum(1 for i in incidents if i["status"] == "active"))
elif metric == "incidents_today":
    print(len(incidents))
elif metric == "max_health_drop":
    drops = [i["max_health_drop"] for i in incidents if i["max_health_drop"]]
    print(max(drops) if drops else 0)

No Zabbix, crie um item do tipo External check com chave check_codedb.py[active_incidents] e uma trigger: last(...)>0 para alertar quando houver incidentes ativos.

Integração com Microsoft Teams:

Configure um Incoming Webhook no canal do Teams e use o script abaixo agendado via cron ou Task Scheduler (a cada 5 min):

#!/usr/bin/env python3
import json, urllib.request
from datetime import datetime, timezone

API_BASE      = "https://<api>"
API_KEY       = "cdb_v1_SUA_CHAVE"
TEAMS_WEBHOOK = "https://outlook.office.com/webhook/SEU_WEBHOOK"

def api_get(path):
    req = urllib.request.Request(f"{API_BASE}{path}", headers={"X-API-Key": API_KEY})
    with urllib.request.urlopen(req, timeout=10) as r:
        return json.loads(r.read())

data = api_get("/api/v1/incidents?days=1")
for inc in data["incidents"]:
    if inc["status"] != "active":
        continue
    rc = inc.get("root_cause") or {}
    card = {
        "@type": "MessageCard",
        "themeColor": "FF0000",
        "summary": f"codeDB: {rc.get('label', 'Incidente')}",
        "sections": [{
            "activityTitle": f"Incidente Detectado — {rc.get('label','')}",
            "activitySubtitle": f"Confiança: {rc.get('confidence','')} | Queda: -{inc['max_health_drop']} pts",
            "facts": [{"name": "Recomendação", "value": rc.get("recommendation", "")}]
        }]
    }
    req = urllib.request.Request(
        TEAMS_WEBHOOK, json.dumps(card).encode(), {"Content-Type": "application/json"}
    )
    urllib.request.urlopen(req, timeout=10)

Membros e Colaboração

O codeDB suporta múltiplos usuários por workspace (tenant). O owner pode convidar colegas para colaborar, atribuindo a cada um uma role com nível de acesso específico. Todos os membros compartilham os mesmos ambientes, instâncias e dados de monitoramento da organização.

Roles disponíveis

RolePermissõesQuem pode atribuir
Proprietário (owner)Acesso total: gerenciar membros, ambientes, instâncias, cobrança e cancelamentoApenas outros owners
Administrador (admin)Criar/editar/deletar ambientes, convidar membros, gerar tokens de agenteOwner ou admin
Analista (analyst)Acesso de leitura ao dashboard, alertas, incidentes e relatórios. Não pode alterar configurações.Owner ou admin

Convidar um membro

1

Acesse Membros no menu lateral

Clique em Membros no sidebar do dashboard.

2

Clique em Convidar membro

Informe o e-mail do colega e escolha a role desejada (Analista é o padrão recomendado para quem só precisa visualizar dados).

3

Convite enviado por e-mail

O codeDB envia um e-mail com um link de convite válido por 7 dias. O link leva para a página de aceite em /invite/{token}.

4

Convidado aceita o convite

Se já tiver conta, faz login e clica em "Aceitar convite". Se não tiver conta, cria uma — o sistema detecta o convite pendente e vincula o novo usuário ao workspace automaticamente, sem criar um novo tenant em separado.

Fluxo de aceite detalhado

A página de aceite de convite (/invite/{token}) funciona em três cenários:

  • Usuário já logado com o e-mail correto: botão "Aceitar convite" visível — um clique vincula ao workspace e redireciona ao dashboard.
  • Usuário não logado: dois botões — "Entrar na minha conta" (vai para login com ?redirect=/invite/{token}) e "Criar conta nova" (vai para registro com e-mail pré-preenchido).
  • Usuário logado com e-mail diferente: alerta informando que o convite é para outro e-mail — é necessário sair e entrar com o e-mail correto.

Usuário com múltiplos workspaces

Um mesmo e-mail pode pertencer a mais de um workspace (ex: funcionário que monitora infraestrutura de dois clientes diferentes). Neste caso, ao fazer login, o codeDB exibe um seletor de workspace. O usuário escolhe em qual workspace quer entrar e pode trocar a qualquer momento refazendo o login.

Acesso automático via Microsoft Entra ID (SSO organizacional)

Alternativa ao convite individual: se sua empresa usa Microsoft 365 / Azure AD, o owner do workspace pode vincular o diretório da organização ao codeDB. A partir daí, qualquer colaborador com uma conta daquele diretório entra automaticamente no workspace ao clicar em Continuar com Microsoft — sem precisar de um convite individual por e-mail.

1

Acesse Membros

Na tela Membros, o card Acesso via Microsoft Entra (SSO) mostra o status da conexão com o diretório.

2

Conecte o Microsoft Entra

Clique em Conectar Microsoft Entra. A Microsoft solicitará que um Administrador Global do diretório aprove o consentimento — isso comprova que quem está vinculando de fato administra aquela organização.

3

Configure a entrada automática

Escolha se novos colaboradores entram automaticamente (Entrada automática) e qual role recebem por padrão — Analista é o recomendado. Salve.

4

Colaboradores entram sozinhos

A partir daí, qualquer pessoa com e-mail daquele diretório que clicar em Continuar com Microsoft entra direto no workspace, sem convite — respeitando o limite de membros do seu plano. Se os membros estiverem esgotados, o colaborador vê um aviso pedindo para um administrador liberar um membro ou fazer upgrade do plano.

O owner pode desvincular o diretório a qualquer momento — membros que já entraram continuam com acesso normalmente, só param de entrar automaticamente novos colaboradores.

Gerenciar membros existentes

Na tela Membros, o owner pode:

  • Alterar a role de qualquer membro (ícone de lápis)
  • Remover um membro — o usuário perde o acesso imediatamente
  • Cancelar um convite pendente — o link de convite é invalidado

O owner não pode remover a si mesmo nem alterar sua própria role. Convites são exibidos com o badge Aguardando aceite enquanto pendentes.

Limite de membros por plano

O número máximo de membros (incluindo convites pendentes) depende do plano contratado. Ao atingir o limite, novos convites são bloqueados com sugestão de upgrade. Administradores codeDB podem conceder limites customizados via painel administrativo.


Configurando Alertas

As regras de alerta são configuradas em Configurações → Regras de Alerta. Quando uma condição é atingida, um e-mail é enviado para os membros do ambiente.

Tipos de regras disponíveis

TipoDispara quandoExemplo de threshold
TempDB % de usoUso total do TempDB ≥ threshold (%)80%
Sessão longaQuery em execução ≥ threshold (minutos)30 minutos
TempDB por sessãoUso de TempDB de uma sessão ≥ threshold (MB)500 MB
Jobs com falhaNúmero de SQL Agent Jobs com falha ≥ threshold1
PLE baixoPage Life Expectancy < threshold (segundos)300 s
BloqueiosSessões bloqueadas ≥ threshold1
Crescimento de logArquivo .ldf de qualquer banco cresce ≥ threshold em um ciclo (~5 min)500 MB
Espaço em discoQualquer volume de disco com espaço livre < threshold15%

Supressão de alertas

Para evitar spam de e-mail em situações persistentes, o codeDB aplica supressão automática: após o primeiro disparo, novos e-mails são enviados somente após um número configurável de ciclos de coleta consecutivos sem melhora.


Planos e Assinatura

Trial gratuito

Todo novo cadastro recebe 30 dias de trial gratuito com acesso completo ao produto (equivalente ao plano Business) — sem cartão de crédito, sem compromisso. Ao final do trial, escolha um plano para continuar.

Planos disponíveis

PlanoMensalAnualAmbientesInstânciasRetençãoColeta
StarterR$ 249R$ 2.4901514 diasa cada 5 min
ProfessionalR$ 549R$ 5.49052045 diasa cada 2 min
BusinessR$ 1.190R$ 11.900154090 diasa cada 1 min
MSP / White LabelPor instânciaAnualIlimitadosIlimitadas90 diasa cada 1 min

Todos os planos pagos oferecem desconto na cobrança anual. Quanto menor o intervalo de coleta, mais cedo os problemas aparecem no dashboard e nos alertas.

Recursos por plano

Monitoramento base — disponível em todos os planos:

RecursoStarterProfessionalBusiness
TempDB (tamanho, sessions, version store)✓✓✓
Performance (PLE, Buffer Cache Hit, Uptime, Memória)✓✓✓
Top Waits✓✓✓
Jobs e Backups✓✓✓
Sessões e Bloqueios ativos✓✓✓
Alertas por e-mail✓✓✓
Agente Windows (on-premises)✓✓✓
On-Premises, Azure SQL Database e AWS RDS✓✓✓

Inteligência avançada — Professional e Business:

RecursoStarterProfessionalBusiness
Query Intelligence (8 regras, DDL de índice)—✓✓
Tabelas e Índices (inventário diário, fragmentação, uso)—✓✓
Detecção de anomalias (Z-score, baseline)—✓✓
Insights Inteligentes—✓✓

Enterprise — exclusivo Business:

RecursoStarterProfessionalBusiness
Root Cause Timeline (correlação de incidentes)——✓
Cloud Intelligence (métricas nativas Azure/AWS)——✓
Alertas via Slack e Webhook——✓
Intervalo de coleta de 1 minuto——✓

Limites por plano:

LimiteStarterProfessionalBusiness
Ambientes1515
Instâncias SQL Server52040
Membros da equipe210Ilimitados
Retenção de histórico14 dias45 dias90 dias
Intervalo de coleta5 min2 min1 min

Recursos fora do seu plano aparecem no portal com um cadeado — ao clicar, você vê qual plano os libera. O gerenciamento de pagamento, troca de plano e histórico de faturas está em Cobrança no portal.

O que o agente coleta por plano

Base (todos os planos): uso e contenção de TempDB, indicadores de performance (Page Life Expectancy, Buffer Cache Hit Ratio, uptime, pressão de memória), Top Waits acumulados, estado de SQL Agent Jobs e Backups, além de sessões e bloqueios ativos com o texto da query em execução. Todo o monitoramento base roda via DMVs, com custo desprezível.

Professional e Business: a coleta passa a incluir o Query Intelligence (8 regras que identificam queries pesadas e geram DDL de criação de índice automaticamente), a detecção de anomalias por baseline histórico (Z-score sobre as métricas coletadas) e os Insights Inteligentes (recomendações automáticas derivadas dos snapshots).

Business (Enterprise): adiciona o Root Cause Timeline (correlação de incidentes ao longo do tempo), o Cloud Intelligence (métricas nativas de Azure SQL Database e AWS RDS) e os canais de alerta via Slack e Webhook, com intervalo de coleta reduzido para 1 minuto.

O que acontece se eu mudar de plano?

Upgrade (plano maior): vale na hora. Novos recursos, abas e limites são liberados imediatamente.

Downgrade (plano menor): se o seu uso atual couber no novo plano, a mudança é aplicada na hora. Se você tiver mais ambientes, instâncias ou membros do que o novo plano permite, a troca não é aplicada de imediato: você ganha 30 dias para escolher o que manter. Um aviso aparece no topo do dashboard com o botão “Resolver conflito”.

Os itens que você não mantiver ficam suspensos — param de coletar dados novos, mas nada é excluído. Todo o histórico é preservado e pode ser reativado se você voltar a um plano superior em até 90 dias. Se você não resolver dentro dos 30 dias, mantemos automaticamente os itens mais antigos dentro do limite e suspendemos o excedente, avisando por e-mail.

Cancelamento e dados

Você pode cancelar a assinatura a qualquer momento pelo portal. Após o cancelamento, os dados ficam retidos por 30 dias. Durante esse período é possível reativar a assinatura sem perda de histórico. Após 30 dias, os dados são removidos permanentemente.


Subdomínio personalizado

Empresas no plano MSP podem ter um endereço próprio para acessar o codeDB — por exemplo suaempresa.codedb.com.br — exibindo sua logo e sua marca já na tela de entrada, antes do login.

Como ativar

1

Abra Identidade visual

No menu lateral do painel MSP, acesse Identidade visual e role até o card Subdomínio personalizado.

2

Escolha o nome

Use apenas letras minúsculas, números e hífen, com no mínimo 3 caracteres. O endereço final aparece na tela enquanto você digita. O card também mostra quantas vagas de subdomínio ainda existem.

3

Clique em Ativar subdomínio

Se não houver vaga disponível no momento, a solicitação ainda pode ser enviada — ela entra na fila e é ativada assim que uma vaga for liberada.

Quanto tempo leva

A ativação não é instantânea: cada pedido passa por verificação e pela configuração do endereço na infraestrutura, o que costuma levar de alguns minutos a algumas horas. Não é preciso aguardar na tela — você recebe um e-mail quando o endereço estiver no ar.

O que significa cada status

StatusO que está acontecendoO que você faz
Em análiseRecebemos o pedido e ele está na fila.Nada — avisaremos por e-mail.
ProvisionandoO endereço está sendo publicado e validado.Nada; leva alguns minutos.
AtivoO endereço está no ar.Compartilhe o link com seus clientes.
FalhouNão foi possível ativar; o motivo aparece na tela.Corrija e use Tentar novamente.
Remoção em andamentoA remoção pedida está sendo processada.Nada — avisaremos ao concluir.

Remover o subdomínio

Com o subdomínio ativo, use Remover subdomínio e confirme. O endereço deixa de funcionar e quem tentar acessar por ele não conseguirá entrar — oriente seus clientes a usarem app.codedb.com.br antes de remover. Para trocar de nome, remova o atual e solicite o novo.

Os dados, logins e permissões são exatamente os mesmos em qualquer endereço — muda apenas a URL e a marca exibida. Domínio próprio da sua empresa (como monitor.suaempresa.com.br) ainda não é suportado.


Regras de Uso

O que o agente coleta

O agente coleta exclusivamente métricas de desempenho e estrutura do SQL Server via DMVs (Dynamic Management Views). Não são coletados dados de negócio armazenados nas tabelas do banco (registros de clientes, transações, etc.).

Dados coletados: uso de TempDB, sessões ativas (com texto da query em execução), estatísticas de I/O, memória, waits, SQL Agent Jobs, detalhes de conexão e estatísticas de queries (query plan hash + SQL text resumido).

Armazenamento e retenção

Os snapshots são armazenados em banco de dados PostgreSQL hospedado na nuvem e retidos pelo período definido no plano contratado (14, 45 ou 90 dias). Após esse período os dados são removidos automaticamente.

Privacidade e LGPD

Os dados de identificação pessoal coletados no cadastro (nome, e-mail, CPF/CNPJ, empresa) são usados exclusivamente para gestão da conta e faturamento. O codeDB não compartilha dados pessoais com terceiros, exceto processadores de pagamento (Stripe).

Para exercer seus direitos de titularidade (LGPD Art. 18): exportação de dados em Configurações → Exportar dados; exclusão de conta em Perfil → Excluir minha conta. Recomendamos ativar o MFA (Perfil → Segurança) para proteção adicional. Consulte a Política de Privacidade para detalhes completos.

Responsabilidades do usuário

  • Manter o agente atualizado para a versão atual recomendada
  • Guardar com segurança o token de agente (ele tem acesso de escrita aos snapshots)
  • Não utilizar a plataforma para monitorar sistemas sem autorização do proprietário
  • Não fazer engenharia reversa do agente ou da API
  • Respeitar os limites de instâncias e ambientes do plano contratado

Disponibilidade e Cobertura de Monitoramento

O codeDB calcula a disponibilidade dos seus ambientes de forma independente da sua própria infraestrutura. Uma eventual indisponibilidade da plataforma codeDB — por exemplo, o banco de dados do SaaS offline — nunca reduz a disponibilidade do seu SQL Server.

As duas métricas

MétricaO que medeImpactado por queda do codeDB?
Disponibilidade (%)Percentual de tempo com SQL Server comprovadamente disponível, sobre o tempo observadoNão
Cobertura de Monitoramento (%)Percentual do tempo total em que o codeDB conseguiu observar o ambienteSim — reduz, mas não penaliza o SLA

Como a medição é feita (agent 1.19.2+)

A partir do agent 1.19.2, disponibilidade é medida, não estimada. O agente executa uma sonda a cada 15 segundos — um SELECT 1 em conexão dedicada, com timeout curto — e grava o resultado localmente. O envio acontece no ciclo normal de coleta (a cada 5 minutos por padrão), mas a medição não para durante o envio: se parasse, o monitoramento ficaria cego justamente quando a rede está ruim.

A sonda usa conexão dedicada de propósito. Uma conexão reaproveitada de pool poderia “passar” mesmo com o caminho de rede já indisponível, mascarando a falha.

O que acontece se o codeDB ficar inacessível

As medições continuam sendo gravadas em disco no servidor do agente e são enviadas quando a comunicação volta. Nenhuma aferição é perdida — a cobertura do período não fica com buraco só porque a plataforma esteve fora. O arquivo local só é apagado após confirmação de recebimento, e um identificador de lote impede que um reenvio conte o mesmo downtime duas vezes.

Classificação do erro — instância fora vs. rede instável

Quando a sonda falha, o codeDB não registra apenas “falhou”: ele classifica a causa e cruza com o horário de início da instância para distinguir dois cenários que exigem ações completamente diferentes.

SituaçãoEvidênciaCausa registrada
Instância reiniciouSondas falharam E o horário de início do SQL Server avançouReinicialização da Instância
Rede instávelSondas expiraram por timeout, mas o horário de início não mudou — o SQL nunca caiuPerda de Conectividade
Serviço parado ou host foraConexão recusada, sem reinicialização detectadaInstância Inacessível
Credencial incorretaO servidor respondeu e recusou o loginNão é indisponibilidade — é configuração

Essa distinção importa: uma queda de conectividade sem reinicialização indica problema de infraestrutura de rede, não do banco de dados — e é diagnóstico que ferramentas que só olham “respondeu / não respondeu” não conseguem entregar.

Onde ver

O gráfico Disponibilidade medida fica no Dashboard Gerencial, com faixas de 24h (ponto por hora), 7, 30 e 90 dias (ponto por dia). Mostra a linha do ambiente e permite abrir uma linha por instância. Períodos sem medição aparecem como lacuna na linha, nunca como 100% — ausência de dado não é evidência de disponibilidade. Quedas sustentadas também viram incidentes com causa raiz na tela de Incidentes.

O percentual é truncado, nunca arredondado para cima: 99,98% aparece como 99,9%. Arredondar mostraria 100% num período que teve downtime real.

Modelo de estados (UP / DOWN / UNKNOWN)

Independente das sondas, o codeDB também classifica o intervalo entre snapshots de métricas em cinco estados. Esse modelo alimenta os cards de Disponibilidade e Cobertura, e é o que responde por instalações com agente anterior à 1.19.2, onde ainda não há sondagem:

EstadoSignificadoImpacta disponibilidade?
UPSnapshot recebido dentro do intervalo esperado (≤ 7,5 min). SQL Server respondendo.Não — estado normal
DOWNReinicialização do SQL Server detectada via instance_start_time. Indisponibilidade comprovada.Sim — conta como downtime real
UNKNOWNGap sem evidência de falha: agente parado, rede instável, causa desconhecida.Não — excluído do denominador
MAINTENANCEPeríodo coberto por uma janela de manutenção planejada pelo tenant.Não — excluído do cálculo
MONITORING_GAPGap durante indisponibilidade registrada da plataforma codeDB.Não — excluído do cálculo

Como a reinicialização é detectada

O agente envia em cada snapshot o valor de instance_start_time — o timestamp de quando o SQL Server foi iniciado. Quando o snapshot seguinte chega com um instance_start_time mais recente, o sistema confirma que houve reinicialização e registra o período como DOWN. Ausência de dados nunca é suficiente para decrementar o SLA.

Exemplo prático — 30 dias

SituaçãoDuraçãoEstado
SQL Server respondendo normalmente43.170 minUP
Reinicialização do SQL Server15 minDOWN
codeDB offline (manutenção da plataforma)240 minMONITORING_GAP
Agente parado (update de servidor)60 minUNKNOWN
Manutenção planejada (janela configurada)120 minMAINTENANCE

Resultado: Disponibilidade = 99,97% · Cobertura = 98,61%. O codeDB foi incapaz de observar o ambiente em 1,39% do tempo — mas isso não penaliza o SLA do cliente.


Janelas de Manutenção

As Janelas de Manutenção permitem registrar antecipadamente períodos em que um ambiente ou instância ficará offline de forma planejada — patches, backups, restart agendado, upgrades de SO, entre outros.

O que acontece durante uma janela

ComportamentoDurante a janela
AlertasSuprimidos automaticamente — nenhum e-mail ou notificação é enviado
DisponibilidadePeríodo excluído do cálculo (estado MAINTENANCE)
Health Score médioPeríodo excluído das médias e histórico
Relatório SemanalPeríodo reportado como manutenção, separado do downtime real

Como criar uma janela

1

Acesse Configurações → Manutenção

No menu lateral, expanda Configurações e clique em Manutenção.

2

Clique em Nova Janela

Preencha título, data/hora de início e fim, ambiente ou instância (opcional) e motivo.

3

Configure os comportamentos

Ative ou desative: suprimir alertas, excluir de disponibilidade e excluir de health score. Por padrão, todos os três estão ativados.

4

Clique em Criar Janela

A janela entra em vigor imediatamente. Janelas históricas (períodos passados) também podem ser cadastradas — o cálculo de disponibilidade é corrigido na próxima consulta ao dashboard.

Boas práticas

  • Crie a janela antes da manutenção para suprimir alertas automaticamente
  • Adicione margem de 30 min antes e depois do horário previsto
  • Use o campo Motivo para facilitar auditoria e contexto no relatório semanal
  • Para remover uma janela histórica, os períodos voltam a ser calculados normalmente na próxima consulta

Apêndice Técnico

Esta seção é destinada a administradores de sistemas e desenvolvedores que precisam de detalhes sobre arquitetura, configuração avançada e integração.

O codeDB é composto por três serviços independentes, cada um com stack e hospedagem próprios:

ServiçoStackHospedagem
codedb-agentPython 3.11 + pyodbc (SQL Server) / psycopg (PostgreSQL), empacotado com PyInstallerServidor do cliente — Windows (.exe), Linux (.deb/tarball) ou container
codedb-saas (API)FastAPI + SQLAlchemy async + PostgreSQL + RedisAzure Container Apps
codedb-portal (Web)Next.js 15 + MUI + TanStack Query + RechartsAzure Static Web App

A API expõe endpoints REST protegidos por JWT. O agente autentica via token Bearer específico por ambiente. O portal usa NextAuth.js com access token (15 min) e refresh token (7 dias com rotação automática) em cookies httponly.

Multi-tenancy: todas as tabelas possuem coluna tenant_id. O contexto do tenant é injetado via dependência FastAPI em todas as rotas autenticadas, garantindo isolamento de dados por organização.

O arquivo Config.env contém todas as configurações do agente. No Windows fica em C:\codeDB-Agent\Config.env; no Linux, em /etc/codedb-agent/Config.env; no container, não existe arquivo — as mesmas chaves viram variáveis de ambiente do docker run. Senhas são armazenadas com prefixo ENC: (criptografia Fernet/AES-128) — cifradas automaticamente na primeira execução, em qualquer plataforma.

SQL Server

VariávelTipoExemplo / Padrão
AGENT_TOKENstring (obrigatório)gerado no portal
CODEDB_API_URLURLhttps://api.codedb.com.br
DB_SERVERstringSERVIDOR\INSTANCIA
DB_PORTint1433
DB_DRIVERstringODBC Driver 17 for SQL Server
DB_WINDOWS_AUTHbooltrue
DB_USERstringsa (se SQL Auth)
DB_PASSWORDstring (criptografada)ENC:gAAAAA...
COLLECTION_INTERVAL_SECint300 (5 minutos)
PROBE_ENABLEDbooltrue — sondagem de disponibilidade
PROBE_INTERVAL_SECint15 — intervalo entre sondas
PROBE_TIMEOUT_SECint5 — timeout de cada sonda
LOG_LEVELstringINFO

PostgreSQL

Válido no Windows, no Linux e no container. Sem DB_ENGINE, o agente assume SQL Server — por isso essa variável é obrigatória para Postgres.

VariávelTipoExemplo / Padrão
DB_ENGINEstring (obrigatório)postgres
DB_SERVERstringhost ou endpoint do cluster
DB_PORTint5432
DB_DATABASEstringpostgres
DB_USERNAMEstringcodedb_monitor
DB_PASSWORDstring (criptografada)ENC:gAAAAA...
DB_SSLMODEstringrequire (recomendado em gerenciado)

No container, os segredos entram por arquivo em vez de variável direta: AGENT_TOKEN_FILE e DB_PASSWORD_FILE apontam para um caminho montado (ex.: /run/secrets/db_password) — uma variável de ambiente comum apareceria em docker inspect para qualquer um com acesso ao host.

Para múltiplas instâncias, adicione prefixo INSTANCE_2_, INSTANCE_3_, etc. nas variáveis de cada instância adicional — o mesmo esquema funciona em Windows e Linux.

Execute os scripts abaixo no SQL Server Management Studio (ou sqlcmd) para conceder as permissões mínimas necessárias ao login do agente:

-- 1. Permissão para consultar as DMVs de monitoramento
USE master;
GRANT VIEW SERVER STATE TO [seu_login_aqui];

-- 2. Permissão para leitura do status dos SQL Agent Jobs
USE msdb;
ALTER ROLE SQLAgentOperatorRole ADD MEMBER [seu_login_aqui];

-- 3. (Opcional) Se usar banco DBAMonitor criado pelo instalador
USE DBAMonitor;
ALTER ROLE db_datareader ADD MEMBER [seu_login_aqui];
ALTER ROLE db_datawriter ADD MEMBER [seu_login_aqui];

Substitua [seu_login_aqui] pelo login SQL criado para o agente. O agente também suporta Autenticação do Windows — nesse caso, a conta de serviço Windows precisa das mesmas permissões acima.

O mesmo agente monitora PostgreSQL. Um ambiente do portal tem um engine fixo (SQL Server ou PostgreSQL), escolhido na criação. Uma instância é um cluster: os databases dele aparecem como dimensão, como no SQL Server.

Usuário de monitoração (privilégio mínimo)

Nunca use superusuário. O papel pg_monitor (PostgreSQL 10+) já inclui pg_read_all_stats, pg_read_all_settings e pg_stat_scan_tables, que é tudo o que o agente lê.

CREATE ROLE codedb_monitor LOGIN PASSWORD '<senha forte>';
GRANT pg_monitor TO codedb_monitor;
GRANT CONNECT ON DATABASE postgres TO codedb_monitor;
-- repita o GRANT CONNECT para cada database que deve aparecer no inventário
HospedagemQuem concede o pg_monitor
Servidor próprio (on-premises / VM)um superusuário
Amazon RDS / Aurora PostgreSQLo usuário master (papel rds_superuser)
Azure Database for PostgreSQL — Flexible Servero administrador do servidor (papel azure_pg_admin)
Google Cloud SQL for PostgreSQLum usuário com cloudsqlsuperuser

Extensões e o que cada uma habilita

ExtensãoHabilitaSem ela
pg_stat_statementsInteligência de Consultas (top consultas, regras, tendências)a aba mostra “indisponível — requer pg_stat_statements” com o passo a passo
pgstattuplebloat MEDIDO de tabelas e índices (Tabelas e Índices)bloat de tabela ESTIMADO (com selo) e bloat de índice em branco
pg_cronnada, por enquanto — o histórico de jobs do pg_cron ainda não é coletadojobs indisponíveis — o PostgreSQL não tem agendador nativo

pg_stat_statements exige entrar em shared_preload_libraries e reiniciar o servidor; depois, CREATE EXTENSION pg_stat_statements; em cada database. Em RDS, Azure e Cloud SQL o preload é um parâmetro do servidor no console.

Onde instalar o agente

No Windows, o mesmo instalador de sempre detecta pelo token que o ambiente é PostgreSQL e troca os campos de conexão. No Linux, use o pacote .deb ou o tarball; em ambiente já containerizado, use a imagem — os três formatos ficam em Configurações → Download do Agente, com o passo a passo completo na seção Instalação do Agente. Para PostgreSQL gerenciado (RDS, Aurora, Azure Flexible, Cloud SQL), o agente roda em qualquer máquina que alcance o banco — Windows, Linux ou container — e aí não há métricas de CPU, memória e disco do servidor (o portal explica isso na Visão Geral).

“Por que a aba X está indisponível?”

O que o portal mostraCausaComo resolver
Inteligência de Consultas indisponívelpg_stat_statements não instalado no databasepreload + CREATE EXTENSION (acima)
Bloat “estimado” ou em brancosem pgstattuple no database, ou sem pg_monitorCREATE EXTENSION pgstattuple; GRANT pg_monitor
Sem CPU, memória e disco do servidorhospedagem gerenciada, conexão remota ou containerinstale o agente no próprio servidor do PostgreSQL (não se aplica ao gerenciado)
Sessões de outros usuários não aparecemusuário sem pg_monitorGRANT pg_monitor TO codedb_monitor
Histórico de backup indisponívelsem ferramenta de base backup configuradaBACKUP_SOURCE=pgbackrest no Config.env (gerenciado: o backup é do provedor)
Tabelas e Índices vaziao inventário roda de madrugada, uma vez por diaaguarde a primeira janela (padrão 03h, ajustável no ambiente)

Em banco gerenciado — PostgreSQL (RDS, Aurora, Azure Flexible Server) e SQL Server (Azure SQL Database, Azure SQL Managed Instance, RDS for SQL Server) — o provedor não dá acesso ao sistema operacional. Com este recurso, o agente lê CPU, memória, disco, IOPS e latência do Amazon CloudWatch ou do Azure Monitor e o portal mostra esses números, com o rótulo “Fonte: CloudWatch” ou “Fonte: Azure Monitor”. É opcional e vem desligado: nada muda enquanto você não ativar. Exige agente 1.25.0 ou superior.

Como ativar (Config.env)

CLOUD_METRICS=aws            # off | aws | azure
# Só se o recurso não for descoberto pelo DB_SERVER (endpoint de cluster Aurora,
# endpoint fora do padrão). AWS: identificador da instância ou ARN; Azure: resource ID completo.
CLOUD_RESOURCE_ID=
# Por instância adicional: INSTANCE_N_CLOUD_METRICS e INSTANCE_N_CLOUD_RESOURCE_ID

No container, as mesmas chaves valem como variáveis de ambiente (e como CHAVE_FILE apontando para um arquivo de segredo).

Autenticação: identidade da máquina primeiro

Por padrão o agente usa a identidade da própria máquina: IAM role (EC2/ECS) na AWS ou managed identity no Azure — sem guardar segredo no servidor. Chaves só como alternativa, quando o agente roda fora da nuvem; elas são cifradas na primeira execução, como a senha do banco:

CLOUD_AWS_ACCESS_KEY_ID=
CLOUD_AWS_SECRET_ACCESS_KEY=
CLOUD_AZURE_TENANT_ID=
CLOUD_AZURE_CLIENT_ID=
CLOUD_AZURE_CLIENT_SECRET=

Permissões mínimas (somente leitura)

AWS — política IAM anexada à role ou ao usuário do agente:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["cloudwatch:GetMetricData", "rds:DescribeDBInstances"],
    "Resource": "*"
  }]
}

rds:DescribeDBInstances serve só para o percentual de disco livre; sem ele o restante funciona.

Azure — papel Monitoring Reader no recurso do banco (mais Reader se o recurso for descoberto pelo nome, em vez de informar CLOUD_RESOURCE_ID):

az role assignment create --assignee <client-id-ou-identidade> \
  --role "Monitoring Reader" --scope <resource-id-do-banco>

Custo

Na AWS, o GetMetricData é cobrado na sua conta: uma chamada por ciclo de 5 minutos custa em torno de US$ 0,50 por mês por instância (estimativa, consulte a tabela de preços da AWS). No Azure, consulte a tabela de preços do Azure Monitor.

Efeito no health score e nos alertas

Atenção: ao ligar este recurso, CPU e disco do host passam a contar no health score e nos alertas dos ambientes gerenciados — algo que antes não existia, porque o host era invisível. O score de um ambiente pode, portanto, mudar no dia em que você ativar.

Solução de problemas

O que o portal mostraCausaComo resolver
Ative as métricas de nuvemCLOUD_METRICS está off (ou o agente é anterior à 1.25.0)defina CLOUD_METRICS=aws ou azure e reinicie o agente
Falha de autenticaçãosem IAM role / managed identity, ou chaves de fallback inválidasassocie a identidade à máquina ou revise as chaves do Config.env
Permissão insuficientea identidade não tem a política / o papel mínimoaplique a política IAM ou o papel Monitoring Reader acima
Recurso não encontradoo recurso não foi descoberto pelo DB_SERVERinforme CLOUD_RESOURCE_ID
Erro da API do provedorindisponibilidade ou limite temporárionenhuma ação: o agente tenta de novo no próximo ciclo
SDK ausentebuild do agente sem o SDK do provedoratualize o agente para 1.25.0 ou superior

Se a coleta de nuvem falhar, a coleta do banco continua normalmente; só as métricas de host ficam indisponíveis, com o motivo e o detalhe exibidos na Visão Geral.

Um único agente — Windows, Linux ou container — pode monitorar várias instâncias SQL Server nomeadas do mesmo servidor, ou apontar para servidores/clusters diferentes (cada um com seu próprio Ambiente e token). No PostgreSQL, um cluster já enumera os próprios databases como dimensão da métrica — não precisa de uma instância por database.

No arquivo Config.env (ou nas variáveis de ambiente do container), cada instância adicional usa o prefixo INSTANCE_N_ — o mesmo esquema em Windows e Linux:

# Instância 1 (principal — sem prefixo)
AGENT_TOKEN=token_do_ambiente_producao
DB_SERVER=SERVIDOR\SQL2019
DB_WINDOWS_AUTH=true

# Instância 2
INSTANCE_2_AGENT_TOKEN=token_do_ambiente_homologacao
INSTANCE_2_DB_SERVER=SERVIDOR\SQL2016
INSTANCE_2_DB_WINDOWS_AUTH=false
INSTANCE_2_DB_USER=monitor_user
INSTANCE_2_DB_PASSWORD=ENC:gAAAAA...

O Gerenciador de Instâncias (GUI) cuida automaticamente da geração desses prefixos ao adicionar novas instâncias pela interface.

StatusDescriçãoColeta de dados
trialingPeríodo de trial ativo (30 dias)Ativa
activeAssinatura paga em diaAtiva
past_dueFalha no pagamento — grace period de 10 diasAtiva (temporariamente)
suspendedGrace period expirado — acesso bloqueadoBloqueada
cancelledCancelado — dados retidos por 30 diasBloqueada

Webhooks do Stripe sincronizam automaticamente mudanças de status. O agente verifica o status da licença a cada ciclo de coleta (com cache de 1 hora) — se o tenant estiver suspenso, os snapshots são rejeitados pela API.

O agente verifica periodicamente se há uma versão mais recente disponível via GET /agent/download-info. Quando uma atualização está disponível, um aviso é exibido no portal. O comportamento muda por formato:

FormatoComo atualiza
Windows (.exe)Baixe o novo instalador pelo portal e execute como administrador — ele para o serviço, troca os binários, preserva o Config.env e reinicia
Linux (.deb)sudo apt install ./codedb-agent_<nova versão>_amd64.deb por cima — atualiza o binário e reinicia o systemd, sem perder a configuração
Linux (tarball)Baixe o novo tarball e rode sudo ./codedb-agent/install.sh de novo — o script é idempotente
Ambos (Linux)Também se atualizam sozinhos: o agente confere o SHA-256 publicado, troca o próprio binário e o systemd reinicia — sem ação manual
ContainerNão se atualiza sozinho — troque a tag da imagem e recrie o container com a mesma configuração

A versão mínima suportada é controlada pelo backend. Agentes abaixo da versão mínima têm a coleta bloqueada e exibem alerta no portal para forçar a atualização — em qualquer formato.

A API pública permite integrar dados do codeDB com sistemas externos. Toda chamada requer autenticação via API Key gerada em Configurações → API Keys.

HeaderValor
X-API-Keycdb_v1_<sua-chave> (recomendado)
AuthorizationBearer cdb_v1_<sua-chave> (alternativo)

GET /api/v1/incidents

ParâmetroTipoPadrãoDescrição
daysinteiro7Janela de busca em dias (1–90)
instance_idUUID—Filtrar por instância específica
environment_idUUID—Filtrar por ambiente
// Exemplo de resposta
{
  "incidents": [
    {
      "id": "a1b2c3d4-...",
      "instance_id": "e5f6g7h8-...",
      "started_at": "2026-06-09T22:34:00+00:00",
      "resolved_at": "2026-06-09T23:02:00+00:00",
      "duration_minutes": 28,
      "status": "resolved",          // "active" | "resolved"
      "max_health_drop": 18,
      "root_cause": {
        "type": "memory_pressure",
        "label": "Pressão de Memória",
        "confidence": "high",        // "high" | "medium" | "low"
        "recommendation": "Verificar MAX SERVER MEMORY..."
      }
    }
  ],
  "total": 1,
  "period_days": 7
}

GET /api/v1/instances

// Exemplo de resposta
{
  "instances": [
    {
      "id": "e5f6g7h8-...",
      "name": "PROD-SQL-01",
      "server_host": "192.168.1.10",
      "is_active": true,
      "agent_last_seen": "2026-06-10T14:55:00+00:00"
    }
  ],
  "total": 1
}

Códigos de resposta

CódigoSignificado
200Sucesso
401API Key ausente, inválida ou revogada
403Escopo insuficiente para o endpoint solicitado
429Rate limit atingido — aguarde antes de tentar novamente

O codeDB implementa um modelo de controle de acesso baseado em roles (RBAC) por tenant. Cada usuário pode pertencer a múltiplos workspaces com roles diferentes em cada um.

Modelo de dados

TabelaResponsabilidade
usersIdentidade global do usuário — e-mail, senha, MFA. Independente de tenant.
tenantsWorkspace/empresa. Contém plano, status e configurações de cobrança.
tenant_membersJunção user ↔ tenant com role. Um usuário pode ter N linhas (um por tenant).
member_invitesConvites pendentes. Armazena e-mail convidado, token, role e expiração. Independente de ter conta prévia.

Roles e permissões por endpoint

OperaçãoRole mínima
Visualizar dashboard, alertas, incidentes, relatóriosanalyst
Criar/editar/deletar ambientes e regras de alertaadmin
Gerar token de agenteadmin
Convidar membrosadmin
Alterar role de membroowner
Remover membroowner
Cancelar convite pendenteadmin
Gerenciar cobrança e assinaturaowner
Cancelar/deletar workspaceowner

Isolamento de dados multi-tenant

Todas as tabelas de dados (environments, instances, snapshots, alerts, incidents) possuem coluna tenant_id. As queries sempre filtram por tenant_id via dependência FastAPI get_current_tenant(), que valida o header X-Tenant-Id e a membership do usuário antes de executar qualquer operação. Não há Row-Level Security no PostgreSQL — o isolamento é feito na camada de aplicação.

Fluxo de convite (backend)

EtapaEndpointO que acontece
Owner envia convitePOST /members/inviteCria registro em member_invites com token de 64 chars (URL-safe) e expiração de 7 dias. Envia e-mail via Brevo/SMTP.
Convidado visita o linkGET /invites/{token}Endpoint público. Retorna nome do tenant, nome do convidante e role. Valida expiração.
Convidado aceitaPOST /invites/{token}/acceptRequer JWT do convidado. Valida e-mail, cria TenantMember, marca invite como aceito.
Novo usuário se cadastraPOST /auth/registerBackend detecta convite pendente para o e-mail → aceita automaticamente em vez de criar novo tenant.

Seleção de workspace no login

O endpoint POST /auth/login retorna a lista completa de tenants do usuário no campo tenants[]. Quando há mais de um, o portal exibe um diálogo de seleção. O tenant escolhido é salvo em sessionStorage como cdb_tenant_id e enviado em todas as requisições via header X-Tenant-Id.

Tokens JWT e tenant_id

O JWT de acesso (15 min) embarca tenant_id e role do primeiro tenant do usuário. Porém, o controle real de acesso é feito via X-Tenant-Idheader — o backend valida a membership em tempo real a cada requisição. O campo do JWT serve apenas como referência inicial para o portal restaurar a sessão após recarga.

Resumo das camadas de segurança e conformidade implementadas na plataforma.

Autenticação e sessão

MecanismoDetalhe
JWT httpOnlyAccess token (15 min) + refresh token (7 dias) em cookies httpOnly — não acessíveis via JavaScript
Rotação de refresh tokenCada uso do refresh token gera um novo par access+refresh; o token anterior é invalidado imediatamente
MFA / TOTPSecret armazenado criptografado (Fernet AES-128, prefixo enc::); TOTP RFC-6238 via pyotp
bcryptSenhas de usuário hasheadas com bcrypt (fator de custo auto-ajustado)
Verificação de e-mailCódigo de 6 dígitos (hash SHA-256, expira em 20min, máx. 5 tentativas) bloqueia login até confirmar — cadastro e-mail/senha apenas

Proteção de dados sensíveis

DadoProteção
Token do agentVerificado via SHA-256; nunca armazenado em texto claro
API KeysArmazenadas como SHA-256 (64 chars hex); reveladas apenas no momento da criação
Pacote de auto-updateSHA-256 publicado via AGENT_PACKAGE_SHA256 no backend; agent verifica antes de aplicar
Senhas no Config.envCriptografia Fernet/AES-128 com prefixo ENC:; gerenciada pelo codeDB Agent Config

Rate limiting

Implementado via slowapi. Endpoints sensíveis têm limite por IP/minuto. Quando o limite é excedido, a API retorna 429 Too Many Requests com header Retry-After. Exemplos de limites: consentimento de cookies (10/min), login e registro (configurável por ambiente de deploy).

Privacidade e anonimização (LGPD)

MedidaDetalhe
IP truncationEndereços IP truncados antes do armazenamento: /24 para IPv4, /48 para IPv6
query_text_modeColuna em environments; valores: full | masked | disabled. Controla se o texto das queries é armazenado.
Exclusão self-serviceDELETE /users/me remove o usuário; DELETE /tenants/{id} purga todos os dados do workspace em cascata
Exportação de dadosPOST /export/request gera ZIP com todos os dados do tenant; disponível por 48h via GET /export/download/{id}
Consentimento de cookiesPOST /consent registra flags (necessary, analytics, marketing) com IP truncado e timestamp

Aceite de Termos (modelo click-wrap)

O aceite dos Termos de Uso e da Política de Privacidade ocorre implicitamente no momento do cadastro — não há contrato separado. A tela /auth/register exibe o aviso: "Ao criar a conta, você concorda com os Termos de Uso e a Política de Privacidade."

DocumentoURL
Termos de Uso/termos
Política de Privacidade/privacidade
Política de Cookies/cookies
codeDB

Monitoramento inteligente de SQL Server com agente local seguro e diagnósticos em tempo real.

Produto

RecursosPreçosComparativoscodeDB Lens (grátis)

© 2026 codeDB. Todos os direitos reservados.

Powered by codeDB

codeDB Informática Ltda — CNPJ 18.953.756/0001-10 — Florianópolis/SC