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 UsoApê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 LGPDO 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.
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).
| Requisito | Versão mínima | Observação |
|---|---|---|
| Windows Server | 2012 R2 ou superior | Também funciona em Windows 10/11 Pro |
| SQL Server | 2012 ou superior | Express, Standard, Enterprise, Developer |
| ODBC Driver for SQL Server | v17 (recomendado) ou v18 | Download gratuito na Microsoft — não é necessário para monitorar PostgreSQL |
| PostgreSQL (em vez do SQL Server) | 11 ou superior | Testado no 16. Não precisa de driver: o agente já traz. Ver apêndice C.1 |
| .NET Framework | 4.7.2 ou superior | Normalmente já presente no Windows Server |
| Acesso à internet | Porta 443 (HTTPS) | Para envio de dados ao codeDB |
| Requisito | Versão mínima | Observaçã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 container | Docker ou outro runtime OCI | Também funciona em Kubernetes como um Pod comum |
| PostgreSQL | 11 ou superior | Testado no 16. Ver apêndice C.1 para privilégios e extensões |
| Acesso à internet | Porta 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.
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.
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 login | Como funciona | Quando usar |
|---|---|---|
| E-mail e senha | Cadastro tradicional: nome, e-mail, senha, CPF/CNPJ e nome da empresa | Uso individual ou primeiro acesso da organização |
| Um clique em “Continuar com Google” — usa a conta Google já logada no navegador | Quem 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 AD | Empresas com Microsoft 365 ou Active Directory |
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.
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.
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.
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.
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.
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.
| Formato | Sistema | Engines | Quando usar |
|---|---|---|---|
| Instalador Windows (.exe) | Windows Server 2012 R2+, ou Windows 10/11 Pro | SQL Server e PostgreSQL | Servidor Windows — único caminho para SQL Server |
| Pacote .deb | Debian 11+, Ubuntu 20.04+ | PostgreSQL | Distros da família Debian/Ubuntu, com systemd |
| Tarball universal | Qualquer Linux com glibc 2.31+ (RHEL/Rocky 9+ etc.) | PostgreSQL | Distros fora da família Debian — RHEL/CentOS 8 (glibc 2.28) não roda o binário atual |
| Imagem de container | Docker, Kubernetes ou outro runtime OCI | PostgreSQL | Ambiente 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.
| Windows | Linux (.deb / tarball) | Container | |
|---|---|---|---|
| Configuração | Config.env ao lado do .exe | /etc/codedb-agent/Config.env (600) | variáveis de ambiente |
| Chave de cifra da senha | CodeDB.key ao lado do .exe | /etc/codedb-agent/CodeDB.key (600) | — senha vem de arquivo de secret |
| Logs, estado e sondas | ao lado do .exe | /var/lib/codedb-agent/ (700) | volume Docker montado em /var/lib/codedb-agent |
| Serviço | NSSM ("codeDB Agent") | systemd (codedb-agent) | flag --restart unless-stopped |
| Atualização | instalador Inno, SHA-256 conferido | troca o binário, SHA-256 conferido, systemd reinicia | nã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.
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.
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.
Ao final da instalação, o codeDB Agent Config é aberto automaticamente. Nele você irá:
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.
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
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.
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.
A partir da versão 1.19.2 o agente executa dois trabalhos independentes, em ritmos diferentes:
| Trabalho | Ritmo | O que faz |
|---|---|---|
| Coleta de métricas | A cada 5 min (definido pelo plano) | Lê as DMVs, calcula o payload e envia para a plataforma |
| Sonda de disponibilidade | A cada 15 segundos | Testa 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.
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.
| Aspecto | Comportamento |
|---|---|
| Conteúdo | Apenas horário, sucesso/falha e classe do erro — nenhuma credencial, nenhum dado de negócio |
| Volume | Cerca de 350 KB por dia por instância |
| Envio | Junto do ciclo de coleta; o arquivo só é apagado após confirmação da plataforma |
| Plataforma fora do ar | As medições se acumulam em disco e sobem quando a comunicação volta |
| Limite de acúmulo | Teto 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).
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).
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.
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).
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.
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.
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
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.
| Aba | Conteúdo |
|---|---|
| 1 — Visão Geral | Trê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 — Performance | Wait stats, PLE, buffer cache hit ratio, top queries por CPU e leituras, I/O por arquivo |
| 3 — Sessões e Bloqueios | Sessões ativas, queries em execução, chains de bloqueio |
| 4 — Query Intelligence | Ranking 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 Índices | As 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 — Capacidade | Tamanho alocado, usado e % de log por banco; espaço em disco por volume; projeção de esgotamento |
| 7 — Jobs e Backups | Status dos SQL Agent Jobs, histórico de falhas, status de backups |
| 8 — Insights Inteligentes | Recomendações automáticas baseadas em regras e histórico |
| 9 — Anomalias | Detecção de anomalias estatísticas em métricas históricas |
| 10 — Análise de Incidentes | Root Cause Timeline: causa raiz, sequência de eventos, Health Score |
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.
| Aba | No PostgreSQL |
|---|---|
| 1 — Visão Geral | Atividade (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 Bloqueios | Mesmas sessões e cadeias de bloqueio, vindas de pg_stat_activity/pg_locks em vez das DMVs |
| 4 — Query Intelligence | Ranking 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 Índices | As 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 — Capacidade | Mesma 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 Backups | PostgreSQL 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 Incidentes | Mesmas telas, com regras e causas-raiz próprias do PostgreSQL (autovacuum parado, risco de XID wraparound, lag de replicação, entre outras) |
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-aba | O que mostra |
|---|---|
| Top Impact | Ranking 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. |
| Crescendo | Queries com CPU crescendo mais de 20% em 7 dias (regressão linear). Badge '+XX% em 7d'. Requer 7 dias de histórico. |
| Degradadas | Queries com CPU atual acima de 1,5× o baseline dos últimos 14 dias. Badge 'XX× baseline'. Requer 14 dias de histórico. |
| Missing Indexes | Sugestões de índice detectadas automaticamente pelo SQL Server. DDL do CREATE INDEX pronto para copiar. |
| Recomendações | Regras QRULE_* disparadas, com severidade, explicação e ação recomendada. |
| Regra | Condição | Ativa desde |
|---|---|---|
| QRULE_001 | CPU excessiva: avg_cpu_ms > 5.000ms com ≥ 10 execuções | Dia 1 |
| QRULE_002 | Alta frequência: > 50.000 execuções por dia (possível loop de aplicação) | Dia 1 |
| QRULE_003 | Leitura excessiva: avg_logical_reads > 100.000 páginas por execução | Dia 1 |
| QRULE_004 | Crescimento acelerado: CPU cresceu > 20% em 7 dias (regressão linear) | Dia 7 |
| QRULE_005 | Degradação vs baseline: CPU atual > 1,5× a média dos 14 dias anteriores | Dia 14 |
| QRULE_006 | Índice ausente: alta leitura física + sugestão de índice detectada no mesmo banco | Dia 1 |
| QRULE_007 | Correlação com incidente: query estava ativa durante janela de incidente (48h) | Dia 1 |
| QRULE_009 | Concentração de CPU: query representa > 30% do total de CPU da instância no dia | Dia 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.
O Impact Score é calculado diariamente para cada query com base em 6 dimensões ponderadas:
| Dimensão | Peso |
|---|---|
| CPU acumulada (total_cpu_ms) | 30% |
| Leituras lógicas totais | 25% |
| Elapsed × execuções | 20% |
| Writes totais | 10% |
| Frequência de execução | 10% |
| 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.
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).
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ção | O que mostra |
|---|---|
| Top 10 crescimento | Gráfico de barras com as tabelas que mais cresceram na janela escolhida (7, 30 ou 90 dias). |
| Tabelas que mais consomem espaço | As 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 tamanho | Os 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.
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.
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.
| Aba | O que mostra |
|---|---|
| Incidentes | Lista 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 Recorrentes | Problemas 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ções | Incidentes que afetaram múltiplas instâncias em menos de 15 minutos — indica problema de infraestrutura compartilhada (storage, hypervisor, rede). |
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.
| Controle | O que faz |
|---|---|
| Ambiente | "Todos os ambientes" (padrão) ou um ambiente específico |
| Período | 30, 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ância | Ligam 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 |
| Bloco | O 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ção | Os 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 frota | Uma 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 |
| Estabilidade | Incidentes e saúde por semana, mapa de calor dia × hora (revela janelas de job e backup), causas raiz e disponibilidade semanal |
| Carga | Conexões, % do tempo com bloqueio e CPU ao longo do dia, e em que as esperas se concentram (disco, CPU, lock, memória, rede) |
| Armazenamento | Uso dos volumes, crescimento em GB/mês, dias até encher (runway) e dias com log de transações acima de 80% |
| Eficiência | Quanto 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 engine | SQL 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.
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:
| Parte | Conteúdo |
|---|---|
| Capa | Os 6 indicadores com variação, os pontos de atenção mais graves e o índice das histórias |
| Histórias | De 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 |
| Anexos | A 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 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.
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ório | Conteúdo |
|---|---|
| Health Score por instância | Ranking do pior ao melhor, com média da semana |
| Alertas | Total disparados, críticos e resolvidos no período |
| Disponibilidade | Percentual de uptime por instância |
| Riscos de backup | Bancos com backup atrasado ou com falha |
| Insights automáticos | Recomendações geradas durante a semana |
| Top incidentes | Os 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).
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.
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.
| Severidade | Exemplos 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.
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.
| Categoria | Widgets disponíveis |
|---|---|
| KPIs | Health Score (gauge colorido), PLE, TempDB %, sessões ativas, bloqueios, RAM %, buffer cache, queries longas, deadlocks, jobs com falha |
| Gráficos | Top wait types (barras), latência de I/O, histórico de Health Score (24h) |
| Listas | Alertas 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).
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.
Acesse seu Perfil
Clique no seu avatar no canto superior direito e acesse Perfil.
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.
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.
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.
| Item | Como é protegido |
|---|---|
| Token do agent | Verificado via SHA-256 — nunca armazenado em texto claro |
| API Keys | Armazenadas como hash SHA-256 — visíveis apenas no momento da criação |
| Auto-update do agent | Instalador 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.).
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:
| Modo | Comportamento |
|---|---|
| full (padrão) | Texto completo da query armazenado e visível no portal |
| masked | Texto truncado/ofuscado antes do armazenamento |
| disabled | Texto nunca armazenado — apenas estatísticas de performance |
| Direito | Como exercer no codeDB |
|---|---|
| Exclusão de conta e dados | Perfil → Excluir minha conta (requer senha + MFA se ativo). Todos os dados do workspace são removidos permanentemente. |
| Portabilidade / exportação | Configurações → Exportar dados. Gera um arquivo ZIP com todos os dados do ambiente, disponível por 48h para download. |
| Visualizar dados coletados | Dashboard, alertas, incidentes e histórico — todos visíveis e acessíveis pelo portal. |
| Anonimização de IP | Endereç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.
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.
| Documento | Onde 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.
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).
| Score | Classificação | O que significa |
|---|---|---|
| 90–100 | Excelente | Instância funcionando dentro dos parâmetros ideais |
| 70–89 | Bom | Pequenas anomalias, sem impacto relevante |
| 50–69 | Atenção | Degradação moderada — investigar logo |
| 30–49 | Crítico | Problema ativo afetando performance |
| 0–29 | Emergência | Situação grave, intervenção imediata necessária |
.ldf crescendo ≥ 500 MB em um ciclo (~5 min) desconta 10 pts; ≥ 2.000 MB desconta 20 pts.pg_blocking_pids().max_connections desconta 10 pts; 95% desconta 20 pts — esgotar as conexões derruba a aplicação inteira.autovacuum_freeze_max_age desconta 15 pts; 90% desconta 30 pts. Chegar ao wraparound põe o cluster em somente-leitura.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.
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.
| Evento | Critério |
|---|---|
| Abertura de incidente | Health Score cai ≥ 10 pontos em 2 snapshots consecutivos (~10 min) |
| Encerramento de incidente | Score 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.
| Severidade | Tipos de evento |
|---|---|
| Crítico | health_drop, ple_critical, tempdb_critical, alert_fired (crítico) |
| Atenção | ple_warning, memory_pressure, blocking_start, wait_spike, tempdb_high, job_failure, deadlock, io_latency_high |
| Info | health_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.
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.
| Confiança | O que significa |
|---|---|
| Alta | Múltiplos indicadores convergindo — diagnóstico confiável |
| Média | Alguns indicadores presentes — investigar, mas considerar causas alternativas |
| Baixa | Poucos dados disponíveis — incidente breve ou problema menos comum |
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).
| Campo | Significado |
|---|---|
| Dia | Dia da semana em que o padrão ocorre |
| Horário | Bloco de 4 horas (ex: 08–12h) |
| Causa Raiz | Tipo de problema que se repete |
| Ocorrências | Número de vezes detectado no período analisado (mín. 2) |
| Queda Média | Média de pontos de Health Score perdidos por incidente |
| Duração Média | Mé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.
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ário | Causa provável |
|---|---|
| 3 instâncias com gargalo de I/O simultâneo | Storage compartilhado (SAN/NAS) com problema |
| 2 instâncias com pressão de memória ao mesmo tempo | Memória insuficiente no hypervisor (VMs) |
| Múltiplas instâncias com jobs falhando | SQL Agent ou conta de serviço com problema |
| Incidentes em todas as instâncias de um ambiente | Problema de rede ou no host físico |
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.
Acesse Configurações no menu lateral
Role até a seção API Keys — Integração Pública.
Clique em Nova API Key
Informe um nome descritivo (ex: "Zabbix Produção", "Teams NOC").
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.
| Endpoint | Descrição | Parâmetros |
|---|---|---|
| GET /api/v1/incidents | Lista incidentes detectados e classificados | days (1–90), instance_id, environment_id |
| GET /api/v1/instances | Lista instâncias monitoradas com status básico | — |
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)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.
| Role | Permissões | Quem pode atribuir |
|---|---|---|
| Proprietário (owner) | Acesso total: gerenciar membros, ambientes, instâncias, cobrança e cancelamento | Apenas outros owners |
| Administrador (admin) | Criar/editar/deletar ambientes, convidar membros, gerar tokens de agente | Owner ou admin |
| Analista (analyst) | Acesso de leitura ao dashboard, alertas, incidentes e relatórios. Não pode alterar configurações. | Owner ou admin |
Acesse Membros no menu lateral
Clique em Membros no sidebar do dashboard.
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).
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}.
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.
A página de aceite de convite (/invite/{token}) funciona em três cenários:
?redirect=/invite/{token}) e "Criar conta nova" (vai para registro com e-mail pré-preenchido).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.
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.
Acesse Membros
Na tela Membros, o card Acesso via Microsoft Entra (SSO) mostra o status da conexão com o diretório.
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.
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.
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.
Na tela Membros, o owner pode:
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.
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.
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.
| Tipo | Dispara quando | Exemplo de threshold |
|---|---|---|
| TempDB % de uso | Uso total do TempDB ≥ threshold (%) | 80% |
| Sessão longa | Query em execução ≥ threshold (minutos) | 30 minutos |
| TempDB por sessão | Uso de TempDB de uma sessão ≥ threshold (MB) | 500 MB |
| Jobs com falha | Número de SQL Agent Jobs com falha ≥ threshold | 1 |
| PLE baixo | Page Life Expectancy < threshold (segundos) | 300 s |
| Bloqueios | Sessões bloqueadas ≥ threshold | 1 |
| Crescimento de log | Arquivo .ldf de qualquer banco cresce ≥ threshold em um ciclo (~5 min) | 500 MB |
| Espaço em disco | Qualquer volume de disco com espaço livre < threshold | 15% |
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.
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.
| Plano | Mensal | Anual | Ambientes | Instâncias | Retenção | Coleta |
|---|---|---|---|---|---|---|
| Starter | R$ 249 | R$ 2.490 | 1 | 5 | 14 dias | a cada 5 min |
| Professional | R$ 549 | R$ 5.490 | 5 | 20 | 45 dias | a cada 2 min |
| Business | R$ 1.190 | R$ 11.900 | 15 | 40 | 90 dias | a cada 1 min |
| MSP / White Label | Por instância | Anual | Ilimitados | Ilimitadas | 90 dias | a 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.
Monitoramento base — disponível em todos os planos:
| Recurso | Starter | Professional | Business |
|---|---|---|---|
| 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:
| Recurso | Starter | Professional | Business |
|---|---|---|---|
| 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:
| Recurso | Starter | Professional | Business |
|---|---|---|---|
| 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:
| Limite | Starter | Professional | Business |
|---|---|---|---|
| Ambientes | 1 | 5 | 15 |
| Instâncias SQL Server | 5 | 20 | 40 |
| Membros da equipe | 2 | 10 | Ilimitados |
| Retenção de histórico | 14 dias | 45 dias | 90 dias |
| Intervalo de coleta | 5 min | 2 min | 1 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.
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.
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.
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.
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.
Abra Identidade visual
No menu lateral do painel MSP, acesse Identidade visual e role até o card Subdomínio personalizado.
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.
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.
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.
| Status | O que está acontecendo | O que você faz |
|---|---|---|
| Em análise | Recebemos o pedido e ele está na fila. | Nada — avisaremos por e-mail. |
| Provisionando | O endereço está sendo publicado e validado. | Nada; leva alguns minutos. |
| Ativo | O endereço está no ar. | Compartilhe o link com seus clientes. |
| Falhou | Não foi possível ativar; o motivo aparece na tela. | Corrija e use Tentar novamente. |
| Remoção em andamento | A remoção pedida está sendo processada. | Nada — avisaremos ao concluir. |
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.
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).
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.
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.
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.
| Métrica | O que mede | Impactado por queda do codeDB? |
|---|---|---|
| Disponibilidade (%) | Percentual de tempo com SQL Server comprovadamente disponível, sobre o tempo observado | Não |
| Cobertura de Monitoramento (%) | Percentual do tempo total em que o codeDB conseguiu observar o ambiente | Sim — reduz, mas não penaliza o SLA |
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.
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.
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ção | Evidência | Causa registrada |
|---|---|---|
| Instância reiniciou | Sondas falharam E o horário de início do SQL Server avançou | Reinicialização da Instância |
| Rede instável | Sondas expiraram por timeout, mas o horário de início não mudou — o SQL nunca caiu | Perda de Conectividade |
| Serviço parado ou host fora | Conexão recusada, sem reinicialização detectada | Instância Inacessível |
| Credencial incorreta | O servidor respondeu e recusou o login | Nã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.
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.
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:
| Estado | Significado | Impacta disponibilidade? |
|---|---|---|
| UP | Snapshot recebido dentro do intervalo esperado (≤ 7,5 min). SQL Server respondendo. | Não — estado normal |
| DOWN | Reinicialização do SQL Server detectada via instance_start_time. Indisponibilidade comprovada. | Sim — conta como downtime real |
| UNKNOWN | Gap sem evidência de falha: agente parado, rede instável, causa desconhecida. | Não — excluído do denominador |
| MAINTENANCE | Período coberto por uma janela de manutenção planejada pelo tenant. | Não — excluído do cálculo |
| MONITORING_GAP | Gap durante indisponibilidade registrada da plataforma codeDB. | Não — excluído do cálculo |
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.
| Situação | Duração | Estado |
|---|---|---|
| SQL Server respondendo normalmente | 43.170 min | UP |
| Reinicialização do SQL Server | 15 min | DOWN |
| codeDB offline (manutenção da plataforma) | 240 min | MONITORING_GAP |
| Agente parado (update de servidor) | 60 min | UNKNOWN |
| Manutenção planejada (janela configurada) | 120 min | MAINTENANCE |
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.
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.
| Comportamento | Durante a janela |
|---|---|
| Alertas | Suprimidos automaticamente — nenhum e-mail ou notificação é enviado |
| Disponibilidade | Período excluído do cálculo (estado MAINTENANCE) |
| Health Score médio | Período excluído das médias e histórico |
| Relatório Semanal | Período reportado como manutenção, separado do downtime real |
Acesse Configurações → Manutenção
No menu lateral, expanda Configurações e clique em Manutenção.
Clique em Nova Janela
Preencha título, data/hora de início e fim, ambiente ou instância (opcional) e motivo.
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.
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.
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ço | Stack | Hospedagem |
|---|---|---|
| codedb-agent | Python 3.11 + pyodbc (SQL Server) / psycopg (PostgreSQL), empacotado com PyInstaller | Servidor do cliente — Windows (.exe), Linux (.deb/tarball) ou container |
| codedb-saas (API) | FastAPI + SQLAlchemy async + PostgreSQL + Redis | Azure Container Apps |
| codedb-portal (Web) | Next.js 15 + MUI + TanStack Query + Recharts | Azure 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.
| Variável | Tipo | Exemplo / Padrão |
|---|---|---|
| AGENT_TOKEN | string (obrigatório) | gerado no portal |
| CODEDB_API_URL | URL | https://api.codedb.com.br |
| DB_SERVER | string | SERVIDOR\INSTANCIA |
| DB_PORT | int | 1433 |
| DB_DRIVER | string | ODBC Driver 17 for SQL Server |
| DB_WINDOWS_AUTH | bool | true |
| DB_USER | string | sa (se SQL Auth) |
| DB_PASSWORD | string (criptografada) | ENC:gAAAAA... |
| COLLECTION_INTERVAL_SEC | int | 300 (5 minutos) |
| PROBE_ENABLED | bool | true — sondagem de disponibilidade |
| PROBE_INTERVAL_SEC | int | 15 — intervalo entre sondas |
| PROBE_TIMEOUT_SEC | int | 5 — timeout de cada sonda |
| LOG_LEVEL | string | INFO |
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ável | Tipo | Exemplo / Padrão |
|---|---|---|
| DB_ENGINE | string (obrigatório) | postgres |
| DB_SERVER | string | host ou endpoint do cluster |
| DB_PORT | int | 5432 |
| DB_DATABASE | string | postgres |
| DB_USERNAME | string | codedb_monitor |
| DB_PASSWORD | string (criptografada) | ENC:gAAAAA... |
| DB_SSLMODE | string | require (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.
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
| Hospedagem | Quem concede o pg_monitor |
|---|---|
| Servidor próprio (on-premises / VM) | um superusuário |
| Amazon RDS / Aurora PostgreSQL | o usuário master (papel rds_superuser) |
| Azure Database for PostgreSQL — Flexible Server | o administrador do servidor (papel azure_pg_admin) |
| Google Cloud SQL for PostgreSQL | um usuário com cloudsqlsuperuser |
| Extensão | Habilita | Sem ela |
|---|---|---|
| pg_stat_statements | Inteligência de Consultas (top consultas, regras, tendências) | a aba mostra “indisponível — requer pg_stat_statements” com o passo a passo |
| pgstattuple | bloat MEDIDO de tabelas e índices (Tabelas e Índices) | bloat de tabela ESTIMADO (com selo) e bloat de índice em branco |
| pg_cron | nada, por enquanto — o histórico de jobs do pg_cron ainda não é coletado | jobs 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.
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).
| O que o portal mostra | Causa | Como resolver |
|---|---|---|
| Inteligência de Consultas indisponível | pg_stat_statements não instalado no database | preload + CREATE EXTENSION (acima) |
| Bloat “estimado” ou em branco | sem pgstattuple no database, ou sem pg_monitor | CREATE EXTENSION pgstattuple; GRANT pg_monitor |
| Sem CPU, memória e disco do servidor | hospedagem gerenciada, conexão remota ou container | instale o agente no próprio servidor do PostgreSQL (não se aplica ao gerenciado) |
| Sessões de outros usuários não aparecem | usuário sem pg_monitor | GRANT pg_monitor TO codedb_monitor |
| Histórico de backup indisponível | sem ferramenta de base backup configurada | BACKUP_SOURCE=pgbackrest no Config.env (gerenciado: o backup é do provedor) |
| Tabelas e Índices vazia | o inventário roda de madrugada, uma vez por dia | aguarde 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.
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).
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=
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>
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.
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.
| O que o portal mostra | Causa | Como resolver |
|---|---|---|
| Ative as métricas de nuvem | CLOUD_METRICS está off (ou o agente é anterior à 1.25.0) | defina CLOUD_METRICS=aws ou azure e reinicie o agente |
| Falha de autenticação | sem IAM role / managed identity, ou chaves de fallback inválidas | associe a identidade à máquina ou revise as chaves do Config.env |
| Permissão insuficiente | a identidade não tem a política / o papel mínimo | aplique a política IAM ou o papel Monitoring Reader acima |
| Recurso não encontrado | o recurso não foi descoberto pelo DB_SERVER | informe CLOUD_RESOURCE_ID |
| Erro da API do provedor | indisponibilidade ou limite temporário | nenhuma ação: o agente tenta de novo no próximo ciclo |
| SDK ausente | build do agente sem o SDK do provedor | atualize 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.
| Status | Descrição | Coleta de dados |
|---|---|---|
| trialing | Período de trial ativo (30 dias) | Ativa |
| active | Assinatura paga em dia | Ativa |
| past_due | Falha no pagamento — grace period de 10 dias | Ativa (temporariamente) |
| suspended | Grace period expirado — acesso bloqueado | Bloqueada |
| cancelled | Cancelado — dados retidos por 30 dias | Bloqueada |
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:
| Formato | Como 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 |
| Container | Nã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.
| Header | Valor |
|---|---|
| X-API-Key | cdb_v1_<sua-chave> (recomendado) |
| Authorization | Bearer cdb_v1_<sua-chave> (alternativo) |
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| days | inteiro | 7 | Janela de busca em dias (1–90) |
| instance_id | UUID | — | Filtrar por instância específica |
| environment_id | UUID | — | 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
}// 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ódigo | Significado |
|---|---|
| 200 | Sucesso |
| 401 | API Key ausente, inválida ou revogada |
| 403 | Escopo insuficiente para o endpoint solicitado |
| 429 | Rate 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.
| Tabela | Responsabilidade |
|---|---|
| users | Identidade global do usuário — e-mail, senha, MFA. Independente de tenant. |
| tenants | Workspace/empresa. Contém plano, status e configurações de cobrança. |
| tenant_members | Junção user ↔ tenant com role. Um usuário pode ter N linhas (um por tenant). |
| member_invites | Convites pendentes. Armazena e-mail convidado, token, role e expiração. Independente de ter conta prévia. |
| Operação | Role mínima |
|---|---|
| Visualizar dashboard, alertas, incidentes, relatórios | analyst |
| Criar/editar/deletar ambientes e regras de alerta | admin |
| Gerar token de agente | admin |
| Convidar membros | admin |
| Alterar role de membro | owner |
| Remover membro | owner |
| Cancelar convite pendente | admin |
| Gerenciar cobrança e assinatura | owner |
| Cancelar/deletar workspace | owner |
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.
| Etapa | Endpoint | O que acontece |
|---|---|---|
| Owner envia convite | POST /members/invite | Cria 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 link | GET /invites/{token} | Endpoint público. Retorna nome do tenant, nome do convidante e role. Valida expiração. |
| Convidado aceita | POST /invites/{token}/accept | Requer JWT do convidado. Valida e-mail, cria TenantMember, marca invite como aceito. |
| Novo usuário se cadastra | POST /auth/register | Backend detecta convite pendente para o e-mail → aceita automaticamente em vez de criar novo tenant. |
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.
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.
| Mecanismo | Detalhe |
|---|---|
| JWT httpOnly | Access token (15 min) + refresh token (7 dias) em cookies httpOnly — não acessíveis via JavaScript |
| Rotação de refresh token | Cada uso do refresh token gera um novo par access+refresh; o token anterior é invalidado imediatamente |
| MFA / TOTP | Secret armazenado criptografado (Fernet AES-128, prefixo enc::); TOTP RFC-6238 via pyotp |
| bcrypt | Senhas de usuário hasheadas com bcrypt (fator de custo auto-ajustado) |
| Verificação de e-mail | Código de 6 dígitos (hash SHA-256, expira em 20min, máx. 5 tentativas) bloqueia login até confirmar — cadastro e-mail/senha apenas |
| Dado | Proteção |
|---|---|
| Token do agent | Verificado via SHA-256; nunca armazenado em texto claro |
| API Keys | Armazenadas como SHA-256 (64 chars hex); reveladas apenas no momento da criação |
| Pacote de auto-update | SHA-256 publicado via AGENT_PACKAGE_SHA256 no backend; agent verifica antes de aplicar |
| Senhas no Config.env | Criptografia Fernet/AES-128 com prefixo ENC:; gerenciada pelo codeDB Agent Config |
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).
| Medida | Detalhe |
|---|---|
| IP truncation | Endereços IP truncados antes do armazenamento: /24 para IPv4, /48 para IPv6 |
| query_text_mode | Coluna em environments; valores: full | masked | disabled. Controla se o texto das queries é armazenado. |
| Exclusão self-service | DELETE /users/me remove o usuário; DELETE /tenants/{id} purga todos os dados do workspace em cascata |
| Exportação de dados | POST /export/request gera ZIP com todos os dados do tenant; disponível por 48h via GET /export/download/{id} |
| Consentimento de cookies | POST /consent registra flags (necessary, analytics, marketing) com IP truncado e timestamp |
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."
| Documento | URL |
|---|---|
| Termos de Uso | /termos |
| Política de Privacidade | /privacidade |
| Política de Cookies | /cookies |
Monitoramento inteligente de SQL Server com agente local seguro e diagnósticos em tempo real.
© 2026 codeDB. Todos os direitos reservados.
Powered by codeDB
codeDB Informática Ltda — CNPJ 18.953.756/0001-10 — Florianópolis/SC