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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Nexx.Observability.Client" Version="1.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Nexx.Observability.Client" Version="1.2.0" />
                    
Directory.Packages.props
<PackageReference Include="Nexx.Observability.Client" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Nexx.Observability.Client --version 1.2.0
                    
#r "nuget: Nexx.Observability.Client, 1.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Nexx.Observability.Client@1.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Nexx.Observability.Client&version=1.2.0
                    
Install as a Cake Addin
#tool nuget:?package=Nexx.Observability.Client&version=1.2.0
                    
Install as a Cake Tool

Nexx.Observability.Client

NuGet .NET 8

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:

  1. A mensagem é adicionada a uma fila de reprocessamento interna
  2. Um timer automático (a cada 10 segundos) tenta reenviar
  3. Cada mensagem é tentada no máximo 3 vezes
  4. Após 3 falhas, a mensagem é descartada silenciosamente
  5. Se a fila atingir 1000 mensagens, as mensagens mais antigas são descartadas
  6. 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.0 387 6/19/2026
1.1.0 128 5/27/2026
1.0.1 129 5/25/2026
1.0.0 107 5/25/2026

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.*