8 min

Como construir um aplicativo web que rastreie a conformidade de SLA com precisão

Aprenda a projetar e construir um aplicativo web que rastreia conformidade de SLA: defina métricas, colete eventos, calcule resultados, alerte sobre violações e gere relatórios auditáveis.

Como construir um aplicativo web que rastreie a conformidade de SLA com precisão

Defina conformidade de SLA e o que você está construindo

Conformidade de SLA significa cumprir as promessas mensuráveis de um Service Level Agreement (SLA) — um contrato entre um provedor e um cliente. O trabalho do seu app é responder a uma pergunta simples com evidência: Cumprimos o que prometemos, para este cliente, durante este período?

Ajuda separar três termos relacionados:

  • SLI (Service Level Indicator): a medição bruta (por exemplo, “percentual de verificações bem-sucedidas”, “tempo até a primeira resposta”, ou “tempo de restauração do serviço”).
  • SLO (Service Level Objective): uma meta interna para um SLI (frequentemente mais rígida que o SLA). Exemplo: “meta de 99,95% de uptime.”
  • SLA: o compromisso acordado externamente, muitas vezes vinculado a créditos ou penalidades. Exemplo: “99,9% de uptime mensal.”

Métricas comuns de SLA que você irá rastrear

A maioria dos apps de rastreamento de SLA começa com um conjunto pequeno de métricas que se mapeiam a dados operacionais reais:

  • Uptime / disponibilidade: porcentagem de tempo em que o serviço está “up” durante o período de relatório.
  • Tempo de resposta (suporte): tempo desde a criação do ticket do cliente até a primeira resposta humana.
  • Tempo de resolução: tempo desde a criação do incidente/ticket até o fechamento ou restauração.
  • Janelas de disponibilidade: regras como “contar apenas horário comercial”, “excluir manutenção programada” ou “medir apenas das 08:00 às 18:00 no fuso horário do cliente”.

Quem usa o app — e por quê

Diferentes usuários querem a mesma verdade, apresentada de formas distintas:

  • Ops/SRE: detectar violações cedo e validar cronologias de incidentes.
  • Times de suporte: acompanhar compromissos de resposta e resolução por cliente.
  • Gerentes: ver tendências, riscos e se as equipes estão cumprindo metas consistentemente.
  • Clientes: visualizar relatórios transparentes (e às vezes uma página de status) mostrando o que aconteceu.

O que você está construindo (e o que não está)

Este produto trata de rastrear, provar e reportar: coletar sinais, aplicar regras acordadas e gerar resultados auditáveis. Não garante desempenho; mede — com precisão, consistência e de forma defensável futuramente.

Requisitos: métricas, regras e quem precisa do quê

Antes de projetar tabelas ou escrever código, fique claramente ciente do que “conformidade” significa para o seu negócio. A maioria dos problemas de rastreamento de SLA não é técnica — são problemas de requisitos.

Reúna as entradas (e não confie na memória)

Comece coletando as fontes da verdade:

  • Contratos de clientes e MSAs (incluindo anexos e adendos de ticketing)
  • Tiers de serviço (ex.: Básico vs. Premium) e quais clientes mapeiam para cada tier
  • Horário comercial e fusos horários por cliente (ou por serviço)
  • Exclusões e regras especiais: janelas de manutenção programada, força maior, atrasos causados pelo cliente, dependências de terceiros, períodos de carência

Escreva essas regras de forma explícita. Se uma regra não pode ser declarada claramente, ela não pode ser calculada de forma confiável.

Decida o que deve ser rastreado

Liste as “coisas” do mundo real que podem afetar um número de SLA:

  • Incidentes/outages (início, fim, severidade, serviços impactados)
  • Solicitações/tickets (criação, primeira resposta, resolução, pendente por cliente)
  • Manutenção (programada vs emergência; se conta contra disponibilidade)
  • Quedas parciais (degradação de performance) e se elas contam ou não

Também identifique quem precisa do quê: suporte quer risco de violação em tempo real, gerentes querem rollups semanais, clientes querem resumos simples (frequentemente para uma página de status).

Escolha 1–3 métricas para o primeiro release

Mantenha o escopo pequeno. Escolha o conjunto mínimo que prove o sistema ponta a ponta, como:

  • % de disponibilidade por serviço por mês
  • Tempo de resposta a incidentes (primeira resposta humana) dentro do horário comercial
  • Tempo para resolução para incidentes de severidade 1

Checklist de requisitos e critérios de sucesso

Crie uma checklist de uma página que você possa testar depois:

  • Definições claras de métrica (timestamps de início/fim, fuso horário, arredondamento)
  • Regras de inclusão/exclusão (manutenção, tempo aguardando cliente)
  • Limiares por tier (ex.: 99,9%, 1 hora de resposta)
  • Requisitos de output (relatório para cliente, dashboard interno, exportação)

Sucesso é quando duas pessoas calculam manualmente o mesmo mês de amostra e seu app bate exatamente com o resultado.

Modelo de dados para SLAs, serviços, incidentes e eventos

Um rastreador de SLA correto começa com um modelo de dados que consiga explicar por que um número é o que é. Se você não consegue rastrear um valor mensal de disponibilidade até os eventos e regras exatas usadas, terá disputas com clientes e incerteza interna.

Entidades centrais (mantenha-as simples e explícitas)

No mínimo, modele:

  • Customer (tenant/conta): possui serviços, calendários, contatos e preferências de relatório.
  • Service: o que é medido (API, app web, componente por região). Inclua relacionamento parent/child opcional para rollups.
  • Plan: um invólucro comercial (ex.: “Gold”), usado para associar um conjunto padrão de políticas de SLA.
  • SLA policy: regras mensuráveis: alvo de uptime, objetivo de tempo de resposta, janela de medição e o que conta como “excluído.”
  • Incident: agrupamento legível (título, severidade, cronologia) que referencia eventos subjacentes.
  • Event: fatos imutáveis (mudanças de estado, sinais de monitoramento, reconhecimentos) que impulsionam cálculos.

Uma relação útil é: customer → service → SLA policy (possivelmente via plan). Incidentes e eventos referenciam serviço e cliente.

Esquema mínimo para rastreamento baseado em tempo

Erros de tempo são a causa nº1 de matemática de SLA errada. Armazene:

  • occurred_at como UTC (timestamp com semântica de fuso horário)
  • received_at (quando seu sistema viu o evento)
  • source (nome do monitor, integração, manual)
  • external_id (para deduplicar retries)
  • payload (JSON bruto para debug futuro)

Também armazene customer.timezone (string IANA como America/New_York) para exibição e lógica de horário comercial, mas não use para reescrever o tempo do evento.

Horário de trabalho e feriados

Se SLAs de tempo de resposta pausam fora do horário comercial, modele calendários explicitamente:

  • working_hours por cliente (ou por região/serviço): dia da semana + horários de início/fim
  • holiday_calendar ligado a uma região ou cliente, com intervalos de datas e rótulos

Mantenha as regras dirigidas por dados para que ops possam atualizar um feriado sem fazer deploy.

Auditabilidade: bruto vs calculado

Armazene eventos brutos em uma tabela append-only e armazene resultados calculados separadamente (ex.: sla_period_result). Cada linha de resultado deve incluir: limites do período, versão das entradas (versão da política + versão do motor) e referências aos IDs de eventos usados. Isso torna recomputações seguras e fornece trilha de auditoria quando clientes perguntam “Quais minutos de outage vocês contaram?”.

Ingestão de eventos: como os dados chegam ao seu app

Seus números de SLA são tão confiáveis quanto os eventos que você ingere. O objetivo é simples: capturar toda mudança que importa (início de outage, incidente reconhecido, serviço restaurado) com timestamps consistentes e contexto suficiente para calcular conformidade depois.

Fontes comuns de eventos

A maioria das equipes puxa de uma mistura de sistemas:

  • Ticketing / ferramentas de incidente (Jira Service Management, ServiceNow, Zendesk): timestamps de criado/reconhecido/resolvido, mudanças de prioridade, alterações de responsável.
  • Ferramentas de monitoramento (Pingdom, Datadog, CloudWatch, Prometheus Alertmanager): sinais de up/down, alert fired/cleared, resultados sintéticos.
  • Logs de infra e aplicação: eventos de deploy, picos de erro, falhas de health check (úteis quando o monitoramento é ruidoso ou ausente).
  • Entradas manuais: uma pequena UI para “início/fim de outage verificado pelo negócio” ou “manutenção iniciada” quando a automação não sabe a verdade.

Opções de ingestão (e quando usá-las)

Webhooks geralmente são a melhor opção para precisão em tempo real e menor carga: o sistema origem empurra eventos para seu endpoint.

Polling é um fallback quando webhooks não estão disponíveis: seu app busca periodicamente mudanças desde o último cursor. Você precisará de tratamento de rate-limit e lógica “since” cuidadosa.

Importação CSV ajuda com backfills e migrações. Trate-a como caminho de ingestão de primeira classe para reprocessar períodos históricos sem hacks.

Um formato de evento recomendado (com idempotência)

Normalize tudo em um único formato interno de “evento”, mesmo que os payloads upstream variem:

  • event_id (obrigatório): único e estável entre retries. Prefira o GUID do fonte; caso contrário gere um hash determinístico.
  • source (obrigatório): ex.: datadog, servicenow, manual.
  • event_type (obrigatório): ex.: incident_opened, incident_acknowledged, service_down, service_up.
  • occurred_at (obrigatório): quando o evento aconteceu (não quando você o recebeu), com fuso horário.
  • received_at (sistema): quando seu app ingeriu o evento.
  • service_id (obrigatório): o serviço relevante ao SLA que o evento afeta.
  • incident_id (opcional, mas recomendado): liga múltiplos eventos a um incidente.
  • attributes (opcional): prioridade, região, segmento de cliente, etc.

Armazene event_id com restrição única para fazer a ingestão idempotente: retries não criam duplicatas.

Regras de validação que evitam dados ruins

Rejeite ou coloque em quarentena eventos que:

  • Têm timestamps ausentes/inválidos, ou occurred_at muito no futuro.
  • Não mapeiam para um service_id conhecido (ou requeira workflow explícito de “não mapeado”).
  • Duplicam um event_id existente.
  • Chegam fora de ordem de uma forma que quebra suas regras (mantenha-os, mas marque como “precisa revisão” em vez de sobrescrever silenciosamente).

Essa disciplina evita discussões sobre relatórios de SLA depois — porque você poderá apontar para entradas limpas e rastreáveis.

Motor de cálculo de SLA: transformando eventos em conformidade

Seu motor de cálculo é onde “eventos brutos” se transformam em resultados de SLA que você pode defender. A chave é tratá-lo como contabilidade: regras determinísticas, entradas claras e trilha reexecutável.

Comece com uma linha do tempo normalizada

Converta tudo em um único stream ordenado por incidente (ou por impacto de serviço):

  • timestamps (UTC) para: incidente iniciado, reconhecido/primeira resposta, mitigado, resolvido, reaberto
  • mudanças de estado: pausado/despausado, aguardando cliente, manutenção ativa
  • escopo: quais serviço(s) e cliente(s) são impactados, e com qual severidade

A partir dessa linha do tempo, compute durações somando intervalos, não subtraindo duas timestamps cegamente.

Time-to-first-response (TTFR) e time-to-resolution (TTR)

Defina TTFR como o tempo decorrido “cobrável” entre incident_start e first_agent_response (ou acknowledged, dependendo da redação do SLA). Defina TTR como o tempo decorrido “cobrável” entre incident_start e resolved.

“Cobrável” significa remover intervalos que não devem contar:

  • fora do horário comercial (para SLAs restritos a horário comercial)
  • pausas explícitas (ex.: “aguardando cliente”)\
  • exclusões como manutenção programada ou atrasos causados pelo cliente

Detalhe de implementação: armazene uma função de calendário (horário comercial, feriados) e uma função de regras que recebe uma linha do tempo e retorna intervalos cobrados.

Quedas parciais e incidentes multi-serviço

Decida antecipadamente se você calcula:

  • SLAs por serviço (recomendado): um incidente pode produzir múltiplos registros de impacto por serviço, cada um com seu próprio TTFR/TTR
  • SLAs por cliente: o mesmo outage pode afetar apenas um subconjunto de tenants

Para quedas parciais, aplique ponderação por impacto apenas se o contrato exigir; caso contrário trate “degradado” como uma categoria separada de violação.

Rastreabilidade: armazene entradas, saídas e replays

Cada cálculo deve ser reprodutível. Persista:

  • os eventos exatos usados (com ids, timestamps e source)
  • os intervalos derivados (o que foi excluído e por quê)
  • os resultados finais (TTFR, TTR, flags de violação e versão da regra)

Quando regras mudam, você pode reexecutar cálculos por versão sem reescrever histórico — crucial para auditorias e disputas com clientes.

Lógica de relatório: períodos, disponibilidade e casos de contorno

Experimente sem medo
Itere com segurança usando snapshots e rollback enquanto ajusta os cálculos de SLA.

Relatórios é onde o rastreamento de SLA ganha ou perde confiança. Seu app deve deixar claro qual intervalo de tempo está sendo medido, quais minutos contam e como os números finais foram derivados.

Períodos: calendário, faturamento e janelas rolling

Dê suporte aos períodos de relatório que os clientes realmente usam:

  • Mensal/Trimestre calendárico (ex.: 1–31 de março)
  • Ciclo de faturamento (ex.: 15 do mês – 14 do mês, alinhado a faturas)
  • Janelas rolling (ex.: “últimos 30 dias” atualizado diariamente)

Armazene períodos como timestamps explícitos de início/fim (não “mês = 3”) para poder reproduzir cálculos depois e explicar resultados.

Disponibilidade: minutos totais vs minutos elegíveis

Uma fonte frequente de confusão é se o denominador é o período todo ou apenas o tempo “elegível”.

Defina dois valores por período:

  • Minutos elegíveis: minutos que contam para o SLA (frequentemente exclui manutenção programada, outages causados pelo cliente, ou tempos fora do horário de suporte)
  • Minutos de downtime: minutos elegíveis onde o serviço é considerado down

Então calcule:

availability_percent = 100 * (eligible_minutes - downtime_minutes) / eligible_minutes

Se eligible_minutes puder ser zero (por exemplo, um serviço monitorado apenas em horário comercial e o período não conter nenhum), defina a regra antecipadamente: “N/A” ou trate como 100% — mas seja consistente e documente.

Transformando números em passar/falhar claro

A maioria dos SLAs precisa de porcentagem e um resultado binário.

  • Porcentagem: ex.: 99,95% para o período
  • Pass/Fail: comparar com o alvo do SLA (ex.: aprova se ≥ 99,9%)

Também mantenha a “distância até a violação” (orçamento de downtime restante) para que dashboards possam alertar antes do limite ser cruzado.

Casos de contorno que você deve tratar deliberadamente

  • Fusos horários: escolha um fuso de relatório por cliente/contrato (geralmente o do cliente) e converta eventos de forma consistente.
  • Horário de verão (DST): nunca assuma que um dia tem 1440 minutos. Use timestamps com aware de fuso horário para que o comprimento do período esteja correto nas transições de DST.
  • Faltando timestamps de fim: incidentes às vezes não têm timestamp de resolução. Trate-os como “abertos” e limite-os ao fim do relatório, marcando o registro para limpeza.

Por fim, mantenha as entradas brutas (eventos incluídos/excluídos e ajustes) para que cada relatório responda “por que esse número é o que é?” sem rodeios.

UI e dashboards que tornam o status de SLA óbvio

Seu motor de cálculo pode ser perfeito e ainda falhar com os usuários se a UI não responder à pergunta básica: “Estamos cumprindo o SLA agora, e por quê?” Projete o app para que cada tela comece com um status claro, depois permita que as pessoas investiguem números e eventos brutos que os produziram.

Visões principais para construir

Dashboard de visão geral (para operadores e gerentes). Comece com um pequeno conjunto de tiles: conformidade do período atual, disponibilidade, conformidade de tempo de resposta e “tempo restante antes da violação”, quando aplicável. Prefira rótulos explícitos (ex.: “Disponibilidade (este mês)” em vez de apenas “Uptime”). Se você suportar múltiplos SLAs por cliente, mostre primeiro o pior status e permita expandir.

Detalhe do cliente (para times de conta e relatórios ao cliente). Uma página do cliente deve resumir todos os serviços e tiers de SLA para aquele cliente, com um estado simples de passa/aviso/falha e uma explicação curta (“2 incidentes contados; 18m de downtime contabilizados”). Adicione links para /status (se você fornecer uma página de status pública) e para exportar o relatório.

Detalhe do serviço (para investigação profunda). Mostre aqui as regras exatas de SLA, a janela de cálculo e a decomposição de como o número de conformidade foi formado. Inclua um gráfico de disponibilidade ao longo do tempo e uma lista de incidentes que contaram para o SLA.

Linha do tempo de incidente (para auditorias). Uma visão única de incidente deve mostrar uma linha do tempo dos eventos (detectado, reconhecido, mitigado, resolvido) e quais timestamps foram usados para métricas de “resposta” e “resolução”.

Filtros que correspondem a perguntas reais

Faça os filtros consistentes entre telas: intervalo de datas, cliente, serviço, tier e severidade. Use as mesmas unidades em todos os lugares (minutos vs segundos; porcentagens com os mesmos decimais). Quando o usuário muda o intervalo de datas, atualize todas as métricas na página para não haver desencontro.

Detalhamento sem perder confiança

Cada métrica resumo deve ter um caminho “Por quê?”:

  • De uma porcentagem de conformidade → lista de incidentes contados no período
  • De um incidente → eventos brutos e timestamps derivados usados nos cálculos
  • Da disponibilidade → intervalos de downtime com fontes (evento de monitoramento vs ajuste manual)

Use tooltips com moderação para definir termos como “Downtime excluído” ou “Horário comercial”, e mostre o texto exato da regra na página do serviço para evitar suposições.

Mantenha simples, mas inequívoco

Prefira linguagem simples em vez de abreviações (“Tempo de resposta” em vez de “MTTA” a menos que seu público espere). Para status, combine cor com rótulo textual (“Em risco: 92% do orçamento de erro usado”) para evitar ambiguidade. Se o app suportar logs de auditoria, adicione uma pequena caixa “Última mudança” nas regras de SLA com link para /settings/audit-log para que usuários verifiquem quando definições mudaram.

Alertas e notificações para violações

Reduza o custo do seu build
Ganhe créditos compartilhando o que você construiu ou indicando outras pessoas para Koder.ai.

Alertas é onde seu app de rastreamento de SLA passa de relatório passivo a auxiliar times a evitar penalidades. Os melhores alertas são oportunos, específicos e acionáveis — ou seja, dizem o que fazer a seguir, não apenas que algo “está ruim”.

Defina gatilhos que correspondam a decisões reais

Comece com três tipos de gatilho:

  • Aproximação de violação: ex.: “Você tem 30 minutos restantes para cumprir o SLA de tempo de resposta”, ou “Disponibilidade deste mês caiu para 99,92% e o SLA é 99,9%.” Esse é o alerta mais valioso porque permite recuperação.
  • Violação ocorrida: disparado quando o motor de cálculo confirma que o SLA foi perdido para a janela relevante.
  • Violações repetidas: detecte padrões como “3 violações em 30 dias” ou “mesmo serviço violado duas vezes nesta semana”, que frequentemente indicam problema sistêmico.

Torne os gatilhos configuráveis por cliente/serviço/SLA, já que contratos diferentes toleram limites diferentes.

Escolha canais e mantenha as mensagens acionáveis

Envie alertas para onde as pessoas realmente respondem:

  • Email para notificações auditáveis e stakeholders externos.
  • Slack para coordenação interna rápida.
  • SMS (opcional) para escalões de alta severidade.

Todo alerta deve incluir deep links como /alerts, /customers/{id}, /services/{id} e a página de detalhe do incidente para que os respondedores verifiquem números rapidamente.

Reduza ruído: deduplicação, horas de silêncio, escalonamento

Implemente deduplicação agrupando alertas com a mesma chave (customer + service + SLA + period) e suprimindo repetições por uma janela de cooldown.

Adicione horas de silêncio (por time zone da equipe) para que alertas não críticos de “aproximação de violação” aguardem o horário comercial, enquanto “violação ocorrida” pode ignorar horas de silêncio se a severidade for alta.

Por fim, suporte regras de escalonamento (ex.: notificar on-call após 10 minutos, escalar para um gerente após 30) para evitar que alertas fiquem presos em uma caixa de entrada.

Controle de acesso, autenticação e logs de auditoria

Dados de SLA são sensíveis porque expõem desempenho interno e direitos específicos de clientes. Trate controle de acesso como parte da “matemática” do SLA: o mesmo incidente pode produzir resultados diferentes dependendo de qual SLA é aplicado.

Papéis para suportar desde o início

Mantenha papéis simples e depois refine para permissões mais granulares.

  • Admin: configurações globais, gerencia serviços, SLAs, usuários, integrações e itens de faturamento.
  • Agente: cria/atualiza incidentes e janelas de manutenção, anexa eventos e adiciona notas de postmortem.
  • Gerente: lê tudo no seu escopo, aprova definições de SLA e exporta relatórios.
  • Visualizador cliente: vê apenas seus próprios serviços, metas de SLA, histórico de incidentes e relatórios voltados ao cliente.

Um padrão prático é RBAC + escopo por tenant:

  • Cada registro (serviço, política de SLA, relatório) tem um owner tenant/customer.
  • Usuários internos podem ter escopo em múltiplos tenants; visualizadores de cliente a exatamente um.
  • Permissões de edição são mais restritas que as de visualização: por exemplo, agentes podem editar incidentes mas não alterar regras de SLA.

O que cada papel pode ver/editar

Seja explícito sobre dados específicos do cliente:

  • Visualizadores de cliente nunca devem ver campos internos (hipóteses de causa raiz, severidade interna, notas de on-call, tags privadas).
  • Políticas de SLA devem ser versionadas para que um cliente possa ver os termos do SLA que se aplicavam no momento do incidente.

Opções de autenticação que não te limitam

Comece com email/senha e exija MFA para papéis internos. Planeje SSO (SAML/OIDC) separando identidade (quem é) de autorização (o que pode acessar). Para integrações, emita API keys vinculadas a contas de serviço com escopos estreitos e suporte a rotação.

Logs de auditoria que você agradecerá

Adicione entradas de auditoria imutáveis para:

  • Mudanças nas regras de SLA (limiares, calendários, exclusões, mapeamento a serviços/clientes)
  • Edições de incidentes (timestamps, transições de status, overrides manuais de downtime)
  • Mudanças de permissões e chaves de API

Armazene quem, o que mudou (antes/depois), quando, onde (IP/user agent) e um ID de correlação. Torne logs de auditoria pesquisáveis e exportáveis (ex.: /settings/audit-log).

Design de API para integrações e automação

Um app de rastreamento de SLA raramente é uma ilha. Você precisará de uma API que permita que ferramentas de monitoramento, ticketing e workflows internos criem incidentes, enviem eventos e puxem relatórios sem trabalho manual.

Comece com uma superfície pequena e previsível

Use um path versionado (por exemplo, /api/v1/...) para evoluir payloads sem quebrar integrações existentes.

EndPoints essenciais para cobrir a maioria dos casos:

  • Events: POST /api/v1/events para ingerir mudanças de estado (up/down, amostras de latência, janelas de manutenção). GET /api/v1/events para auditoria e debug.
  • Incidents: POST /api/v1/incidents, PATCH /api/v1/incidents/{id} (acknowledge, resolve, assign), GET /api/v1/incidents.
  • SLAs: GET /api/v1/slas, POST /api/v1/slas, PUT /api/v1/slas/{id} para gerenciar contratos e limiares.
  • Reports: GET /api/v1/reports/sla?service_id=...&from=...&to=... para resumos de conformidade.
  • Alerts: POST /api/v1/alerts/subscriptions para gerenciar webhooks/alvos de email; GET /api/v1/alerts para histórico de alertas.

Torne paginação e filtros consistentes

Escolha uma convenção e use em todo lugar. Por exemplo: paginação por limit + cursor, mais filtros padrão como service_id, sla_id, status, from e to. Mantenha ordenação previsível (ex.: sort=-created_at).

Defina respostas de erro que integradores possam confiar

Retorne erros estruturados com campos estáveis:

{ "error": { "code": "VALIDATION_ERROR", "message": "service_id is required", "fields": { "service_id": "missing" } } }

Use status HTTP claros (400 validação, 401/403 auth, 404 not found, 409 conflict, 429 rate limit). Para ingestão de eventos, considere idempotência (Idempotency-Key) para que retries não dupliquem incidentes.

Limites de taxa e segurança básica

Aplique rate limits razoáveis por token (e limites mais estritos para endpoints de ingestão), sanitize inputs e valide timestamps/fusos. Prefira tokens de API com escopo (somente leitura vs escrita em incidents) e sempre logue quem chamou qual endpoint para rastreabilidade (detalhes na seção de logs de auditoria em /blog/audit-logs).

Estratégia de testes: prove que os números estão corretos

Adicione um portal para clientes
Crie visões para clientes que expliquem aprovação ou falha com detalhamento claro dos incidentes.

Números de SLA só são úteis se as pessoas confiarem neles. Testes para um app de rastreamento de SLA devem focar menos em “a página carrega” e mais em “a matemática do tempo se comporta exatamente como o contrato diz.” Trate suas regras de cálculo como um recurso do produto com sua própria suíte de testes.

Teste unitário das regras com linhas do tempo fixas

Comece testando unitariamente seu motor de cálculo com inputs determinísticos: uma linha do tempo de eventos (incidente aberto, reconhecido, mitigado, resolvido) e um conjunto de regras de SLA claramente definido.

Use timestamps fixos e “congele o tempo” para que seus testes nunca dependam do relógio. Cubra casos de contorno que frequentemente quebram relatórios de SLA:

  • Incidente começa antes do período de relatório e termina dentro dele
  • Incidentes sobrepostos (downtime deve mesclar ou empilhar?)
  • Múltiplas pausas (manutenção, atraso do cliente)
  • Minutos/segundos de fronteira (exatamente em 00:00, fim de mês, ano bissexto)

Testes end-to-end para todo o pipeline

Adicione um pequeno conjunto de testes E2E que rodem o fluxo completo: ingerir eventos → calcular conformidade → gerar relatório → renderizar UI. Isso detecta desencontros entre “o que o motor calculou” e “o que o dashboard mostra”. Mantenha os cenários poucos, mas de alto valor, e asserte nos números finais (%, violação sim/não, tempo para ack).

Construa fixtures reutilizáveis para calendários e fusos

Crie fixtures de teste para horários comerciais, feriados e fusos. Você quer casos repetíveis como “incidente ocorre sexta 17:55 horário local” e “feriado desloca a contagem do tempo de resposta”.

Monitore o próprio app de SLA

Testes não terminam no deploy. Adicione monitoramento para falhas de jobs, tamanho da fila/backlog, duração de recalculo e taxas de erro. Se ingestão atrasar ou um job noturno falhar, seu relatório pode ficar errado mesmo com código correto.

Deploy, operações e um roadmap MVP prático

Lançar um app de rastreamento de SLA é menos sobre infraestrutura sofisticada e mais sobre operações previsíveis: seus cálculos devem rodar a tempo, dados precisam estar seguros e relatórios reproduzíveis.

Um caminho de deploy simples e confiável

Comece com serviços gerenciados para focar na correção:

  • Banco gerenciado (PostgreSQL): backups automáticos, point-in-time recovery, criptografia.
  • Hospedagem de containers para web/API (plataforma gerenciada): rollbacks fáceis e ambientes consistentes.
  • Armazenamento de objetos para exports (CSV/PDF) e artefatos grandes, com regras de lifecycle.

Mantenha ambientes mínimos: dev → staging → prod, cada um com seu BD e secrets.

Jobs em background necessários desde o dia 1

Rastreamento de SLA não é puro request/response; depende de trabalho agendado.

  • Jobs de cálculo: recomputar janelas de SLA a partir de novos eventos e reexecutar após chegada tardia de dados.
  • Geração de relatórios: resumos diários/mensais, exports prontos para cliente.
  • Higiene de dados: arquivar eventos brutos antigos, compactar tabelas derivadas, verificar integridade referencial.

Rode jobs via processo worker + fila, ou um scheduler gerenciado invocando endpoints internos. Faça jobs idempotentes (seguros para retry) e registre cada execução para auditoria.

Retenção e exports (sem exagerar)

Defina retenção por tipo de dado: mantenha resultados derivados por mais tempo que eventos brutos. Para exports, ofereça CSV primeiro (rápido, transparente), depois templates PDF. Seja claro: exports são “formatos best-effort”, enquanto o banco é a fonte da verdade.

Roadmap faseado que mantém o escopo sob controle

  1. MVP: um serviço, um SLA, um fuso horário, dashboard básico + relatório mensal.
  2. Mais métricas: SLAs de tempo de resposta, janelas de manutenção, exclusões, múltiplos calendários.
  3. Portal do cliente: visões por cliente, controle de acesso, relatórios para download.
  4. Página de status: páginas públicas/privadas apoiadas pela disponibilidade computada (veja /blog/status-pages).

Prototipar mais rápido com Koder.ai (opcional)

Se quiser validar seu modelo de dados, fluxo de ingestão e UI de relatórios rapidamente, uma plataforma de vibe-coding como Koder.ai pode ajudar a chegar a um protótipo ponta a ponta sem comprometer um ciclo de engenharia completo. Como o Koder.ai gera aplicações completas via chat (UI web + backend), é uma forma prática de montar:

  • um dashboard React para conformidade, budgets de erro e timelines de drill-down,
  • um backend Go + PostgreSQL para armazenar eventos brutos e resultados de período,
  • endpoints de export/relatório e visões simples de portal do cliente.

Uma vez comprovados requisitos e cálculos (a parte difícil), você pode iterar, exportar o código-fonte e entrar em um fluxo de build-and-operate tradicional — mantendo funcionalidades como snapshots e rollback durante a iteração rápida.

Perguntas frequentes

O que significa “conformidade de SLA” em um app de rastreamento de SLA?

Um rastreador de SLA responde a uma pergunta com evidência: nós cumprimos os compromissos contratuais para um cliente e período de tempo específicos?

Na prática, isso significa ingerir sinais brutos (monitoramento, tickets, atualizações manuais), aplicar as regras do cliente (horário comercial, exclusões) e produzir um resultado auditável com status de aprovação/fracasso e detalhes de suporte.

Como SLI, SLO e SLA são diferentes — e por que o app deve modelá-los separadamente?

Use:

  • SLI para a medição bruta (por exemplo, % de verificações bem-sucedidas, tempo até a primeira resposta).
  • SLO para sua meta interna (frequentemente mais rígida que o contrato).
  • SLA para o compromisso externo (geralmente atrelado a créditos ou penalidades).

Modele-os separadamente para que você possa melhorar a confiabilidade (SLO) sem alterar inadvertidamente os relatórios contratuais (SLA).

Quais métricas de SLA devo implementar primeiro para um MVP?

Um MVP forte normalmente rastreia 1–3 métricas de ponta a ponta:

  • Percentual de disponibilidade por serviço por mês
  • Tempo até a primeira resposta humana (TTFR) (geralmente apenas em horário comercial)
  • Tempo até a resolução (TTR) para incidentes de alta severidade

Essas métricas mapeiam bem para fontes de dados reais e forçam a implementação das partes mais difíceis (períodos, calendários, exclusões) desde cedo.

Quais entradas eu preciso antes de projetar o banco de dados ou escrever o calculador?

Falhas de requisitos geralmente vêm de regras não explicitadas. Colete e documente:

  • Texto do contrato/SLA (incluindo adendos)
  • Mapeamento de tiers (qual cliente está em qual plano)
  • Fuso horário e horário comercial por cliente/serviço
  • Exclusões explícitas (manutenção, atrasos causados pelo cliente, força maior, períodos de carência)

Se uma regra não puder ser expressa claramente, não a “invente” no código — marque-a e esclareça com o responsável.

Qual é o modelo de dados mínimo para um rastreador de SLA confiável?

Comece com entidades simples e explícitas:

  • Cliente (tenant)
  • Serviço (o que é medido)
  • Plano (envelope comercial)
  • Política de SLA (metas + janelas + exclusões)
  • Incidente (container legível por humanos)
  • Evento (fatos imutáveis usados no cálculo)

Priorize rastreabilidade: todo número reportado deve ligar de volta a IDs de evento específicos e uma versão de política.

Como devo armazenar timestamps e lidar com fusos horários (incluindo DST)?

Armazene o tempo corretamente e de forma consistente:

  • Salve occurred_at em UTC com semântica de fuso horário
  • Também armazene received_at (quando foi ingerido)
  • Guarde o fuso horário IANA do cliente para exibição e lógica de horário comercial, não para reescrever históricos

Depois, torne períodos explícitos (timestamps de início/fim) para reproduzir relatórios — mesmo através de mudanças de DST.

Como devo ingerir eventos de forma confiável sem duplicados ou dados ruins corrompendo relatórios?

Normalize tudo em uma única forma de evento interno com um ID estável:

  • event_id (único, estável entre retries)
  • source, event_type, occurred_at, service_id
  • Opcional: incident_id e attributes

Aplique idempotência com uma restrição única em event_id. Para mapeamentos ausentes ou chegadas fora de ordem, coloque em quarentena/flag — não “corrija” silenciosamente os dados.

Como calcular TTFR/TTR corretamente quando horários comerciais, pausas e exclusões se aplicam?

Calcule durações somando intervalos em uma linha do tempo, não subtraindo dois timestamps sem contexto.

Defina explicitamente o “tempo cobrável” removendo intervalos que não contam, como:

  • fora do horário comercial
  • pausas “aguardando cliente”
  • manutenção programada (se excluída pela política)

Persista os intervalos derivados e os códigos de motivo para poder explicar exatamente o que foi contado.

Como a disponibilidade deve ser calculada (minutos elegíveis vs minutos totais)?

Rastreie dois denominadores explicitamente:

  • Minutos elegíveis (os minutos que contam para o SLA)
  • Minutos de downtime (minutos elegíveis em que o serviço está considerado down)

Então calcule:

availability_percent = 100 * (eligible_minutes - downtime_minutes) / eligible_minutes

Também decida o que acontece se eligible_minutes for zero (por exemplo, mostre N/A). Documente essa regra e aplique consistentemente.

O que dashboards e alertas devem incluir para serem úteis (e não gerar ruído)?

Faça a UI responder “estamos cumprindo o SLA, e por quê?” num relance:

  • Mostre conformidade no período atual + “distância até a violação” (orçamento de downtime restante)
  • Ofereça caminho de detalhamento: métrica → incidentes contados → eventos brutos/intervalos derivados
  • Use rótulos explícitos (“Disponibilidade (este mês)”) e exiba o texto exato da regra de SLA na página do serviço

Para alertas, priorize gatilhos acionáveis: aproximação de violação, violação ocorrida e violações repetidas — cada um linkando para páginas relevantes como /customers/{id} ou /services/{id}.

Related posts