Módulo 6 · Engenharia de Software · ES06 · Aula 10 de 10 · última desta etapa
Observabilidade
Logs · Métricas · Traces
O recomendador finalmente vê a si mesmo · 16/06/2026 · última aula desta etapa
📜 Logs estruturados (JSON)
📊 Métricas RED + USE
🔗 Traces distribuídos
🚨 Alertas de sintoma
🎓 Encerramento desta etapa
DAILY · 15 MIN · ÚLTIMO DESTA ETAPA
15:00
🔥 1 incidente que vivi (no projeto ou em estágio)
📉 1 métrica que eu já sinto falta no MVP
🧭 O que tem hoje no projeto pra debugar?
🤝 Preciso de ajuda?
Cada aluno em 1 minuto · começamos pela equipe que mais sofreu nesse módulo
Autoestudos · Pré-aula 📚
3 tarefas individuais para chegar pronto + leituras sugeridas
📖
Tarefa 1 · Leitura
Material da Aula 10
Leitura completa — vocabulário do dia: log estruturado, métrica, trace, span, SLO, error budget, cardinality.
📖 Material da aula
🔍
Tarefa 2 · Análise
3 perguntas que o seu MVP não responde
Liste 3 perguntas operacionais que hoje você não consegue responder em 1 minuto (ex.: "qual endpoint está mais lento?"). Vai virar requisito de observabilidade.
📓 Caderno de bordo
🧪
Tarefa 3 · Pesquisa
SRE Book · cap. SLO
Leia o capítulo de SLO do Google SRE Book. Anote o conceito de error budget em uma frase própria.
Abrir referência ↗

📚 Leituras sugeridas

📌 Material de chegada: caderno de bordo com 3 perguntas que o MVP não responde + 1 frase sobre error budget. Esses 4 itens alimentam o daily de abertura.

Agenda · Última Aula desta Etapa 🎓
2 horas · 40 min de teoria + 1h05 de mão na massa em sala · sem ponderada
⏱️ 40 min
TEORIA

🔬 Observabilidade dos 3 pilares

Logs estruturados (JSON) · Métricas RED+USE · Distributed tracing com OpenTelemetry · dashboards · SLO/error budget · custos.

  • Monitoring × Observability (Charity Majors)
  • Stack Serilog + OpenTelemetry + Prometheus + Jaeger
  • Correlação por traceId entre serviços
⏱️ 1h05
PRÁTICA · GRUPO

🛠️ Atividade prática em sala

Subir a infra do MVP na nuvem (AWS) com o AIOX: o @devops gera o CloudFormation e faz o deploy. Documentar em docs/deploy.md.

  • Credencial AWS no terminal (aws configure)
  • infra.yml gerado pelo @devops (CloudFormation)
  • Deploy no App Runner · URL pública no ar
  • ⭐ Excelência: CI/CD com deploy automático no merge

🎯 Saída do dia: Merge Request no repositório do grupo com o infra.yml + a URL pública do serviço no ar + docs/deploy.md. Não é ponderada — é prática boa em sala. À tarde a equipe segue para a retrospectiva da sprint.

Por que Observabilidade?
"Monitoring sabe o que perguntar. Observability descobre a pergunta certa quando a falha é nova."
📊 Monitoring
"As perguntas que você já sabia que ia precisar fazer"
  • Dashboards pré-definidos · CPU/RAM/disco
  • Alertas em thresholds conhecidos
  • Funciona bem para falhas conhecidas
  • Falha quando o problema é novo (unknown unknowns)
  • MTTR alto quando você não sabe onde olhar
🔬 Observability
"Conseguir responder qualquer pergunta sobre o sistema, em produção, sem deploy novo"
  • Cardinality alta · qualquer dimensão pesquisável
  • Permite perguntas que você não tinha pensado
  • Logs + métricas + traces correlacionados
  • MTTR cai porque você navega o sistema, não adivinha
  • Necessário em arquiteturas distribuídas (SOA da aula 9)
Em sistemas distribuídos, a maioria dos bugs em produção são novos — você nunca os viu antes. Monitoring assume que você sabe o que vai dar errado. Observability é o que sobra quando você assume que não sabe. — Observability Engineering · Charity Majors, Liz Fong-Jones, George Miranda
Os 3 Pilares · Logs · Métricas · Traces 📜📊🔗
Cada um responde uma classe diferente de pergunta · escolher é decidir custo × granularidade

📜 Logs respondem "o quê"

Eventos textuais com contexto. Verbosos, ricos, caros.

📊 Métricas respondem "quanto"

Números agregados no tempo. Baratas, ótimas para alerta.

🔗 Traces respondem "por onde"

Reconstroem a jornada da requisição entre serviços.

Logs Estruturados · JSON > Texto Solto
Cada log é um objeto pesquisável · grep não escala · Serilog em C#

⛔ Texto solto · não escala

Não dá pra filtrar por userId, agregar por latency, alertar quando >500ms.

✅ JSON estruturado · pesquisável

🔑 Campos obrigatórios

  • @t · timestamp ISO-8601 UTC
  • level · Trace/Debug/Info/Warning/Error/Fatal
  • traceId · correla logs cross-service
  • userId · contexto de domínio
  • msg · template humano

💡 Regra do Inteli: nada de Console.WriteLine em produção. Toda mensagem de log é um evento de domínio com templates nomeados — Serilog mantém template e valores separados, e isso vira coluna pesquisável no ELK.

Métricas · RED para serviços · USE para recursos 📊
2 modelos mentais que cobrem 90% dos dashboards reais

🔴 RED · para serviços (Tom Wilkie)

  • Rate · requisições por segundo (chamadas/s)
  • Errors · taxa de erro (% de 5xx, exceptions)
  • Duration · latência (p50, p95, p99)

Para o Recommendation Service: chamadas/seg, % de erros 500, p95 da resposta.

🟦 USE · para recursos (Brendan Gregg)

  • Utilization · % de uso do recurso (CPU, RAM)
  • Saturation · fila/espera (run queue, IO wait)
  • Errors · falhas do recurso (disk errors, OOM)

Para a VM/Container: CPU%, throttling, OOM kills.

📦 Stack canônica: System.Diagnostics.Metrics (.NET) → OpenTelemetry SDKPrometheus (scrape) → Grafana (visualização). OTel é a interface neutra; troca de backend sem mexer no código.

Distributed Tracing · OpenTelemetry 🔗
Uma operação · vários spans · waterfall pra caçar gargalo entre serviços

📐 Trace × Span

Trace = uma operação ponta-a-ponta (ex.: GET /recommendations). Span = um pedaço dessa operação (ex.: chamada ao DB, ao cache, ao serviço de ranking). Cada span tem traceId, spanId, parentSpanId e tags.

⏱️ Waterfall · GET /recommendations · 218ms

3 serviços · OTel envia para Jaeger · você clica e vê onde queimou tempo.

api-gateway
218ms
└ reco-service
192ms
├ db.query
71ms
├ cache.get
11ms
└ ranker.svc
95ms

🔍 Olhar: a barra vermelha do ranker.svc é a maior — é lá que tem que cortar latência, não no DB.

Dashboards e Alertas · 1 tela = 1 pergunta 🚨
SLO/SLI/Error Budget · alerta de sintoma, não de causa
Rate (req/s)
142.7
Errors (%)
0.42%
p95 Latency (ms)
218
Error budget · 28d
37%

🎯 SLO · SLI · Error Budget

  • SLI · indicador (ex.: % de chamadas <300ms)
  • SLO · meta (ex.: 99% das chamadas <300ms em 28 dias)
  • Error budget · 1 - SLO = orçamento de falha · queimou? congela feature, foca em estabilidade

🚨 Alerta bom × ruído

  • Sintoma: "p95 da home > 1s por 5 min" (afeta usuário)
  • Causa: "CPU > 80%" (e daí? O usuário sentiu?)
  • Alerta que ninguém age em 2 semanas → desligar
  • Se acordou às 3h, perguntar: "isso podia esperar?"

📐 Princípio: 1 tela = 1 pergunta. Dashboard com 47 gráficos = ninguém olha. Quebre por persona (operador on-call · PM · arquiteto) e por fluxo (checkout · login · home).

Custo de Observabilidade · Cardinality 💸
Observabilidade ingênua quebra o orçamento · sampling, retenção em camadas, filtros

💥 Cardinality Explosion

Cada combinação única de labels = uma série temporal. Adicionar userId como label numa métrica com 1M de usuários = 1M de séries · explode o Prometheus.

Regra: labels devem ter poucos valores possíveis. userId vai pra log/trace, não pra métrica.

🎲 Sampling de Traces

Não armazena 100% dos traces (caro demais). Estratégias:

  • Head-based · decide na entrada (ex.: 1%)
  • Tail-based · decide no fim (ex.: 100% se erro, 1% se ok) — mais caro mas captura o que importa
  • Adaptativo · sobe sample em endpoints raros
7d
Hot · SSD
Acesso instantâneo · debug do dia a dia · caro por GB
30d
Warm · HDD
Investigação de incidentes da última sprint · acessível em segundos
1y
Cold · Object storage
Auditoria, conformidade · acesso em minutos · barato por GB

⚠️ Anti-padrão clássico: mandar todo log de DEBUG para ELK 24×7. Em uma semana o budget de observabilidade dobra o do compute. Filtre antes de enviar (Vector, Fluent Bit, processador OTel).

A Dor · Descobrir Erros em Sistemas Distribuídos 💥
SOA separa os serviços — cada um com sua máquina, seu log, seu deploy · o erro nasce num lugar e explode em outro
PROD · sexta · 14h32 · pico de tráfego 📱 Mobile App 🚪 API Gateway 🧠 Reco Service 🗄️ Database ⚡ Cache 📊 Ranking Svc 💥 ⏱ timeout 30s — a RAIZ unhandled exception HTTP 500 💥 usuário: "o app quebrou!" ? ? ? ? ? ?
⏱️ MTTR: 0.0h
cada time olhando só o próprio log

📍 Sintoma longe da raiz

O erro nasce no Database (timeout), mas explode no app do usuário. Quem atende o chamado vê o 500 do gateway — três serviços de distância da causa.

🪦 Arqueologia por timestamp

Cada serviço só enxerga o próprio log, na própria máquina. Correlacionar é cavar por horário — com relógios que nem batem entre si (clock skew).

🚒 War-room e dedo apontado

"No meu serviço está tudo verde." Sem visão da jornada, o MTTR dispara: horas de war-room para achar o que uma busca certa acharia em minutos.

🪡 O remédio: um fio que costura a jornada inteira — um id único que nasce na borda e viaja com a requisição por todos os serviços. É o traceIdpróximo slide.

Correlação · TraceId entre Serviços 🧵
W3C Trace Context · header traceparent · um id que atravessa toda a jornada

📨 Header W3C · traceparent

Formato padronizado pelo W3C · todas as bibliotecas OTel injetam e leem. Frontend → API Gateway → Reco Service → DB · todos compartilham o mesmo trace-id.

🔁 Propagação automática

Em .NET com OTel o HttpClient instrumentado já injeta traceparent nas chamadas saintes. ASP.NET extrai do header de entrada. Você só precisa abrir spans dentro do código.

🪡 Costurando log + métrica + trace

🎯 Por que isso vira poder

Um usuário reporta "lento às 14h32". Você acha 1 trace lento → pega o traceId → busca todos os logs daquele traceId em todos os serviços → reconstrói a jornada inteira em <1 min.

Sem traceId, debugar em SOA é arqueologia: você cava logs por timestamp e torce. Com traceId, é navegação: você anda pela jornada da requisição como quem segue o GPS. — prática comum em times de SRE com OTel
Atividade Prática · Em Sala 🛠️
90 min em grupo · subir a infra do MVP na nuvem com o AIOX (@devops + CloudFormation) · NÃO é ponderada
01
🔑

Credencial AWS pronta

Configurar a AWS CLI no terminal (aws configure) e validar com aws sts get-caller-identity. Credencial fora do git.

02
🤖

infra.yml com o @devops

Descrever a infra em 1 frase e deixar o @devops (AIOX) gerar o template CloudFormation da API .NET.

03
🚀

Stack no ar na AWS

Deploy via cloudformation deploy · API no App Runner com URL pública respondendo de verdade.

04
📓

docs/deploy.md

Como subir · print da stack criada e da URL no ar · custo estimado da infra.

📌 Entrega: Merge Request no repositório do grupo com:

  1. Branch feat/infra-aws com o infra.yml (CloudFormation versionado)
  2. docs/deploy.md com prints anexados (stack CREATE_COMPLETE + a URL pública respondendo)
  3. A URL pública do serviço no ar, colada na descrição do MR

⭐ Excelência: pipeline de CI/CD que roda o cloudformation deploy a cada merge na main (deploy automático) + healthcheck da URL. Quem entregar isso ganha menção honrosa na retrospectiva.

Passo a passo · Criar o CloudFormation com o @devops 🚀
Da credencial AWS ao deploy — o @devops (Gage) do AIOX gera o template e aplica via terminal

📋 O roteiro

  1. Credencial AWS no terminal · aws configure + sts get-caller-identity
  2. Ative o @devops (Gage) no Claude Code
  3. Descreva a infra em 1 frase → ele gera o infra.yml (CloudFormation)
  4. Revise o template · IAM mínimo, porta, custo
  5. Deploy · @devops *push dispara o CI/CD → cloudformation deploy
  6. Confirme no ar pela observabilidade (Grafana/Jaeger)

⚖️ Regra do AIOX: a IA gera o infra.yml, mas você revisa antes de aplicar (IAM mínimo, porta exposta, custo). O push/deploy é autoridade exclusiva do @devops — credenciais ficam como secret no CI, nunca na máquina do dev.

🛠️
Mão na massa · Infra na Nuvem com o AIOX
90 minutos em grupo · do código ao serviço no ar na AWS · o @devops gera o CloudFormation · entrega via MR no repositório do grupo.
1️⃣ Branch feat/infra-aws a partir da main
2️⃣ aws configure + aws sts get-caller-identity
3️⃣ Ativar o @devops (Gage) no Claude Code
4️⃣ Descrever a infra → @devops gera o infra.yml
5️⃣ Revisar o template · IAM mínimo · porta 8080 · custo
6️⃣ validate-template + @devops *push (deploy)
7️⃣ Pegar a URL pública e testar o endpoint no ar
8️⃣ Abrir MR · revisores: outros 2 grupos · merge até 16h
💡 Estratégia: 1 dev na credencial + infra.yml com o @devops, outro revisa o template, outro testa a URL. Quem terminar cedo pluga a observabilidade da aula.
👋
Até Aqui · Minhas 10 Aulas no Módulo 6
10 aulas comigo. Saímos da matemática da filtragem colaborativa e chegamos a um sistema observável e no ar. Cada aula virou um tijolo do MVP — e o módulo continua com outro professor.
✅ Aula 1 — Filtragem item-based
✅ Aula 2 — CF + métrica MVP
✅ Aula 3 — SOA + RNF
✅ Aula 4 — Stored Procedures
✅ Aula 5 — Transactions + Triggers
✅ Aula 6 — Mobile MVVM (RN)
✅ Aula 7 — POO + TDD
✅ Aula 8 — Testes de integração
✅ Aula 9 — SOA cloud
✅ Aula 10 — Observabilidade

"O recomendador saiu da matemática e virou produto observável em produção."

Daqui pra frente o módulo segue com outro professor. E vem a Sprint Review do parceiro Aventura: tudo o que você construiu precisa virar uma demo de 5 minutos.

Módulo 6 · Projeto 6 · Engenharia de Software · 16/06/2026