1

Observabilidade em Agentes de IA: Por que adotamos o OpenTelemetry

Fala, pessoal. Quem aqui já tentou debugar um agente de Inteligência Artificial em produção sabe do que estou falando: é uma caixa preta assustadora.

Quando construímos integrações normais (APIs CRUD), rastrear o erro é fácil: o banco demorou ou o payload veio errado. Mas quando você lida com agentes baseados em LangChain/LlamaIndex que tomam decisões autônomas, chamam ferramentas (tool calling) e montam** RAGs **dinâmicos, o log tradicional no terminal não serve para absolutamente nada.

Para resolver isso nas nossas trincheiras de infraestrutura, paramos de tratar a LLM como "texto" e passamos a tratá-la como um microsserviço instável. A solução? OpenTelemetry (OTel).

O Paradigma do Trace

Com o OpenTelemetry, cada interação do usuário com o agente gera um Trace. Dentro desse Trace, quebramos as ações da IA em Spans. Se o agente levou 20 segundos para responder, eu não olho mais pro log de erro genérico. Eu abro o meu backend de observabilidade (como Jaeger, Datadog ou Grafana Tempo) e vejo o gráfico de Gantt do trace:

  • Criação do Embedding (150ms)
  • Busca Vetorial no banco (80ms) - Até aqui tudo bem.
  • Inferência do GPT-4 tentando entender as ferramentas (19.5s) - Achei o gargalo!

A Instrumentação na Prática

A mágica da comunidade open-source é que você não precisa instrumentar os spans na mão. Existem bibliotecas (como o opentelemetry-instrumentation-langchain ou integradores de provedores de IA) que injetam wrappers nas chamadas automaticamente.

Um exemplo mínimo em Python da estrutura que usamos no backend para ligar os motores do OTel antes do agente rodar:

Python

from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
from opentelemetry.instrumentation.openai import OpenAIInstrumentor

# Configurando o provider para mandar os traces para o console (ou seu coletor OTLP)
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(ConsoleSpanExporter())
)

# A mágica: instrumenta todas as chamadas de OpenAI (LangChain, autogen, etc)
OpenAIInstrumentor().instrument()

# A partir daqui, seu agente roda normal, mas gerando Spans, Latência e Contagem de Tokens.

Métricas vs Traces: Contando os Tokens

Além de latência, o OTel captura metadados injetados nos spans (os Attributes). Isso significa que cada span de **LLM **carrega embutido atributos como llm.usage.prompt_tokens e llm.usage.completion_tokens.

Agregando essas métricas via PromQL no Prometheus, você cria um dashboard de FinOps instantâneo. Se o agente entrar em loop infinito no fim de semana, a sua infraestrutura vai detectar a anomalia de consumo de tokens por minuto e derrubar o serviço muito antes de gerar um rombo no faturamento.

Não subam agentes para produção apenas com print(). Usem OTel.

A tese técnica completa dessa arquitetura de observabilidade está documentada em nosso log de engenharia original.

Carregando publicação patrocinada...