Serviços que somam ao Bedrock III: observabilidade, FinOps e entrega
- ⬜🛡️ Serviços que somam ao Bedrock II: segurança, identidade e conformidade(AWS Bedrock — GenAI em Produção)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
A primeira onda de IA numa empresa é aprovada por entusiasmo. A segunda é aprovada por número — e é aqui que a maioria trava, porque o histórico não é reconstituível. Ninguém consegue dizer quanto economizou sem ter medido o baseline; ninguém consegue mostrar o que o modelo respondeu em março se o registro de conteúdo foi ligado em maio; ninguém separa o custo por squad se o inference profile nasceu no mês seis. Este módulo cobre os 16 serviços dessa camada, os três registros diferentes que a auditoria pede, e a instrumentação que precisa existir antes da primeira chamada.
Como escolher nesta camada
- A pergunta é de saúde, de causa ou de dinheiro? Saúde é métrica e alarme. Causa é traço distribuído e log estruturado. Dinheiro é atribuição por tag. São três ferramentas diferentes e confundi-las produz painel que não responde nada.
- É reconstituível depois? Registro de conteúdo, atribuição de custo e baseline não são. Se cai nessa lista, é dia 1 — não é sprint de melhoria.
- Quem vai olhar? Métrica que ninguém abre é custo de armazenamento. Todo painel precisa de um dono e de uma decisão que ele destrava.
O que a observabilidade de IA tem de diferente
Numa API comum, você mede latência, erro e throughput. Em IA, três métricas novas dominam a operação: tokens de saída (o lado caro da conta), taxa de leitura de cache (se cai, o custo dispara sem nenhum erro aparecer) e rodadas por execução num laço agêntico (a cauda longa é o que estoura o orçamento). Nenhuma das três existe em painel de aplicação tradicional — você precisa emiti-las.
Métrica, log e sonda
| Serviço | O que é | O que soma ao Bedrock | O limite que decide |
|---|---|---|---|
| Amazon CloudWatch | Métrica dimensionada, log, alarme e painel | Tokens por app, latência por tier, razão de cache e rodadas por execução — as métricas que só existem se você emitir | Métrica customizada cobra por métrica única; dimensão de alta cardinalidade (id de usuário) explode o custo |
| CloudWatch Logs Insights | Consulta sobre log estruturado, sem indexar previamente | Investigar uma conversa específica e agrupar erro por ferramenta do agent | Cobra por volume escaneado na consulta; log em texto corrido torna a consulta caríssima e imprecisa |
| CloudWatch Synthetics | Sonda que executa um caminho de tempos em tempos | Detecta que o assistente parou de responder antes de o usuário reclamar | Cada execução da sonda consome inferência real — sonda frequente em rota cara atinge a fatura |
import json, time, boto3
cw = boto3.client("cloudwatch")
NS = "Plataforma/IA"
def registrar(app, rota, tier, uso, ms, desfecho, ferramentas=0):
dims = [{"Name": "app", "Value": app},
{"Name": "tier", "Value": tier}]
entrada = uso.get("inputTokens", 0)
saida = uso.get("outputTokens", 0)
cache = uso.get("cacheReadInputTokens", 0)
cw.put_metric_data(Namespace=NS, MetricData=[
{"MetricName": "TokensEntrada", "Value": entrada, "Unit": "Count", "Dimensions": dims},
{"MetricName": "TokensSaida", "Value": saida, "Unit": "Count", "Dimensions": dims},
{"MetricName": "CacheLido", "Value": cache, "Unit": "Count", "Dimensions": dims},
{"MetricName": "Latencia", "Value": ms, "Unit": "Milliseconds", "Dimensions": dims},
{"MetricName": "Ferramentas", "Value": ferramentas, "Unit": "Count", "Dimensions": dims},
# Razao de cache: se cair, algo invalidou o prefixo. E o alarme
# mais barato de configurar e o que mais evita surpresa na fatura.
{"MetricName": "RazaoCache",
"Value": cache / max(entrada + cache, 1),
"Unit": "None", "Dimensions": dims},
])
# Log ESTRUTURADO: o que permite consultar depois sem parsear texto.
print(json.dumps({
"app": app, "rota": rota, "tier": tier, "desfecho": desfecho,
"tokens_entrada": entrada, "tokens_saida": saida, "cache_lido": cache,
"latencia_ms": ms, "ferramentas": ferramentas,
"ts": int(time.time()),
}, ensure_ascii=False))
Log de IA não pode ser texto solto
Registrar a resposta inteira em texto corrido cria dois problemas: você não consegue consultar por atributo depois, e joga dado pessoal em log sem controle. Registre campos estruturados — app, rota, tier, tokens, latência, desfecho — e deixe o conteúdo integral no destino próprio de registro de invocação, que tem chave e retenção definidas. Separar esses dois destinos é o que permite investigar performance sem passear por dado sensível.
Cuidado com a cardinalidade da dimensão
É tentador dimensionar as métricas por id de usuário ou por id de sessão, para poder fatiar tudo. Não faça: métrica customizada cobra por combinação única de dimensões, e id de usuário gera uma métrica nova por pessoa. Dimensione por app, rota, tier e desfecho — cardinalidade baixa e estável. Para investigar um caso individual, o instrumento é o log estruturado, não a métrica.
Rastreamento: onde o tempo foi
| Serviço | O que é | O que soma ao Bedrock | O limite que decide |
|---|---|---|---|
| AWS X-Ray | Rastreamento distribuído: um traço atravessando serviços, com tempo por segmento | Responde a pergunta mais frequente da operação de IA: a lentidão é retrieval, inferência, ferramenta ou fila? | Amostragem padrão não pega o caso raro; o traço lento costuma ser o que você quer, e é o que a amostra descarta |
| ADOT (OpenTelemetry) | Distribuição AWS do padrão aberto de telemetria | Padroniza traço e métrica quando a empresa já tem observabilidade própria fora da AWS | Mais peças para operar; ganha quando existe destino externo, perde em stack só AWS |
| AgentCore Observability | Visão de sessão de agent: trajetória, uso de ferramenta e consumo | O único que mostra a execução do agent como unidade — traço genérico fragmenta o laço em N chamadas soltas | Específico do AgentCore; agent em Lambda ou Fargate precisa de instrumentação própria |
Ajuste a amostragem para pegar a cauda
Amostragem uniforme é ótima para medir o comportamento típico e inútil para investigar o problema — que quase sempre está no percentil 95. Configure a regra para capturar 100% dos traços que estouram um limiar de latência ou que terminam em erro, e amostre baixo o resto. Sem isso, você olha um painel bonito de casos médios enquanto o usuário reclama de um caminho que nunca foi capturado.
Os três registros diferentes
Times confundem os três, e a confusão só aparece quando a auditoria pergunta algo que nenhum deles responde. Eles registram coisas diferentes e complementares — você precisa dos três, e cada um tem custo e risco próprios.
Quem chamou qual API, quando, de onde e com qual identidade. É o plano de controle e a chamada em si.O conteúdo: prompt enviado, resposta gerada, tokens, modelo e guardrail aplicados.A decisão de negócio: qual rota, qual tier, qual limiar, qual revisão humana, qual desfecho.| Pergunta da auditoria | Quem responde | Se estiver faltando |
|---|---|---|
| Quem invocou o modelo em 12 de março às 14h? | CloudTrail | Você não consegue atribuir a chamada a uma identidade |
| O que exatamente foi perguntado e respondido? | Model invocation logging | Não é recuperável de forma alguma — o conteúdo não é armazenado por padrão |
| Por que o sistema decidiu não escalar para humano? | Log da aplicação | Você tem o conteúdo mas não a lógica; a decisão fica inexplicável |
| O guardrail estava ativo naquele dia e nesta versão? | Log de invocação + Config | Fica como afirmação sem prova |
| Quem revisou e o que alterou? | Log da aplicação | O controle de revisão humana deixa de ser auditável |
| O log foi alterado depois? | Bucket com versionamento e bloqueio de escrita | A trilha perde valor probatório |
| Registro | O que é | O que soma ao Bedrock | O limite que decide |
|---|---|---|---|
| AWS CloudTrail | Trilha de chamadas de API: quem, quando, de onde, com qual identidade | Atribui cada invocação a uma identidade — a base de qualquer investigação de acesso | Não guarda o conteúdo do prompt nem da resposta. Evento de dado tem custo próprio e volume alto |
| Model invocation logging | Registro do conteúdo: prompt enviado, resposta gerada, tokens, modelo e guardrail aplicados | É o único que responde "o que exatamente foi perguntado e respondido" — e não é reconstituível depois | Passivo de privacidade: exige chave própria, política restritiva e retenção acordada antes de ligar |
| Log da aplicação | O que o seu código registra sobre a decisão de negócio | É o único que explica o PORQUÊ: qual rota, qual tier, qual limiar vigente, qual revisão humana | Só existe se você instrumentar; e precisa ser estruturado para ser consultável |
O log de invocação é um passivo de privacidade
Ligar o registro de conteúdo significa que prompts e respostas — com todo o dado pessoal que carregam — passam a viver em um destino de armazenamento. É necessário para auditoria e é um risco por si só. Trate esse destino como o dado mais sensível da arquitetura: chave gerenciada pelo cliente, política restritiva, acesso monitorado e retenção acordada com o encarregado de dados antes de ligar. E lembre que o mesmo cuidado vale para a tabela de conversas e para o bucket de transcrições.
Custo: os serviços que fecham a conta
| Serviço | O que é | O que soma ao Bedrock | O limite que decide |
|---|---|---|---|
| Cost Explorer | Visão de custo por serviço, etiqueta e período | Custo por squad e por caso de uso, sem contabilidade caseira — se o inference profile estiver etiquetado | Só separa o que foi etiquetado; etiqueta criada hoje não retroage sobre o gasto de ontem |
| AWS Budgets | Orçamento com alerta e ação automática | Teto por app, com ação quando estoura — não só e-mail para uma caixa que ninguém lê | Avisa quando o dinheiro já foi gasto; é rede de segurança, não controle preventivo |
| Cost Anomaly Detection | Detecção de variação atípica de gasto, sem você definir limiar | Pega o laço descontrolado, o retry infinito e o cache que parou de acertar — no mesmo dia | Precisa de histórico para aprender o padrão; nas primeiras semanas é menos sensível |
| Cost and Usage Report | O dado bruto de custo e uso, no detalhe, para o seu próprio painel | Cruzar custo com métrica de negócio para chegar ao custo por resultado — a métrica que vai ao comitê | Volume grande; exige consulta sobre o lago para ser útil |
| Compute Optimizer | Recomendação de dimensionamento de recurso de compute | Acha capacidade parada no compute em volta da inferência | Não enxerga o custo de inferência em si, que é a maior parcela em volume alto |
Orçamento mensal avisa tarde demais
Quando o alerta de orçamento dispara, o dinheiro já foi gasto. O que protege de verdade é a detecção de variação diária combinada com quota por aplicação no gateway: a primeira avisa no mesmo dia, e a segunda transforma um incidente de custo numa recusa controlada com mensagem clara. Configure as duas antes de abrir o sistema para o segundo time — não depois do primeiro susto.
A auditoria pede o conteúdo exato de uma conversa de quatro meses atrás. O CloudTrail está ativo desde o início do projeto. É possível responder?
Entrega: como isso sobe
| Serviço | O que é | O que soma ao Bedrock | O limite que decide |
|---|---|---|---|
| CDK / CloudFormation / Terraform | Infraestrutura declarada em código, versionada e reproduzível | Guardrail, base de conhecimento e inference profile também são infraestrutura — versione-os como código | Recurso de IA muda de forma rápida; provider pode ficar atrás do console em recurso novo |
| CodePipeline / CodeBuild | Esteira de build e deploy gerenciada | É onde o gate de avaliação entra como etapa que bloqueia regressão antes do merge | Rodar a eval completa no pipeline custa inferência; use conjunto rápido no PR e completo no gate |
| Amazon ECR | Registro de imagem de container | Quando o agent roda em Fargate ou EKS em vez de Lambda | Armazenamento por GB; imagem antiga acumula se não houver política de expiração |
Prompt e guardrail são artefatos versionados
O erro operacional mais comum em plataforma de IA madura: alguém melhora uma frase do prompt direto em produção numa sexta-feira, a qualidade cai e não existe diff para reverter. Prompt, versão de guardrail, limiar de confiança e mapeamento de tier precisam viver em configuração versionada, com o identificador registrado em cada chamada. É o que permite responder "o que mudou?" e, principalmente, voltar atrás em minutos.
- → invoca pelo profile etiquetado
- → métrica dimensionada por app, rota e tier
- → sonda executa o caminho crítico
- → conteúdo: não é reconstituível depois
- → a etiqueta é o que separa o custo por squad
- Compute
- IA e machine learning
- Gestão e governança
- Segurança e identidade
A mesma chamada produz três registros com finalidades distintas. Nenhum dos três substitui os outros — e o do meio, o conteúdo, é o único que não dá para reconstituir depois.
- A chamada acontece pelo profile certo. O gateway invoca pelo application inference profile do app — é a etiqueta dele que vai permitir separar o custo depois.
- Emitir a métrica que não existe de graça. Tokens de entrada e saída, razão de cache, latência e desfecho, dimensionados por app, rota e tier — cardinalidade baixa.
- Rastrear para responder onde o tempo foi. Traço distribuído com amostragem ajustada para capturar 100% do que estoura o limiar. A cauda é o que interessa.
- Registrar identidade e conteúdo. A trilha de API diz quem chamou; o registro de invocação guarda prompt e resposta — com chave própria e retenção acordada antes de ligar.
- Fechar a conta por squad. A etiqueta do profile faz o custo chegar separado, sem contabilidade caseira. Sem ela, é uma linha única e a conversa vira rateio.
- Proteger contra surpresa. Detecção de variação diária pega o laço descontrolado no mesmo dia; o orçamento é a rede de segurança, não o controle.
Combinações que se repetem
| Instrumento | Sinal que você olha | Erro comum | |
|---|---|---|---|
| "Está fora do ar?" | Synthetics + alarme | Sonda falhando no caminho crítico | Descobrir pelo usuário porque a sonda não existe |
| "Por que está lento?" | X-Ray com amostragem da cauda | Tempo por segmento: retrieval, inferência, tool, fila | Amostragem uniforme, que descarta justamente o traço lento |
| "Por que ficou caro ontem?" | Cost Anomaly Detection | Variação percentual diária por app | Confiar no orçamento mensal, que avisa depois do gasto |
| "O que o modelo respondeu?" | Model invocation logging | Prompt e resposta daquela chamada | Achar que o CloudTrail guarda conteúdo — não guarda |
| "Quanto custa por ticket?" | Cost Explorer + métrica de negócio | Custo etiquetado dividido por resultado, não por request | Dividir por requisição, o que esconde o que o comitê quer saber |
| "O que mudou no deploy?" | Parameter Store + log estruturado | Versão de prompt, guardrail e tier registrada na chamada | Prompt alterado direto em produção, sem diff para reverter |
Checklist do dia 1 desta camada
- Application inference profile por app, etiquetado com o centro de custo — antes do primeiro request.
- Métricas de tokens de entrada e saída, razão de cache, latência e desfecho publicadas desde a primeira chamada.
- Log estruturado em campos, separado do destino que guarda o conteúdo integral.
- Registro de invocação ligado, com chave própria e retenção acordada com o encarregado de dados.
- Alarme de variação percentual diária de gasto, além do orçamento mensal.
- Quota por aplicação no gateway, para transformar incidente de custo em recusa controlada.
- Rastreamento distribuído ligado, com regra que captura 100% do que estoura o limiar de latência.
- Sonda sintética no caminho crítico, executando após cada publicação.
- Baseline do processo manual anotado por escrito, com data — é o denominador de todo cálculo de retorno.
O item 9 é o mais barato e o mais esquecido
Anotar quanto o processo manual custa e demora, hoje, com data, leva uma tarde e é impossível de recuperar depois. Sem esse número, a pergunta "quanto economizamos?" só tem resposta em forma de sensação — e sensação perde para planilha na revisão de orçamento. Se a operação não tem os dados, uma estimativa grosseira registrada por escrito vale mais que nenhuma.
Erros clássicos desta camada
- Achar que o CloudTrail guarda o conteúdo do prompt: ele registra a chamada, não o texto. Descobrir isso na auditoria é tarde.
- Ligar o registro de conteúdo sem chave própria e sem retenção: você criou um repositório de dado pessoal sem política.
- Dimensionar métrica por id de usuário: cardinalidade explode e a fatura de observabilidade rivaliza com a de inferência.
- Log em texto corrido: impossível de consultar por atributo e caro de escanear.
- Amostragem uniforme de traço: o problema está no percentil 95, que é exatamente o que a amostra descarta.
- Só orçamento mensal: quando o alerta dispara, o dinheiro já foi. Falta a detecção de variação diária.
- Etiqueta criada depois: não retroage. O custo dos meses anteriores continua indivisível.
- Custo por requisição em vez de por resultado de negócio: esconde exatamente o que a diretoria quer comparar.
- Prompt e guardrail fora do controle de versão: alguém melhora uma frase na sexta e não existe diff para reverter.
Um agent entrou em laço e consumiu um valor inesperado num único dia. O time tem orçamento mensal configurado com alerta em 80%. Por que o alerta não ajudou?
Você quer levar ao comitê o retorno do projeto de atendimento. Qual denominador usar no custo?
Próximo passo
Com governança e operação no lugar, voltamos para o caminho do usuário. Os três próximos módulos percorrem a borda por onde o pedido entra, o compute e a orquestração que coordenam os passos, e a camada de dados que alimenta o modelo — cada serviço com o que é, o que soma e o limite que decide.
Perguntas frequentes
❓ O que medir num sistema de IA na AWS?
❓ Rastreamento distribuído ajuda em agente?
❓ Como alertar sobre custo antes do fim do mês?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…