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 IntelligenceIncidentesDashboard GerencialRelatórios SemanaisInsights 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 AssinaturaRegras de UsoApêndice Técnico
A — ArquiteturaB — Config.envC — Permissões SQL ServerD — 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 SQL Server que coleta métricas em tempo real diretamente das instâncias do seu servidor Windows 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 |
| .NET Framework | 4.7.2 ou superior | Normalmente já presente no Windows Server |
| Acesso à internet | Porta 443 (HTTPS) | Para envio de dados ao codeDB |
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.
Crie sua conta
Acesse o portal codeDB e clique em Começar Gratuitamente. Preencha nome, e-mail, senha, CPF/CNPJ e nome da empresa. Você terá 30 dias de trial gratuito sem precisar inserir cartão de crédito.
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
Clique em Baixar Agente para baixar o instalador codeDB-Agent-Setup.exe. Execute-o no servidor Windows onde o SQL Server está instalado.
Configure e aguarde
O instalador abre o Gerenciador de Instâncias automaticamente. Insira o token do ambiente, selecione a instância SQL e salve. Em até 5 minutos os primeiros dados aparecerão no portal.
Execute codeDB-Agent-Setup.exe como administrador. O instalador copiará os arquivos para C:\codeDB-Agent\, instalará o gerenciador de serviço NSSM e registrará o agente como serviço Windows com inicialização automática.
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.
Se o servidor hospedar mais de uma instância SQL Server, abra o codeDB Agent Config novamente, clique em + Adicionar Instância e insira o token de um segundo ambiente criado no portal. Cada ambiente monitora uma instância separada.
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 9 abas, atualizadas automaticamente a cada 60 segundos:
| Aba | Conteúdo |
|---|---|
| 1 — Visão Geral | Health Score ao vivo, KPIs principais, sessões ativas, top queries, TempDB |
| 2 — Performance | Wait stats, PLE, buffer cache hit ratio, I/O por arquivo |
| 3 — Sessões e Bloqueios | Sessões ativas, queries em execução, chains de bloqueio |
| 4 — Jobs e Backups | Status dos SQL Agent Jobs, histórico de falhas, status de backups |
| 5 — Capacidade | Tamanho de dados e log por banco (.mdf/.ldf); espaço em disco por volume; projeção de crescimento |
| 6 — Insights Inteligentes | Recomendações automáticas baseadas em regras e histórico |
| 7 — Anomalias | Detecção de anomalias estatísticas em métricas históricas |
| 8 — Análise de Incidentes | Root Cause Timeline: causa raiz, sequência de eventos, Health Score |
| 9 — 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 |
Disponível na aba 9 — 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.
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 Executive no menu lateral. Visão consolidada de saúde de todos os ambientes — projetada para gestores e líderes de TI que precisam de uma leitura rápida sem entrar em cada instância individualmente.
| KPI / Seção | O que representa |
|---|---|
| Instâncias monitoradas | Total de SQL Servers ativos no ambiente e período selecionados |
| Health Score médio | Média do score de todas as instâncias no período |
| Disponibilidade (%) | Percentual de tempo com SQL Server comprovadamente disponível (excluindo UNKNOWN, manutenção e gaps de monitoramento) |
| Cobertura de Monitoramento (%) | Percentual do tempo em que o codeDB conseguiu observar o ambiente — reduz quando o agente fica offline, mas não penaliza a disponibilidade do cliente |
| Alertas disparados | Total de alertas no período |
| Instâncias críticas | Quantidade com Health Score abaixo de 50 |
| Riscos de capacidade | Bancos ou volumes que esgotam espaço em menos de 90 dias |
| Anomalias ativas (7d) | Métricas com desvio significativo vs. baseline histórica |
| Ranking de instâncias | Health Score atual, médio, disponibilidade, cobertura e incidentes por instância |
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).
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.
| 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 SQL Server em um único valor, calculado a cada 5 minutos.
| 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.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.
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.
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 plano Professional — sem cartão de crédito, sem compromisso. Ao final do trial, escolha um plano para continuar.
| Plano | Preço mensal | Ambientes | Instâncias | Membros | Retenção |
|---|---|---|---|---|---|
| Starter | R$ 49/mês | 1 | 3 | 2 | 7 dias |
| Professional | R$ 149/mês | 3 | 10 | 10 | 30 dias |
| Business | R$ 399/mês | 10 | 30 | 30 | 90 dias |
| Enterprise | Sob consulta | Ilimitados | Ilimitadas | Ilimitados | Personalizada |
Todos os planos pagos oferecem desconto de ~20% na cobrança anual. O gerenciamento de pagamento, troca de plano e histórico de faturas está disponível em Faturamento no portal.
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.
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 (7, 30 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 cada ciclo de coleta, o codeDB classifica o período entre snapshots em um de cinco estados:
| 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 + PyInstaller → .exe | Servidor do cliente (Windows) |
| codedb-saas (API) | FastAPI + SQLAlchemy async + PostgreSQL + Redis | Render (Docker) |
| codedb-portal (Web) | Next.js 15 + MUI + TanStack Query + Recharts | Vercel |
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 C:\codeDB-Agent\Config.env contém todas as configurações do agente. Senhas são armazenadas com prefixo ENC: (criptografia Fernet/AES-128 gerenciada pelo Gerenciador de Instâncias).
| Variável | Tipo | Exemplo / Padrão |
|---|---|---|
| AGENT_TOKEN | string (obrigatório) | gerado no portal |
| CODEDB_API_URL | URL | https://monitorsql.onrender.com |
| 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) |
| LOG_LEVEL | string | INFO |
Para múltiplas instâncias, adicione prefixo INSTANCE_2_, INSTANCE_3_, etc. nas variáveis de cada instância adicional.
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.
Um único servidor Windows pode monitorar várias instâncias SQL Server. No portal, crie um Ambiente separado para cada instância — cada ambiente terá seu próprio token.
No arquivo Config.env, cada instância adicional usa o prefixo INSTANCE_N_:
# 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.
Para atualizar manualmente:
Config.env são preservadas durante a atualizaçãoA 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.
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) |
| 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.