Assessment técnico em engenharia: como mapear riscos e gargalos antes que virem incidentes
Introdução
Incidentes graves raramente surgem sem sinais anteriores.
Um banco de dados que começa a apresentar aumento gradual de latência, um cluster Kubernetes com requests incompatíveis com o consumo real, aplicações sem readinessProbe, filas crescendo silenciosamente, workloads críticos executando em um único nó ou contas de serviço com permissões excessivas são exemplos de situações que podem permanecer invisíveis durante meses.
Até que alguma mudança de tráfego, deploy ou falha de infraestrutura transforme aquela fragilidade em indisponibilidade.
É justamente nesse ponto que entra o assessment técnico de engenharia.
Um assessment técnico é uma análise estruturada de arquitetura, infraestrutura, aplicações, segurança, observabilidade, capacidade, custos e práticas operacionais. Seu objetivo não é apenas identificar erros existentes, mas principalmente encontrar condições que podem evoluir para incidentes.
Em ambientes modernos compostos por Kubernetes, AWS, microsserviços, bancos distribuídos, pipelines CI/CD e dezenas de integrações, analisar somente se "o sistema está funcionando" é insuficiente.
A pergunta correta é:
O sistema continuará funcionando quando houver aumento de carga, perda de infraestrutura, deploy defeituoso ou falha de dependência?
Um assessment bem executado responde essa pergunta antes que a produção responda da pior maneira possível.
O que é um assessment técnico
Um technical assessment é uma avaliação sistemática do estado técnico de uma plataforma ou sistema.
Ele analisa não apenas componentes isolados, mas principalmente como eles se relacionam.
Um assessment pode envolver:
- arquitetura;
- infraestrutura;
- Kubernetes;
- Cloud;
- aplicações;
- bancos de dados;
- mensageria;
- CI/CD;
- segurança;
- observabilidade;
- escalabilidade;
- confiabilidade;
- custos;
- processos operacionais.
O resultado normalmente é um mapa de riscos contendo:
Estado atual → Evidência → Risco → Impacto → Prioridade → Recomendação
Por exemplo:
Workload:
payment-api
Estado atual:
2 réplicas executando no mesmo worker node
Risco:
falha do node derruba todas as réplicas
Impacto:
indisponibilidade completa da API
Recomendação:
topologySpreadConstraints + PodDisruptionBudget
Prioridade:
AltaO assessment não deve ser confundido com auditoria formal.
Uma auditoria normalmente verifica aderência a requisitos ou normas.
Já o assessment de engenharia busca responder perguntas como:
- Onde estão nossos Single Points of Failure?
- O cluster suporta aumento de tráfego?
- O banco possui capacidade suficiente?
- Quanto tempo demoramos para detectar uma falha?
- Um deploy pode derrubar o ambiente?
- Temos recursos superdimensionados?
- Temos workloads sem limites?
- Existem permissões excessivas?
- Conseguimos recuperar o ambiente após uma falha?
Principais conceitos
Risco
Risco representa a combinação entre:
Probabilidade de falha × Impacto da falhaUma maneira simples de classificar riscos é utilizar:
| Probabilidade | Impacto | Prioridade |
|---|---|---|
| Baixa | Baixo | Baixa |
| Alta | Baixo | Média |
| Baixa | Alto | Média |
| Alta | Alto | Crítica |
Um problema de baixa probabilidade, mas com impacto catastrófico, também merece atenção.
Um exemplo clássico é banco de produção sem backup validado.
Talvez nunca seja necessário restaurá-lo.
Mas, quando for necessário, descobrir que o backup não funciona pode ser fatal.
Gargalo
Gargalo é um recurso ou componente que limita a capacidade do sistema.
Pode existir em diferentes camadas:
Aplicação
↓
CPU
↓
Memória
↓
Network
↓
Banco de dados
↓
Storage
↓
Dependência externaUm erro comum é assumir que alta latência significa falta de CPU.
Na prática, a causa pode estar em:
- conexões de banco saturadas;
- consultas SQL lentas;
- DNS;
- garbage collection;
- pool HTTP;
- lock distribuído;
- IOPS;
- filas acumuladas;
- chamadas externas.
O assessment deve observar o sistema inteiro
Um assessment técnico eficiente analisa diferentes dimensões simultaneamente.
Arquitetura
Perguntas importantes:
- Existem Single Points of Failure?
- As dependências são síncronas ou assíncronas?
- Existe isolamento entre serviços?
- Existe retry?
- Retry possui limite?
- Existe timeout?
- Existe circuit breaker?
- Uma falha de serviço pode gerar efeito cascata?
Considere:
API
↓
Service A
↓
Service B
↓
Service C
↓
BancoSe todos os serviços utilizarem timeouts de 30 segundos e múltiplos retries, uma falha no banco poderá bloquear centenas de threads simultaneamente.
O resultado pode ser um retry storm.
Uma arquitetura mais resiliente pode utilizar:
API
↓
Service
↓
Queue
↓
Worker
↓
DatabaseA fila absorve picos e reduz acoplamento temporal entre sistemas.
Arquitetura e funcionamento de um assessment
Um assessment pode ser organizado no seguinte fluxo:
Inventário
↓
Arquitetura
↓
Infraestrutura
↓
Aplicações
↓
Capacidade
↓
Observabilidade
↓
Segurança
↓
FinOps
↓
Riscos
↓
Plano de açãoO primeiro passo é entender o ambiente.
Não faz sentido avaliar Kubernetes sem entender:
- quais aplicações são críticas;
- quais dependências existem;
- qual banco é utilizado;
- qual volume de tráfego existe;
- quais serviços podem ficar indisponíveis.
Depois disso, a análise passa para evidências técnicas.
Exemplos:
kubectl get nodes -o wide
kubectl get pods -A -o wide
kubectl get deployments -A
kubectl get statefulsets -A
kubectl get hpa -A
kubectl get pdb -A
kubectl get networkpolicy -AO objetivo é montar um mapa real do ambiente.
Exemplo do dia a dia
Considere uma empresa SaaS executando dezenas de microsserviços em Amazon EKS.
A arquitetura possui:
Internet
↓
ALB
↓
Ingress Controller
↓
Kubernetes
↓
APIs
↓
RabbitMQ
↓
Workers
↓
PostgreSQLDurante um assessment são encontrados os seguintes pontos:
API crítica:
2 réplicas
Nodes:
3
PodDisruptionBudget:
não configurado
Topology Spread:
não configurado
CPU Request:
100m
CPU real:
700m
HPA:
não configuradoA aplicação funciona normalmente.
Porém existe um problema.
As duas réplicas podem ser agendadas no mesmo node.
Se esse node falhar:
Node
├── API Pod 1
└── API Pod 2a aplicação fica indisponível.
O assessment identifica o risco antes do incidente.
A correção seria distribuir as réplicas.
Exemplo YAML: distribuição de pods
apiVersion: apps/v1
kind: Deployment
metadata:
name: payment-api
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: payment-api
template:
metadata:
labels:
app: payment-api
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: payment-api
containers:
- name: api
image: company/payment-api:2.4.1
ports:
- containerPort: 8080
resources:
requests:
cpu: 300m
memory: 512Mi
limits:
cpu: "1"
memory: 1Gi
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 20
periodSeconds: 20A configuração utiliza topologySpreadConstraints para tentar distribuir os pods entre diferentes nodes.
O parâmetro:
topologyKey: kubernetes.io/hostnameindica que a distribuição deve considerar hosts diferentes.
Já:
whenUnsatisfiable: DoNotScheduleimpede que o scheduler coloque pods adicionais caso a regra não possa ser respeitada.
Em produção, essa decisão deve ser avaliada cuidadosamente.
Em clusters pequenos, uma regra muito rígida pode deixar pods em estado Pending.
PodDisruptionBudget
Outro risco comum encontrado durante assessments é a ausência de PodDisruptionBudget (PDB).
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: payment-api
namespace: production
spec:
minAvailable: 2
selector:
matchLabels:
app: payment-apiEsse PDB determina que pelo menos duas réplicas devem permanecer disponíveis durante interrupções voluntárias.
Por exemplo:
Node drain
Upgrade do cluster
Karpenter consolidation
Atualização de nodegroupSem PDB, múltiplos pods de uma aplicação crítica podem ser removidos simultaneamente.
O PDB, entretanto, não protege contra falhas inesperadas de node.
Ele controla apenas disrupções voluntárias.
Assessment de recursos Kubernetes
Um dos pontos mais importantes em clusters Kubernetes é comparar:
requests
limits
uso real
capacidade dos nodesConsidere:
resources:
requests:
cpu: 2
memory: 4Gi
limits:
cpu: 4
memory: 8GiMas a aplicação utiliza:
CPU média: 180m
Memória média: 600MiO cluster estará reservando muito mais capacidade do que realmente precisa.
O scheduler trabalha principalmente baseado em requests.
Portanto:
requests superdimensionados
↓
menos pods por node
↓
mais nodes
↓
mais custoEsse é um dos problemas mais comuns encontrados durante assessments FinOps.
Assessment de capacidade
Uma plataforma deve ser analisada considerando três números:
Uso médio
Uso de pico
Capacidade máximaExemplo:
Node Pool
Capacidade CPU:
64 vCPU
Requests:
52 vCPU
Uso real:
22 vCPUÀ primeira vista existe muita capacidade ociosa.
Entretanto o scheduler considera os 52 vCPU de requests.
Isso significa que novos pods poderão ficar Pending mesmo que o uso real seja muito menor.
Um assessment deve identificar essas distorções.
Horizontal Pod Autoscaler
Outro ponto importante é verificar se aplicações conseguem reagir ao aumento de carga.
Exemplo:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: payment-api
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: payment-api
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 65
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 60
scaleDown:
stabilizationWindowSeconds: 300Esse HPA escala a aplicação quando a utilização de CPU em relação aos requests aumenta.
É importante entender essa relação.
Se o request estiver incorreto:
CPU real: 600m
CPU request: 2000mo HPA poderá interpretar:
600 / 2000 = 30%e não escalar.
Portanto o assessment deve analisar HPA e requests conjuntamente.
Exemplo em ambiente de produção
Considere uma plataforma contendo:
AWS
└── EKS
├── APIs
├── Workers
├── Redis
├── RabbitMQ
├── PostgreSQL
├── Prometheus
├── Grafana
└── LokiO assessment identifica:
1. Nodes distribuídos apenas em uma AZ
2. APIs sem PDB
3. Workers sem autoscaling
4. RabbitMQ sem monitoramento de fila
5. Banco próximo de 90% do storage
6. NetworkPolicy inexistente
7. ServiceAccounts compartilhadas
8. Logs sem retenção definida
9. Requests superdimensionados
10. Alertas baseados apenas em CPUNenhum desses pontos necessariamente causa incidente naquele momento.
Porém todos representam riscos acumulados.
O maior valor do assessment está justamente nisso:
detectar problemas enquanto eles ainda são baratos de resolverAvaliação de banco de dados
Um assessment também deve analisar banco.
No PostgreSQL, alguns pontos importantes incluem:
SELECT
datname,
numbackends
FROM pg_stat_database;Para identificar queries lentas, quando pg_stat_statements estiver disponível:
SELECT
query,
calls,
mean_exec_time,
total_exec_time
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;Outros pontos devem ser avaliados:
- número de conexões;
- locks;
- índices;
- queries lentas;
- crescimento de tabelas;
- WAL;
- replicação;
- backup;
- restore;
- IOPS;
- storage.
Um ambiente pode estar saudável em CPU e mesmo assim sofrer gargalo de banco.
Mensageria
Sistemas assíncronos precisam de métricas específicas.
Para RabbitMQ, por exemplo:
messages_ready
messages_unacknowledged
consumer count
publish rate
ack rate
queue depthConsidere:
Publish rate:
1.000 mensagens/s
Consume rate:
800 mensagens/sO sistema está acumulando:
200 mensagens/sApós uma hora:
720.000 mensagensMesmo sem erro aparente, existe um gargalo estrutural.
O assessment deve identificar essa diferença antes que a fila cresça até comprometer memória, disco ou SLA.
Observabilidade
Um assessment técnico não pode analisar somente infraestrutura.
Também deve analisar se o time consegue enxergar problemas.
Uma arquitetura moderna costuma possuir:
Métricas → Prometheus
Logs → Loki
Traces → OpenTelemetry
Dashboards → Grafana
Alertas → AlertmanagerOs quatro pilares fundamentais são:
Métricas
Exemplos:
CPU
Memória
Latência
Throughput
Error rate
Queue depth
Database connectionsLogs
Devem permitir responder:
O que aconteceu?
Quando aconteceu?
Qual serviço causou?
Qual usuário/request foi afetado?Traces
Distributed tracing permite acompanhar:
API Gateway
↓
Service A
↓
Service B
↓
DatabaseSem tracing, investigar latência entre microsserviços pode ser extremamente difícil.
Alertas
Alertas devem representar impacto.
Evite:
CPU > 70%Prefira sinais relacionados ao serviço:
p95 latency > 800ms
error rate > 5%
queue backlog > threshold
pods unavailable > thresholdGolden Signals
Uma estratégia eficiente durante assessments é verificar os Golden Signals utilizados pelo SRE:
Latency
Traffic
Errors
SaturationPor exemplo:
Latency:
p95 HTTP
Traffic:
requests/s
Errors:
5xx rate
Saturation:
CPU, memory, connections, queuesEsses sinais ajudam a identificar se o sistema está próximo de seus limites.
Segurança
Assessment de infraestrutura também precisa avaliar segurança.
RBAC
Verifique permissões excessivas.
kubectl get clusterrolebindings
kubectl get rolebindings -AProcure permissões como:
cluster-adminatribuídas desnecessariamente.
ServiceAccounts
Cada workload deve utilizar sua própria identidade.
Evite:
default ServiceAccountpara aplicações de produção.
Em AWS EKS, prefira mecanismos de identidade de workloads como EKS Pod Identity ou IRSA, conforme a arquitetura adotada.
Secrets
Nunca armazene credenciais diretamente em manifests versionados.
Evite:
env:
- name: DB_PASSWORD
value: super-secret-passwordPrefira integração com serviços como:
AWS Secrets Manager
HashiCorp Vault
External Secrets OperatorNetworkPolicy
Sem NetworkPolicy, normalmente qualquer pod pode se comunicar com qualquer outro pod dentro do cluster, dependendo do CNI utilizado.
Uma política básica poderia ser:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-api-to-database
namespace: production
spec:
podSelector:
matchLabels:
app: database
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: payment-api
ports:
- protocol: TCP
port: 5432Essa regra permite que pods payment-api acessem os pods selecionados como database na porta 5432.
Em produção, normalmente utiliza-se uma abordagem de:
default deny
+
allow explícitoEsse modelo reduz movimento lateral em caso de comprometimento.
CI/CD durante um assessment
Pipelines também podem introduzir riscos.
Alguns pontos a verificar:
Deploy automático em produção?
Existe aprovação?
Existe rollback?
Existe scan de imagem?
Existe scan de dependências?
Secrets aparecem no pipeline?
Existe versionamento de imagem?Evite:
image: company/api:latestPrefira:
image: company/api:2.4.1ou melhor ainda, imagens referenciadas por digest quando a imutabilidade for requisito.
Troubleshooting durante o assessment
Alguns comandos ajudam a identificar problemas rapidamente.
Pods
kubectl get pods -A -o wideIdentifique:
CrashLoopBackOff
Pending
OOMKilled
EvictedDescrição do pod
kubectl describe pod <pod> -n <namespace>Procure por:
FailedScheduling
FailedMount
OOMKilled
Unhealthy
BackOffEventos
kubectl get events -A \
--sort-by=.metadata.creationTimestampIsso ajuda a identificar:
falhas de scheduling
problemas de volumes
problemas de imagens
falhas de probesRecursos
kubectl top nodes
kubectl top pods -AEsses dados devem ser comparados com:
kubectl describe node <node>para analisar requests e limits agregados.
Sinais de risco comuns
Durante um assessment, alguns padrões aparecem frequentemente.
Pods críticos com apenas uma réplica
replicas: 1Pode ser aceitável em desenvolvimento.
Em produção pode representar Single Point of Failure.
Ausência de readinessProbe
Sem readiness, Kubernetes pode enviar tráfego para aplicações que ainda não estão prontas.
Ausência de limits
Uma aplicação com memory leak pode consumir memória do node inteiro.
Limits muito baixos
Podem gerar:
OOMKilled
CPU throttlingRequests muito altos
Geram desperdício de capacidade.
HPA sem capacidade de node
Escalar pods sem capacidade de infraestrutura resolve pouco.
Por isso:
HPA
+
Node Autoscalingprecisam ser avaliados juntos.
Desenvolvimento x produção
Configurações aceitáveis em desenvolvimento podem ser perigosas em produção.
Desenvolvimento
Pode ser aceitável:
1 réplica
sem PDB
autoscaling desabilitado
cluster pequeno
logs com baixa retençãoO objetivo pode ser reduzir custos.
Produção
Normalmente deve existir:
múltiplas réplicas
distribuição entre nodes/AZs
PDB
autoscaling
monitoramento
backup
security policies
resource requests
capacity planningProdução precisa considerar falha como evento esperado.
Custos e FinOps
Um assessment moderno também deve avaliar eficiência financeira.
Existem três categorias comuns de desperdício:
recursos ociosos
recursos superdimensionados
recursos esquecidosNo Kubernetes:
CPU Request total:
100 vCPU
CPU média utilizada:
32 vCPUIsso pode indicar oportunidade de rightsizing.
Mas reduzir requests sem análise pode causar problemas.
Idealmente deve-se analisar:
p50
p95
p99
picos históricosantes de alterar configuração.
Spot versus On-Demand
Workloads tolerantes a interrupção podem utilizar Spot Instances.
Por exemplo:
CI/CD runners
workers assíncronos
jobs
processamento batchJá workloads mais sensíveis podem exigir combinação entre:
On-Demand
+
SpotUm assessment deve analisar tolerância à interrupção antes de recomendar Spot.
O que evitar
Um assessment perde valor quando vira apenas uma lista genérica.
Evite recomendações como:
"melhorar observabilidade"Prefira:
Problema:
não existe alerta de backlog no RabbitMQ
Risco:
fila pode crescer silenciosamente
Recomendação:
alertar quando messages_ready ultrapassar limite definido por 10 minutosOutro erro é aplicar checklist sem entender contexto.
Por exemplo:
"todo serviço deve ter 3 réplicas"Isso não é necessariamente verdade.
Um serviço batch que executa uma vez por dia pode não precisar de múltiplas réplicas.
Assessment precisa considerar criticidade e arquitetura.
Como priorizar riscos
Uma maneira prática é utilizar:
Severidade = Probabilidade × ImpactoExemplo:
| Risco | Probabilidade | Impacto | Prioridade |
|---|---|---|---|
| API sem PDB | Média | Alto | Alta |
| Banco sem backup | Baixa | Crítico | Crítica |
| Requests altos | Alta | Médio | Alta |
| Dashboard ausente | Média | Baixo | Média |
Também é útil considerar:
esforço de correçãoAlgumas mudanças de alto impacto podem exigir pouco esforço.
Exemplo de matriz de assessment
Categoria: Kubernetes
Item:
Topology Spread
Estado:
Não configurado
Risco:
Réplicas críticas podem executar no mesmo node
Impacto:
Indisponibilidade durante falha de node
Prioridade:
Alta
Recomendação:
Adicionar topologySpreadConstraintsOutro exemplo:
Categoria: Database
Item:
Storage
Estado:
85% utilizado
Crescimento:
4% ao mês
Risco:
Storage exhaustion
Estimativa:
aproximadamente 4 meses
Prioridade:
Crítica
Recomendação:
expandir storage e revisar retençãoEsse formato transforma observações técnicas em ações concretas.
Quando utilizar um assessment
Assessments são especialmente úteis em situações como:
- crescimento acelerado da plataforma;
- aumento recorrente de incidentes;
- migração para Kubernetes;
- migração Cloud;
- mudança de arquitetura;
- preparação para Black Friday ou grandes eventos;
- redução de custos;
- preparação para auditoria;
- aquisição ou integração de empresas;
- ambiente legado sem documentação;
- entrada de nova equipe de Platform Engineering;
- preparação para SRE.
Também é recomendável realizar assessments periodicamente.
Por exemplo:
trimestral
semestral
antes de grandes eventos
após mudanças arquiteturais relevantesQuando não utilizar
Nem todo problema precisa de assessment completo.
Se a arquitetura for pequena:
1 aplicação
1 banco
1 servidoruma revisão técnica simples pode ser suficiente.
Também não faz sentido iniciar um assessment de dezenas de dimensões quando existe um problema conhecido e urgente.
Se o banco está com 99% de disco:
primeiro estabilize
depois faça o assessmentAssessment não substitui resposta a incidentes.
Um assessment eficiente deve gerar ações
O documento final deve responder:
O que está errado?
Por que isso importa?
Qual o risco?
Qual evidência comprova?
Como corrigir?
Qual prioridade?Um exemplo:
Risco:
pods críticos podem executar no mesmo node
Evidência:
3 pods encontrados no worker ip-10-0-4-21
Impacto:
falha do node causa indisponibilidade completa
Correção:
topologySpreadConstraints
Prioridade:
alta
Esforço:
baixoIsso permite transformar avaliação técnica em backlog de engenharia.
Resumo prático
Um assessment técnico eficiente percorre um fluxo semelhante a:
Inventário
↓
Arquitetura
↓
Infraestrutura
↓
Capacidade
↓
Aplicações
↓
Banco
↓
Mensageria
↓
Observabilidade
↓
Segurança
↓
FinOps
↓
Matriz de riscos
↓
Plano de açãoOs principais pontos a avaliar são:
- Single Points of Failure;
- distribuição de workloads;
- capacidade de CPU e memória;
- requests e limits;
- escalabilidade;
- filas e processamento assíncrono;
- banco de dados;
- backups;
- observabilidade;
- segurança;
- identidade;
- rede;
- CI/CD;
- recuperação de desastre;
- eficiência de custos.
O objetivo não é encontrar o maior número possível de problemas.
É identificar os problemas que podem gerar maior impacto ao negócio.
Conclusão
Assessment técnico não deve ser tratado como uma fotografia estática da infraestrutura.
Ele é uma ferramenta de engenharia de confiabilidade.
Uma arquitetura pode estar operando normalmente e ainda possuir dezenas de riscos ocultos.
O trabalho do assessment é transformar esses riscos em evidências técnicas antes que sejam descobertos durante um incidente.
Em ambientes modernos com Kubernetes, Cloud, microsserviços e infraestrutura dinâmica, a complexidade cresce rapidamente. Quanto maior o número de componentes, mais difícil se torna compreender todas as interações possíveis entre aplicações, infraestrutura e dependências.
Por isso, times maduros de SRE, DevOps e Platform Engineering não trabalham apenas reagindo a incidentes.
Eles procuram constantemente sinais de fragilidade.
A evolução natural é sair de:
incidente
↓
investigação
↓
correçãopara:
assessment
↓
identificação de risco
↓
priorização
↓
correção preventiva
↓
redução de incidentesEssa mudança representa uma das principais diferenças entre uma operação puramente reativa e uma engenharia de plataforma orientada a confiabilidade.
O melhor incidente continua sendo aquele que nunca aconteceu.
Artigos relacionados
Quer aplicar isso no seu ambiente?
Agende uma conversa de 30 minutos sem compromisso. Eu olho o seu cenário e digo por onde começar.
Agendar uma conversaReceba os novos artigos por e-mail
Um e-mail quando sair artigo novo sobre infraestrutura, backend e IA. Sem spam, cancele quando quiser.