Nuuvify.CommonPack.Observability 2.9.0

dotnet add package Nuuvify.CommonPack.Observability --version 2.9.0
                    
NuGet\Install-Package Nuuvify.CommonPack.Observability -Version 2.9.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="Nuuvify.CommonPack.Observability" Version="2.9.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Nuuvify.CommonPack.Observability" Version="2.9.0" />
                    
Directory.Packages.props
<PackageReference Include="Nuuvify.CommonPack.Observability" />
                    
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 Nuuvify.CommonPack.Observability --version 2.9.0
                    
#r "nuget: Nuuvify.CommonPack.Observability, 2.9.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 Nuuvify.CommonPack.Observability@2.9.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=Nuuvify.CommonPack.Observability&version=2.9.0
                    
Install as a Cake Addin
#tool nuget:?package=Nuuvify.CommonPack.Observability&version=2.9.0
                    
Install as a Cake Tool

Nuuvify.CommonPack.Observability

Quality Gate Status

NuGet Downloads

Implementação em .NET 8 para armazenar contexto de operação isolado por fluxo assíncrono. A biblioteca resolve a propagação controlada de identificadores de correlação, trace e operação entre métodos que participam da mesma execução, sem usar estado global mutável ou depender de ASP.NET Core.

Índice

Quando usar

Use este pacote na camada de infraestrutura ou no composition root quando uma API, worker, job ou consumidor de mensagens precisar disponibilizar um contexto de operação para logging, telemetria e propagação de correlação.

Use-o especialmente quando:

  • várias chamadas assíncronas precisam ler o mesmo contexto da operação;
  • execuções concorrentes não podem compartilhar correlation IDs;
  • o host deve integrar contexto próprio com Activity.Current sem acoplar o domínio ao framework de hospedagem.

Não é necessário adicioná-lo a uma aplicação que já possui um mecanismo equivalente e corretamente isolado.

O que resolve

  • fornece OperationContextAccessor, baseado em AsyncLocal;
  • permite escopos aninhados com restauração automática por OperationContextScope;
  • evita que o contexto de uma mensagem ou requisição seja reutilizado por outra execução assíncrona;
  • mantém o contrato de contexto separado de HTTP, claims, headers e secrets.

O que não resolve

Esta biblioteca não cria correlation IDs para protocolos automaticamente, não configura OpenTelemetry, não coleta logs e não valida tokens. O adapter do host deve decidir como obter os identificadores e quando abrir o escopo.

Instalação

<PackageReference Include="Nuuvify.CommonPack.Observability" Version="2.8.0" />

O pacote depende de Nuuvify.CommonPack.Observability.Abstraction, instalado automaticamente pelo NuGet.

Configuração

Registre um único accessor por processo usando o container de DI:

services.AddSingleton<IOperationContextAccessor, OperationContextAccessor>();

O accessor é stateless fora do fluxo assíncrono atual. Não registre um novo accessor para cada chamada; abra escopos de operação no limite da requisição, mensagem ou job.

Exemplo de uso

using Nuuvify.CommonPack.Observability;
using Nuuvify.CommonPack.Observability.Abstraction;

public sealed class MessageProcessor
{
        private readonly IOperationContextAccessor _accessor;

        public MessageProcessor(IOperationContextAccessor accessor)
        {
                _accessor = accessor;
        }

        public async Task ProcessAsync(string correlationId, CancellationToken cancellationToken)
        {
                var operation = new OperationContext(
                        correlationId: correlationId,
                        operationId: Guid.NewGuid().ToString("N"));

                using var scope = new OperationContextScope(_accessor, operation);
                await PersistAuditAsync(_accessor.Current, cancellationToken);
        }

        private static Task PersistAuditAsync(
                OperationContext context,
                CancellationToken cancellationToken)
        {
                return Task.CompletedTask;
        }
}

Ao sair do using, o contexto anterior é restaurado. Isso permite composição segura de operações aninhadas e facilita testes determinísticos.

Boas práticas

  • abra o escopo no limite da operação, não no construtor de um singleton;
  • use identificadores fornecidos pelo protocolo quando forem confiáveis e gere um fallback no adapter quando necessário;
  • mantenha metadata limitada a dados técnicos e não sensíveis;
  • propague CancellationToken para o trabalho iniciado dentro do escopo;
  • use ActivitySource para trace distribuído e deixe este pacote cuidar apenas do contexto neutro.

Compatibilidade

  • alvo: net8.0;
  • depende de Nuuvify.CommonPack.Observability.Abstraction;
  • não depende de ASP.NET Core, hosting, logging ou banco de dados.

Troubleshooting

O contexto aparece vazio

Verifique se o accessor foi registrado no DI e se o código consumidor executa dentro de um OperationContextScope ativo.

Duas mensagens compartilham o mesmo correlation ID

Não mantenha um OperationContext em campo de singleton. Crie um contexto novo por mensagem ou requisição e abra um escopo independente.

O contexto não chega a uma tarefa assíncrona

Confirme que a tarefa faz parte do fluxo assíncrono atual e não foi criada com um contexto artificialmente suprimido. Evite copiar o contexto para estado global ou cache compartilhado.

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 (1)

Showing the top 1 NuGet packages that depend on Nuuvify.CommonPack.Observability:

Package Downloads
Nuuvify.CommonPack.Middleware

Middlewares e filtros customizados, deve ser baixado no projeto IoC. HandlingHeadersMiddleware - Inclui a versco da aplicacco e do assembly no header da request, tambcm loga o conteudo da request. GlobalHandleException - Captura e loga as exceptions de forma global. ValidateModelAttribute - Retorna os erros da ModelState de forma padronizada

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.9.0 53 8/26/2026
2.9.0-preview.45 48 8/26/2026
2.9.0-preview.44 56 8/26/2026

# Changelog

## [Não Lançado]

### Corrigido

- Teste de isolamento concorrente convertido para fluxo assíncrono sem operações bloqueantes.
- Cobertura ampliada para restauração de contexto e descarte idempotente de escopos.

### Adicionado

- Documentada a adoção de `OperationContextScope` para requests, mensagens e jobs.

## 2.8.0

- Adicionada a implementação de contexto de operação isolada por `AsyncLocal`.
- Incluído `OperationContextScope` para preservação do contexto anterior em escopos aninhados.
- Integração mínima com `System.Diagnostics.Activity` para uso em workers e requests.