Nexx.Observability.Client
1.2.0
dotnet add package Nexx.Observability.Client --version 1.2.0
NuGet\Install-Package Nexx.Observability.Client -Version 1.2.0
<PackageReference Include="Nexx.Observability.Client" Version="1.2.0" />
<PackageVersion Include="Nexx.Observability.Client" Version="1.2.0" />
<PackageReference Include="Nexx.Observability.Client" />
paket add Nexx.Observability.Client --version 1.2.0
#r "nuget: Nexx.Observability.Client, 1.2.0"
#:package Nexx.Observability.Client@1.2.0
#addin nuget:?package=Nexx.Observability.Client&version=1.2.0
#tool nuget:?package=Nexx.Observability.Client&version=1.2.0
Nexx.Observability.Client
Cliente .NET 8 para envio de métricas e erros para a plataforma centralizada Nexx.Observability hospedada em Supabase.
Princípio Crítico
Observabilidade nunca deve derrubar o projeto principal.
Todas as operações são:
- Fire-and-forget: retornam imediatamente, não bloqueiam
- Silenciosas em falha: exceções são capturadas e descartadas
- Com retry automático: mensagens que falham são reprocessadas a cada 10 segundos
- Thread-safe: podem ser usadas em ambiente multi-threaded
Características Principais
✓ HTTPS obrigatório - Validação na inicialização (única exception permitida) ✓ Timeout de 5 segundos - Previne travamento da aplicação ✓ Buffer com fila de reprocessamento - Máximo 1000 mensagens pendentes ✓ Retry automático - Até 3 tentativas com intervalo de 10 segundos ✓ Flush final - Aguarda até 3 segundos ao descartar para enviar mensagens pendentes ✓ Sem dependências externas - Usa apenas APIs padrão do .NET 8 ✓ IDisposable - Limpeza correta de recursos
Instalação
dotnet add package Nexx.Observability.Client
Ou adicione ao seu .csproj:
<ItemGroup>
<PackageReference Include="Nexx.Observability.Client" Version="4.0.0" />
</ItemGroup>
Configuração
1. Adicionar seção no appsettings.json
{
"Observability": {
"Url": "https://seu-projeto.supabase.co",
"ApiKey": "sua-chave-de-api-aqui"
}
}
Nota: A URL DEVE começar com https://. Conexões não-criptografadas não são permitidas.
2. Registrar no container de DI
Em Program.cs:
builder.Services.AddNexxObservability(builder.Configuration);
Uso
Injetar em seu serviço ou controller
public class ProcessamentoService
{
private readonly NexxObservabilityClient _observability;
public ProcessamentoService(NexxObservabilityClient observability)
{
_observability = observability;
}
public async Task ProcessarEncomedas()
{
try
{
int recebidas = 100;
int processadas = 98;
int comErro = 2;
// ... processamento ...
// Enviar métrica
await _observability.EnviarMetricaAsync(
tabela: "ProcessamentoEncomendas",
recebidos: recebidas,
processados: processadas,
comErro: comErro,
duracaoMs: 5000,
objType: "Encomenda",
loteNumero: 1,
origem: "IntegracaoERP"
);
}
catch (Exception ex)
{
// Enviar erro
await _observability.EnviarErroAsync(
tabela: "ProcessamentoEncomendas",
mensagemErro: ex.Message,
objType: "Encomenda",
chaveRegistro: "ENC123456",
stackTrace: ex.StackTrace,
tipoErro: ex.GetType().Name,
origem: "IntegracaoERP"
);
}
}
}
Métodos Disponíveis
EnviarMetricaAsync
Envia uma métrica de processamento.
public async Task EnviarMetricaAsync(
string tabela, // Nome da tabela processada
int recebidos, // Quantidade de registros recebidos
int processados, // Quantidade processada com sucesso
int comErro, // Quantidade com erro
int? duracaoMs = null, // Duração em milissegundos (opcional)
string? objType = null, // Tipo de objeto (ex: "Encomenda") (opcional)
int? loteNumero = null, // Número do lote (opcional)
string? origem = null // Origem do processamento (opcional)
)
EnviarErroAsync
Envia detalhes de um erro.
public async Task EnviarErroAsync(
string tabela, // Nome da tabela onde o erro ocorreu
string mensagemErro, // Mensagem descritiva do erro
string? objType = null, // Tipo de objeto (opcional)
string? chaveRegistro = null, // ID/chave do registro com erro (opcional)
object? payload = null, // Dados adicionais (opcional)
string? stackTrace = null, // Stack trace da exceção (opcional)
string? tipoErro = null, // Tipo/classe da exceção (opcional)
int? statusHttp = null, // Código HTTP se aplicável (opcional)
string? origem = null // Origem do erro (opcional)
)
EnviarLoteAsync
Envia um lote completo com métricas e lista de erros.
public async Task EnviarLoteAsync(
string tabela, // Nome da tabela
int recebidos, // Quantidade recebida
int processados, // Quantidade processada
int comErro, // Quantidade com erro
int? duracaoMs = null, // Duração em ms (opcional)
string? objType = null, // Tipo de objeto (opcional)
IEnumerable<ErroPayload>? erros = null, // Lista de erros (opcional)
string? origem = null // Origem (opcional)
)
Modelo ErroPayload
public class ErroPayload
{
public string? ChaveRegistro { get; set; } // ID do registro
public object? Payload { get; set; } // Dados adicionais
public string MensagemErro { get; set; } // Mensagem do erro
public string? StackTrace { get; set; } // Stack trace
public string? TipoErro { get; set; } // Tipo da exceção
public int? StatusHttp { get; set; } // Código HTTP
}
Comportamento em Caso de Falha
Se o envio falhar por qualquer motivo:
- A mensagem é adicionada a uma fila de reprocessamento interna
- Um timer automático (a cada 10 segundos) tenta reenviar
- Cada mensagem é tentada no máximo 3 vezes
- Após 3 falhas, a mensagem é descartada silenciosamente
- Se a fila atingir 1000 mensagens, as mensagens mais antigas são descartadas
- Durante
Dispose(), há um flush final (aguarda até 3 segundos)
Garantia: O cliente nunca lançará exceção que derrube sua aplicação.
Thread Safety
O cliente é 100% thread-safe e pode ser injetado como Singleton:
// Seguro usar em múltiplas threads simultaneamente
Task.Run(() => _observability.EnviarMetricaAsync(...));
Task.Run(() => _observability.EnviarErroAsync(...));
Limpeza de Recursos
O cliente implementa IDisposable:
using var client = new NexxObservabilityClient("https://...", "api-key");
// Usar...
// Ao sair do bloco using:
// - Timer de reprocessamento é cancelado
// - Fila pendente é processada (timeout de 3s)
// - HttpClient é descartado
Se usar injeção de dependência (recomendado), a limpeza é automática:
// Program.cs
builder.Services.AddNexxObservability(builder.Configuration);
// Ao encerrar a aplicação, o Dispose é chamado automaticamente
Exemplo Completo
// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddNexxObservability(builder.Configuration);
builder.Services.AddScoped<ProcessamentoService>();
var app = builder.Build();
// appsettings.json
{
"Observability": {
"Url": "https://seu-projeto.supabase.co",
"ApiKey": "seu-api-key"
}
}
// ProcessamentoService.cs
public class ProcessamentoService
{
private readonly NexxObservabilityClient _obs;
public ProcessamentoService(NexxObservabilityClient obs)
{
_obs = obs;
}
public async Task ProcessarLoteAsync(List<Encomenda> encomendas)
{
var processadas = 0;
var erros = new List<ErroPayload>();
var inicio = DateTime.UtcNow;
foreach (var enc in encomendas)
{
try
{
// Processar...
processadas++;
}
catch (Exception ex)
{
erros.Add(new ErroPayload
{
ChaveRegistro = enc.Id.ToString(),
MensagemErro = ex.Message,
StackTrace = ex.StackTrace,
TipoErro = ex.GetType().Name
});
}
}
var duracao = (int)(DateTime.UtcNow - inicio).TotalMilliseconds;
// Enviar lote com todas as métricas e erros
await _obs.EnviarLoteAsync(
tabela: "ProcessamentoEncomendas",
recebidos: encomendas.Count,
processados: processadas,
comErro: erros.Count,
duracaoMs: duracao,
objType: "Encomenda",
erros: erros,
origem: "IntegracaoERP"
);
}
}
Validações
- URL deve ser HTTPS: Se não for,
ArgumentExceptioné lançado na inicialização - ApiKey não pode ser vazia: Se vazia,
ArgumentExceptioné lançado - Configuração obrigatória: Se "Observability" não estiver no config,
InvalidOperationExceptioné lançado
Performance
- Timeout: 5 segundos máximo por requisição
- Buffer: Máximo 1000 mensagens na fila
- Retry: Cada 10 segundos, até 100 mensagens por ciclo
- Flush: Máximo 3 segundos ao descartar
Suporte
Para relatórios de bugs ou sugestões, entre em contato com o time Nexx.
Licença
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
v1.2.0 — payloadJson em métricas/lotes.
- EnviarMetricaAsync e EnviarLoteAsync agora aceitam o parâmetro opcional payloadJson,
gravado em integration_metrics.payload_json (alimenta o log de lotes / coluna Payload
nos dashboards). Útil para anexar o conteúdo bruto do lote (ou um resumo/chaves).
v1.1.0 — Configuração via IConfiguration.
- AddNexxObservability agora lê NexxObservability:TenantToken do appsettings.json
(ou user secrets, env var, etc.) e faz bootstrap. Não precisa mais do arquivo
C:\Nexx\observability.json se preferir configurar pela pipeline do .NET.
- Novo factory NexxObservabilityClient.CriarComToken(tenantToken) para bootstrap
com token explícito.
- Zero-config (env var ou arquivo) e modelo explícito (Url + ApiKey) continuam
funcionando por compatibilidade.
v1.0.1 — Adiciona README ao pacote (rendering em nuget.org).
v1.0.0 — Primeira release pública estável.
Features:
- HTTPS obrigatório com validação na inicialização
- Timeout de 5 segundos no HttpClient
- Buffer com fila de reprocessamento (max 1000 itens)
- Retry automático a cada 10 segundos (máx 3 tentativas)
- Flush final durante Dispose com timeout de 3 segundos
- Thread-safe com ConcurrentQueue
- Fire-and-forget com silent failure (nunca derruba o app host)
- Extensão de DI para ASP.NET Core
- Bootstrap de credencial via tenantToken (API key nunca toca disco)
- Sem dependências externas além do Microsoft.Extensions.*