Observabilidade é a capacidade de entender o estado interno de um sistema a partir dos dados que ele emite, permitindo diagnosticar problemas e otimizar performance em tempo real. Na AWS, os três pilares da observabilidade (métricas, logs e traces) são implementados com CloudWatch, X-Ray e OpenTelemetry, complementados por dashboards Grafana para visualização unificada.
Monitorar uma aplicação na nuvem vai muito além de verificar se o servidor está "de pé". Em arquiteturas modernas com microsserviços, containers e funções serverless, entender o que acontece dentro do sistema, e por quê, exige uma abordagem estruturada de observabilidade. Os três pilares clássicos são: métricas, logs e traces.
Neste guia, vamos explorar como implementar observabilidade completa na AWS usando CloudWatch para métricas e logs, X-Ray para distributed tracing, OpenTelemetry como padrão aberto de instrumentação e Grafana para dashboards unificados.
Os três pilares da observabilidade
Antes de mergulhar nas ferramentas, é fundamental entender o que cada pilar oferece:
- Métricas: dados numéricos agregados ao longo do tempo (CPU, latência, taxa de erros, requests por segundo). Respondem à pergunta "o que está acontecendo?"
- Logs: registros textuais de eventos discretos (erros, transações, auditoria). Respondem à pergunta "por que aconteceu?"
- Traces: rastreamento do caminho de uma requisição através de múltiplos serviços. Respondem à pergunta "onde está o gargalo?"
Um sistema verdadeiramente observável integra os três pilares de forma correlacionada: a partir de uma métrica anômala, você navega para os logs relevantes e, de lá, para o trace completo da requisição problemática.
CloudWatch: o centro de monitoramento da AWS
O Amazon CloudWatch é o serviço nativo de monitoramento da AWS. Ele coleta métricas automaticamente de praticamente todos os serviços AWS (EC2, RDS, Lambda, ECS, etc.) e permite criar métricas customizadas, alarmes, dashboards e automações.
Métricas e alarmes
CloudWatch recebe métricas em namespaces organizados por serviço. Além das métricas padrão, você pode publicar métricas customizadas da sua aplicação:
// Alarme para taxa de erros 5xx acima de 5% por 5 minutos
{
"AlarmName": "API-HighErrorRate",
"AlarmDescription": "Taxa de erros 5xx acima de 5% nos últimos 5 minutos",
"Namespace": "AWS/ApplicationELB",
"MetricName": "HTTPCode_Target_5XX_Count",
"Statistic": "Sum",
"Period": 300,
"EvaluationPeriods": 1,
"Threshold": 50,
"ComparisonOperator": "GreaterThanThreshold",
"TreatMissingData": "notBreaching",
"AlarmActions": [
"arn:aws:sns:sa-east-1:123456789:alertas-produção"
],
"OKActions": [
"arn:aws:sns:sa-east-1:123456789:alertas-produção"
],
"Dimensions": [
{
"Name": "LoadBalancer",
"Value": "app/meu-alb/1234567890"
}
],
"Tags": [
{
"Key": "Environment",
"Value": "production"
},
{
"Key": "Severity",
"Value": "critical"
}
]
}
CloudWatch Logs e Logs Insights
O CloudWatch Logs centraliza logs de aplicações, serviços AWS e infraestrutura. O recurso mais poderoso é o CloudWatch Logs Insights, que permite consultas SQL-like em tempo real sobre seus logs:
# Top 10 erros mais frequentes nas últimas 24h
fields @timestamp, @message
| filter @message like /ERROR/
| stats count(*) as total by @message
| sort total desc
| limit 10
# Latência P99 por endpoint nos últimos 30 min
fields @timestamp, endpoint, duration_ms
| filter ispresent(duration_ms)
| stats percentile(duration_ms, 99) as p99,
percentile(duration_ms, 95) as p95,
avg(duration_ms) as média
by endpoint
| sort p99 desc
# Requests com latência acima de 3 segundos
fields @timestamp, @message, endpoint, duration_ms, trace_id
| filter duration_ms > 3000
| sort @timestamp desc
| limit 20
Dica importante: sempre inclua o trace_id nos seus logs. Isso permite correlacionar logs com traces do X-Ray, criando uma experiência de debugging integrada.
AWS X-Ray: distributed tracing
Em arquiteturas com múltiplos microsserviços, uma única requisição pode percorrer dezenas de serviços. Quando algo dá errado ou a latência aumenta, identificar o serviço problemático sem tracing é como procurar agulha no palheiro.
O AWS X-Ray resolve isso rastreando cada requisição end-to-end, gerando um mapa visual dos serviços e identificando gargalos de performance. Para instrumentar sua aplicação, adicione o SDK do X-Ray:
# Instrumentação do X-Ray em aplicação Python (Flask)
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.ext.flask.middleware import XRayMiddleware
from aws_xray_sdk.core import patch_all
import flask
# Patch automático para boto3, requests, sqlite3, etc.
patch_all()
app = flask.Flask(__name__)
# Configurar X-Ray com sampling rules
xray_recorder.configure(
sampling=True,
context_missing='LOG_ERROR',
plugins=('EC2Plugin', 'ECSPlugin'),
daemon_address='127.0.0.1:2000'
)
# Adicionar middleware ao Flask
XRayMiddleware(app, xray_recorder)
@app.route('/api/pedidos')
def listar_pedidos():
# Subsegmento customizado para lógica de negócio
with xray_recorder.in_subsegment('validar_permissões') as subsegment:
subsegment.put_annotation('user_id', '12345')
subsegment.put_metadata('request_params', request.args)
validar_acesso(request)
# Chamadas a DynamoDB e outros serviços são
# automaticamente rastreadas pelo patch_all()
pedidos = dynamodb.Table('pedidos').scan()
return jsonify(pedidos['Items'])
O X-Ray gera automaticamente um Service Map visual que mostra todas as dependências entre serviços, latências médias e taxas de erro. Isso é extremamente valioso para entender a topologia real da sua aplicação em produção.
OpenTelemetry: o padrão aberto
O OpenTelemetry (OTel) é um projeto open-source da CNCF (abre em nova aba) que fornece APIs, SDKs e ferramentas padronizadas para gerar, coletar e exportar dados de telemetria (métricas, logs e traces). A principal vantagem é a portabilidade: você instrumenta uma vez e pode enviar dados para qualquer backend (CloudWatch, X-Ray, Grafana, Datadog, etc.).
A AWS suporta nativamente o OpenTelemetry através do AWS Distro for OpenTelemetry (ADOT), uma distribuição oficial que inclui coletores otimizados e exportadores para serviços AWS.
# Configuração do ADOT Collector
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 10s
send_batch_size: 1024
memory_limiter:
check_interval: 5s
limit_mib: 512
spike_limit_mib: 128
exporters:
awsxray:
region: sa-east-1
index_all_attributes: true
awsemf:
region: sa-east-1
namespace: MinhaApp
log_group_name: '/otel/métricas'
dimension_rollup_option: "NoDimensionRollup"
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, memory_limiter]
exporters: [awsxray]
metrics:
receivers: [otlp]
processors: [batch, memory_limiter]
exporters: [awsemf]
Com essa configuração, o ADOT Collector recebe dados via protocolo OTLP (OpenTelemetry Protocol) e exporta traces para o X-Ray e métricas para o CloudWatch. Sua aplicação precisa apenas enviar dados para o collector via OTLP, sem dependência direta de SDKs proprietários da AWS.
Dashboards com Grafana
Embora o CloudWatch ofereça dashboards nativos, o Amazon Managed Grafana proporciona uma experiência muito mais rica para visualização. O Grafana suporta múltiplas fontes de dados (CloudWatch, X-Ray, Prometheus, Elasticsearch) em um único dashboard, facilitando a correlação entre os três pilares da observabilidade.
Para ambientes com múltiplas contas AWS ou estratégia multi-cloud, o Grafana se torna essencial como camada unificada de visualização. A versão gerenciada pela AWS elimina a complexidade de operar o Grafana, incluindo autenticação via AWS IAM Identity Center e integração nativa com fontes de dados AWS.
Melhores práticas de observabilidade na AWS
1. Structured logging
Sempre emita logs em formato JSON estruturado. Isso facilita consultas no Logs Insights e correlação com traces. Em pipelines CI/CD, configure a instrumentação como parte do build para garantir rastreabilidade desde o deploy. Inclua campos como trace_id, request_id, user_id, endpoint e duration_ms em cada log entry.
2. Métricas de negócio, não só de infra
Além de CPU e memória, publique métricas de negócio no CloudWatch: pedidos por minuto, valor de transações, tempo de processamento de pagamentos. Essas métricas são as que realmente importam para o stakeholder.
3. Alarmes com runbooks
Todo alarme deve ter um runbook associado: um documento que descreve o que o alarme significa, como investigar e quais ações tomar. Alarme sem runbook gera "alert fatigue" e é ignorado.
4. Sampling inteligente
Em ambientes de alto throughput, coletar 100% dos traces é inviável e caro. Configure sampling rules no X-Ray para capturar 100% dos erros e uma amostra representativa (1-5%) dos requests bem-sucedidos.
5. SLIs, SLOs e Error Budgets
Defina Service Level Indicators (métricas que representam a experiência do usuário), Service Level Objectives (metas para essas métricas) e Error Budgets (margem aceitável de degradação). Isso transforma observabilidade em uma ferramenta de decisão, não apenas de diagnóstico.
"Observabilidade não é sobre ter dashboards bonitos, é sobre reduzir o tempo entre 'algo está errado' e 'encontramos e corrigimos o problema'. Cada minuto conta."
Stack recomendada pela RFX Tecnologia
Para a maioria dos cenários na AWS, recomendamos a seguinte stack de observabilidade:
- Instrumentação: OpenTelemetry (ADOT) para portabilidade e padronização
- Métricas: CloudWatch Metrics + Amazon Managed Prometheus para workloads em Kubernetes
- Logs: CloudWatch Logs com Logs Insights para consultas ad-hoc
- Traces: AWS X-Ray integrado via ADOT Collector
- Dashboards: Amazon Managed Grafana com fontes de dados unificadas
- Alertas: CloudWatch Alarms + SNS + PagerDuty/Opsgenie para on-call
Gotchas e custos ocultos do CloudWatch
Erros comuns que impactam custo e efetividade:
- Logs sem retention policy: por padrão, o CloudWatch Logs nunca expira (abre em nova aba). Uma aplicação que gera 10 GB/dia de logs ingere 3,65 TB por ano: são cerca de US$ 1.800 por ano só de ingestão (US$ 0,50 por GB na classe Standard), mais o armazenamento, de US$ 0,03 por GB-mês, que cresce todo mês enquanto não houver retenção (valores de us-east-1 na Price List API, consultada em 13/10/2026; ver os preços do CloudWatch). Configure retenção de 30 a 90 dias para ambientes de dev e de 365 dias para produção.
- Custom metrics com alta cardinalidade: cada combinação única de dimensões cria uma métrica separada (abre em nova aba). Se você publica uma métrica com dimensão
user_ide tem 100.000 usuários, serão 100.000 métricas: cerca de US$ 12.000 por mês em us-east-1, porque o preço é escalonado (US$ 0,30 por métrica nas 10.000 primeiras e US$ 0,10 nas 240.000 seguintes, Price List API consultada em 13/10/2026). Use métricas agregadas e reserve alta cardinalidade para traces. - Alarmes sem ação: alarme sem action configurada, ou que notifica um canal que ninguém acompanha, é achado frequente em auditoria. Todo alarme deve ter: SNS topic ativo, runbook documentado e responsável definido.
- X-Ray com sampling de 100%: em aplicações com alto throughput (mais de 1.000 req/s), capturar todos os traces gera custo proibitivo e poluição de dados. Use regras de amostragem (a regra padrão do X-Ray registra a primeira requisição de cada segundo e 5% das demais (abre em nova aba)) e, para guardar todos os erros e as requisições lentas, amostragem por cauda (tail sampling) no OpenTelemetry Collector.
# Configurar retention de 90 dias em todos os log groups
for lg in $(aws logs describe-log-groups \
--query 'logGroups[?!retentionInDays].logGroupName' \
--output text --region sa-east-1); do
echo "Configurando retention para $lg..."
aws logs put-retention-policy \
--log-group-name "$lg" \
--retention-in-days 90 \
--region sa-east-1
done
# Criar alarme composto (Composite Alarm) para reduzir ruído
aws cloudwatch put-composite-alarm \
--alarm-name "Producao-Critico" \
--alarm-rule 'ALARM("API-HighErrorRate") AND ALARM("API-HighLatency")' \
--alarm-actions "arn:aws:sns:sa-east-1:123456789:pagerduty-critico" \
--region sa-east-1
# Configurar X-Ray sampling rule (5% para requests normais)
aws xray create-sampling-rule --sampling-rule '{
"RuleName": "default-low-sample",
"Priority": 1000,
"FixedRate": 0.05,
"ReservoirSize": 1,
"ServiceName": "*",
"ServiceType": "*",
"Host": "*",
"ResourceARN": "*",
"HTTPMethod": "*",
"URLPath": "*",
"Version": 1
}'
Na prática: cenário ilustrativo de observabilidade para e-commerce
Cenário ilustrativo: um e-commerce com cerca de 200.000 pedidos por mês opera com monitoramento básico, só alarmes de CPU e disco. Quando a taxa de erros sobe na Black Friday, o time leva horas para achar a causa raiz, e cada hora de degradação custa vendas. O desenho para esse cenário segue três etapas:
- Etapa 1: instrumentar os 12 microsserviços com OpenTelemetry (ADOT como sidecar no ECS) e adotar logs estruturados em JSON com trace_id, request_id e campos de negócio (order_id, payment_method).
- Etapa 2: dashboards no Amazon Managed Grafana em três níveis: executivo (pedidos por minuto, receita, SLA), operacional (latência P99, taxa de erro por serviço) e investigação (traces lentos, logs de erro filtrados).
- Etapa 3: alarmes compostos (Composite Alarms) (abre em nova aba) para reduzir falsos positivos e runbooks no Systems Manager com ações automatizadas, por exemplo scale-up quando a latência P99 passa de 2 s.
O que acompanhar nesse cenário: MTTD e MTTR por incidente, antes e depois da instrumentação. Um gargalo como o connection pool do RDS saturado, que antes aparecia só como erro genérico, passa a ter trace e log ligados pelo mesmo trace_id. O custo de observabilidade (CloudWatch, X-Ray e Grafana) entra na conta desde o início: estime na calculadora da AWS a partir do volume de logs, métricas e traces do ambiente.
KPIs para o decisor
- MTTR (Mean Time to Recovery): tempo entre detecção e resolução de incidentes. Target: menos de 15 minutos para incidentes críticos.
- MTTD (Mean Time to Detect): tempo para identificar que há um problema. Target: menos de 2 minutos com alarmes proativos.
- SLA compliance (%): percentual do tempo que os SLOs foram cumpridos. Target: 99,9% (equivale a menos de 44 minutos de indisponibilidade por mês).
- Latência P99 (ms): latência percebida pelos 1% piores requests. Target: definir por serviço, tipicamente menos de 1s para APIs web.
- Error budget consumed (%): percentual do budget de erros consumido no período. Target: menos de 50% para ter margem para inovação.
- Custo de observabilidade / receita (%): investimento em monitoramento sobre a receita. Target: 0,5-2% do gasto total de infraestrutura.
Próximos passos
A observabilidade é uma capacidade que evolui com a maturidade da equipe. Comece com métricas básicas e alarmes, evolua para structured logging e Logs Insights, e por fim implemente distributed tracing com X-Ray e OpenTelemetry.
Na RFX Tecnologia, por meio do nosso serviço de DevOps e Automação, implementamos soluções de observabilidade completas na AWS, desde a instrumentação até dashboards executivos. Ajudamos equipes a evoluir a observabilidade e a operar sistemas críticos com mais confiança. Marcar 30 min com um arquiteto AWS para avaliar a maturidade de observabilidade do seu ambiente.
Documentação oficial consultada em 12/10/2026: guia do Amazon CloudWatch (AWS) e AWS Distro for OpenTelemetry (AWS).