Uma implementação simples de observabilidade com OpenTelemetry
Quando pensamos no ecossistema Pydantic, normalmente associamos a tecnologia ao Python, validação de dados e aplicações de Inteligência Artificial. Porém, existe uma possibilidade muito interessante para aplicações .NET: utilizar o Pydantic Logfire como plataforma de observabilidade para uma aplicação construída em .NET 10.
E aqui está o ponto mais importante:
Não precisamos criar uma integração específica entre .NET e Pydantic.
O caminho mais simples é utilizar o OpenTelemetry, padrão aberto utilizado pelo Logfire. O .NET envia traces, métricas e logs através do protocolo OTLP, e o Logfire recebe e apresenta essas informações em sua plataforma. (logfire.pydantic.dev)
Neste artigo, vamos construir uma implementação simples utilizando .NET 10 + ASP.NET Core + OpenTelemetry + Logfire.
🧭 O que vamos construir?
A arquitetura será propositalmente simples:
┌──────────────────────┐
│ Cliente │
└──────────┬───────────┘
│ HTTP
▼
┌──────────────────────┐
│ .NET 10 API │
│ │
│ ASP.NET Core │
│ ILogger │
│ Activity │
│ Metrics │
└──────────┬───────────┘
│
│ OTLP / HTTP
▼
┌──────────────────────┐
│ Pydantic Logfire │
│ │
│ Logs │
│ Traces │
│ Metrics │
└──────────────────────┘
O objetivo não é transformar o .NET em uma aplicação Python/Pydantic.
O objetivo é comunicar uma aplicação .NET com o ecossistema Pydantic através de um padrão de observabilidade aberto.
🧠 1. Onde entra o Pydantic?
O ecossistema Pydantic possui diferentes ferramentas.
Na imagem apresentada, podemos observar uma organização bastante interessante:
🏗️ Build
- Pydantic AI
- Pydantic Validation
🔄 Iterate
- Pydantic Evals
- Logfire Agent Optimization
🚀 Deploy & Monitor
- Logfire Agent Monitoring
- Logfire Infrastructure Monitoring
- Logfire
- Logfire AI Gateway
Para uma primeira implementação com .NET, entretanto, não precisamos começar por Pydantic AI, Evals ou AI Gateway.
A opção mais simples é:
.NET 10 → OpenTelemetry → Logfire
Isso reduz drasticamente a complexidade inicial.
O próprio Logfire informa que aplicações em linguagens compatíveis com OpenTelemetry podem enviar telemetria diretamente para sua infraestrutura. (logfire.pydantic.dev)
🔌 2. O que significa "comunicar .NET com Pydantic"?
É importante fazer uma distinção.
Não teremos necessariamente:
.NET
↓
Pydantic API
A arquitetura será:
.NET
↓
OpenTelemetry
↓
OTLP
↓
Logfire
O OTLP (OpenTelemetry Protocol) é justamente o protocolo utilizado para transportar dados de telemetria entre aplicações e backends compatíveis. (Microsoft Learn)
Isso também significa que a mesma aplicação poderia posteriormente enviar sua telemetria para outras plataformas compatíveis com OpenTelemetry.
🛠️ 3. Criando a API .NET 10
Vamos começar com uma aplicação mínima.
dotnet new webapi -n DotNetLogfire
cd DotNetLogfire
Confira o projeto:
dotnet run
Agora temos nossa API .NET 10.
📦 4. Instalando OpenTelemetry
Vamos instalar o exporter OTLP:
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
Também podemos adicionar as instrumentações necessárias:
dotnet add package OpenTelemetry.Extensions.Hosting
dotnet add package OpenTelemetry.Instrumentation.AspNetCore
dotnet add package OpenTelemetry.Instrumentation.Http
O pacote OpenTelemetry.Exporter.OpenTelemetryProtocol fornece o exporter OTLP para aplicações .NET e é compatível com net10.0. (NuGet)
🔐 5. Criando um token no Logfire
No Logfire, crie um projeto e gere um write token.
Esse token será utilizado pela aplicação para autenticar o envio da telemetria.
Não coloque o token diretamente no código:
// ❌ Não faça isso
var token = "meu-token-real";
Prefira variável de ambiente:
LOGFIRE_TOKEN
Isso permite manter credenciais fora do código-fonte.
A documentação do Logfire utiliza o header de autorização para autenticar os dados enviados através de OTLP. (logfire.pydantic.dev)
🌐 6. Configurando o endpoint do Logfire
Para uma configuração simples, podemos utilizar:
OTEL_EXPORTER_OTLP_ENDPOINT=https://logfire-us.pydantic.dev
E:
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
Além disso:
OTEL_EXPORTER_OTLP_HEADERS=Authorization=SEU_TOKEN
O Logfire documenta explicitamente essa configuração para clientes OpenTelemetry que não possuem um SDK específico do Logfire. (logfire.pydantic.dev)
Se seu projeto estiver utilizando a região europeia, utilize o endpoint correspondente do Logfire EU.
⚙️ 7. Configurando o OpenTelemetry no .NET
Agora vamos configurar o Program.cs.
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
var builder = WebApplication.CreateBuilder(args);
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder.Services
.AddOpenTelemetry()
.WithTracing(tracing =>
{
tracing
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation();
})
.WithMetrics(metrics =>
{
metrics
.AddAspNetCoreInstrumentation()
.AddRuntimeInstrumentation();
})
.UseOtlpExporter();
var app = builder.Build();
app.MapGet("/", () =>
{
return Results.Ok(new
{
message = "Hello Logfire!",
timestamp = DateTime.UtcNow
});
});
app.Run();
A estrutura segue o modelo recomendado pelo OpenTelemetry no .NET: ILogger para logs, ActivitySource para tracing e Meter para métricas. (Microsoft Learn)
📊 8. O que estamos enviando?
Agora temos três categorias principais.
📝 Logs
Gerados através de:
ILogger
Por exemplo:
app.MapGet("/products", (
ILogger<Program> logger) =>
{
logger.LogInformation(
"Consultando produtos");
return Results.Ok(new[]
{
"Notebook",
"Mouse",
"Keyboard"
});
});
🔎 9. Traces
O OpenTelemetry consegue instrumentar automaticamente requisições HTTP do ASP.NET Core.
Por exemplo:
GET /products
│
▼
ASP.NET Core
│
▼
Controller / Endpoint
│
▼
HttpClient
│
▼
External API
Esse fluxo pode ser representado como um trace.
A grande vantagem é conseguir entender onde uma requisição gastou tempo.
📈 10. Métricas
Também podemos trabalhar com métricas.
Por exemplo:
HTTP Requests
Request Duration
Active Requests
Runtime Metrics
GC
CPU
Memory
O ASP.NET Core e o .NET já possuem diversas métricas instrumentadas, e o OpenTelemetry pode coletá-las. (Microsoft Learn)
🧪 11. Criando um endpoint para teste
Vamos criar um endpoint um pouco mais interessante:
app.MapGet("/orders/{id}", (
int id,
ILogger<Program> logger) =>
{
logger.LogInformation(
"Consultando pedido {OrderId}",
id);
if (id <= 0)
{
logger.LogWarning(
"Pedido inválido: {OrderId}",
id);
return Results.BadRequest();
}
return Results.Ok(new
{
Id = id,
Status = "Processed"
});
});
Agora podemos testar:
GET /orders/10
E:
GET /orders/0
Teremos dois comportamentos diferentes.
🔥 12. Gerando um erro proposital
Para entender melhor a observabilidade, podemos criar:
app.MapGet("/error", () =>
{
throw new InvalidOperationException(
"Erro de demonstração");
});
Quando acessarmos:
GET /error
teremos uma exceção.
O objetivo aqui é observar como o problema aparece no Logfire.
🔗 13. O fluxo completo
Agora nossa arquitetura está assim:
┌───────────────────┐
│ Browser │
│ Postman │
│ Client │
└─────────┬─────────┘
│
▼
┌───────────────────┐
│ .NET 10 │
│ ASP.NET Core │
└─────────┬─────────┘
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
ILogger Activity Meter
│ │ │
└────────────────┼────────────────┘
▼
┌───────────────┐
│ OpenTelemetry │
└───────┬───────┘
│
OTLP
│
▼
┌─────────────────┐
│ Logfire │
│ Pydantic │
└─────────────────┘
Essa é a parte mais interessante da implementação.
Não criamos um SDK proprietário para integrar o .NET.
Utilizamos um padrão aberto.
🧩 14. Por que essa abordagem é interessante?
Imagine que amanhã você queira trocar o Logfire.
A aplicação não precisa ser completamente reescrita.
Poderíamos direcionar o OpenTelemetry para:
.NET
│
└── OpenTelemetry
│
├── Logfire
├── Grafana
├── Datadog
├── Azure Monitor
├── New Relic
└── Outro backend OTLP
Essa independência é justamente uma das principais vantagens do OpenTelemetry. (Microsoft Learn)
🏗️ 15. E onde entra o Pydantic AI?
Aqui começa uma arquitetura ainda mais interessante.
Podemos ter:
┌─────────────────┐
│ .NET 10 │
│ API │
└────────┬────────┘
│
│ HTTP
▼
┌─────────────────┐
│ Pydantic AI │
│ Agent │
└────────┬────────┘
│
▼
LLM
│
▼
Logfire
Nesse cenário, o .NET poderia ser responsável por:
- APIs
- autenticação
- regras de negócio
- banco de dados
- integrações corporativas
Enquanto o ecossistema Pydantic poderia assumir:
- agentes
- validação
- avaliação
- workflows de IA
E o Logfire poderia fornecer uma camada de observabilidade.
🤖 16. Uma arquitetura híbrida .NET + Pydantic
Uma arquitetura mais completa poderia ficar assim:
Client
│
▼
┌──────────────┐
│ .NET 10 │
│ API │
└──────┬───────┘
│
┌──────────┴──────────┐
│ │
▼ ▼
Business Rules Pydantic AI
│ │
│ ▼
│ LLM
│ │
└──────────┬──────────┘
▼
OpenTelemetry
│
▼
Logfire
Isso cria uma separação interessante entre aplicação empresarial e camada de inteligência artificial.
🔐 17. Segurança
Um ponto extremamente importante é evitar enviar informações sensíveis para uma plataforma de observabilidade.
Por exemplo, evite:
logger.LogInformation(
"Cartão: {CardNumber}",
cardNumber);
Ou:
logger.LogInformation(
"Token: {Token}",
token);
Prefira:
logger.LogInformation(
"Pagamento processado para o pedido {OrderId}",
orderId);
O Logfire também possui mecanismos de processamento e redaction através do ecossistema OpenTelemetry Collector para cenários em que dados precisam ser filtrados antes do envio. (logfire.pydantic.dev)
🐳 18. E se eu quiser usar Docker?
A aplicação pode continuar sendo executada normalmente:
docker build -t dotnet-logfire .
E:
docker run \
-e OTEL_EXPORTER_OTLP_ENDPOINT=https://logfire-us.pydantic.dev \
-e OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \
-e OTEL_EXPORTER_OTLP_HEADERS="Authorization=SEU_TOKEN" \
-p 8080:8080 \
dotnet-logfire
Assim, as configurações permanecem fora da imagem.
📦 19. E o OpenTelemetry Collector?
Em uma arquitetura maior, podemos adicionar um Collector:
.NET 10
│
▼
OpenTelemetry
│
▼
OTel Collector
│
├──────────────► Logfire
│
├──────────────► Grafana
│
└──────────────► Datadog
Isso é particularmente interessante quando existe necessidade de:
- filtragem;
- redaction;
- transformação;
- roteamento;
- múltiplos backends.
O próprio Logfire documenta o uso do OpenTelemetry Collector como camada intermediária para processamento e encaminhamento da telemetria. (logfire.pydantic.dev)
🧠 20. O que aprendemos?
A implementação demonstrou algo importante:
Integrar .NET com Pydantic não significa necessariamente consumir uma API Python diretamente.
Podemos utilizar o ecossistema de padrões que conecta as duas tecnologias.
A arquitetura utilizada foi:
.NET 10
↓
OpenTelemetry
↓
OTLP
↓
Pydantic Logfire
E isso nos permite observar:
Logs
Traces
Metrics
em uma plataforma construída para observabilidade de aplicações e sistemas de IA. O Logfire atualmente se posiciona justamente como uma plataforma de observabilidade baseada em OpenTelemetry para aplicações, serviços e agentes de IA. (Pydantic)
🚀 21. Próximo passo: .NET + Pydantic AI
Depois dessa primeira comunicação, podemos evoluir a arquitetura.
Nível 1 — Observabilidade
.NET 10
↓
OpenTelemetry
↓
Logfire
Nível 2 — API + Agent
.NET 10
↓
Pydantic AI
↓
LLM
↓
Logfire
Nível 3 — Arquitetura completa
Client
│
▼
.NET 10
│
┌────────┴────────┐
▼ ▼
Database Pydantic AI
│
▼
LLM
│
▼
OpenTelemetry
│
▼
Logfire
Essa evolução abre espaço para aplicações híbridas envolvendo .NET, agentes de IA, LLMs, observabilidade e arquitetura distribuída.
✅ Conclusão
O mais interessante nessa integração é justamente sua simplicidade.
Para começar, não precisamos criar uma ponte complexa entre .NET e Python.
Podemos utilizar:
.NET 10 + OpenTelemetry + OTLP + Logfire.
Com poucas configurações, uma aplicação .NET consegue enviar logs, traces e métricas para o Logfire, aproveitando um padrão aberto e independente de fornecedor. (logfire.pydantic.dev)
E essa abordagem pode ser o primeiro passo para uma arquitetura muito maior, conectando APIs .NET, Pydantic AI, agentes, LLMs e observabilidade.
Talvez a melhor forma de começar com Pydantic no .NET não seja começar pelo Pydantic — mas pelo OpenTelemetry.
🤝 Conecte-se Comigo
Se você trabalha com .NET moderno e quer evoluir em temas como arquitetura, C#, Inteligência Artificial, observabilidade, DevOps ou interoperabilidade, vamos conversar:
- 🌐 shifters.dev
- 💻 Dev.to
- ✍️ Medium
- ✍️ Substack
- 📬 contato@dopme.io
🔗 Referências
- Pydantic Logfire
- Documentação do Logfire
- Logfire — integração com clientes OpenTelemetry alternativos
- OpenTelemetry no .NET — Microsoft Learn
- Exemplo de OTLP no .NET
Eu lhes dou este novo mandamento: amem uns aos outros. Assim como eu os amei, amem também uns aos outros.
João 13:34
Top comments (0)