Start Debugging

.NET 11 dá ao MemoryCache métricas de OpenTelemetry de primeira classe

.NET 11 Preview 4 traz um meter integrado para Microsoft.Extensions.Caching.Memory, então a taxa de acerto do cache e as expulsões fluem para o OpenTelemetry sem um poller em segundo plano.

O número mais útil para qualquer serviço com muitas leituras é a taxa de acerto do cache, e até agora Microsoft.Extensions.Caching.Memory obrigava você a garimpá-lo. .NET 11 Preview 4, lançado em 2026-06-02, resolve isso: MemoryCache agora emite métricas de OpenTelemetry a partir de um meter integrado, então acertos, erros, expulsões e tamanho chegam aos seus dashboards sem uma única linha de encanamento personalizado.

O que TrackStatistics custava antes

TrackStatistics e GetCurrentStatistics() existem desde o .NET 8, mas só entregavam um objeto de snapshot. Para transformar isso em uma série temporal, você tinha que escrever um serviço hospedado que consultava o cache em um timer e republicava os números através do seu próprio Meter:

// Pre-.NET 11: poll the snapshot yourself
public class CacheStatsReporter(IMemoryCache cache) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken ct)
    {
        while (!ct.IsCancellationRequested)
        {
            var stats = ((MemoryCache)cache).GetCurrentStatistics();
            // manually push stats.TotalHits, stats.TotalMisses, ...
            await Task.Delay(TimeSpan.FromSeconds(5), ct);
        }
    }
}

Isso funciona, mas o cast é feio, o intervalo de polling é um chute, e cada projeto reinventa o mesmo código repetitivo.

O meter integrado

O Preview 4 adiciona um meter chamado Microsoft.Extensions.Caching.Memory com quatro instrumentos observáveis:

InstrumentoTipoReporta
dotnet.cache.requestscontadoracertos e erros, divididos por tag
dotnet.cache.entriescontador up-downcontagem atual de entradas
dotnet.cache.estimated_sizegaugetamanho estimado atual
dotnet.cache.evictionscontadortotal de expulsões desde a inicialização

dotnet.cache.requests carrega um tag cache.request.type com valor hit ou miss, que é exatamente o que você precisa para calcular a taxa de acerto no dashboard em vez de na aplicação. Cada instrumento também carrega um tag cache.name, então vários caches em um mesmo processo permanecem distintos.

Como conectar

Dois passos: ative as estatísticas e registre o meter no OpenTelemetry.

builder.Services.AddMemoryCache(options =>
{
    options.TrackStatistics = true;
    options.Name = "catalog";
});

builder.Services.AddOpenTelemetry()
    .WithMetrics(metrics =>
    {
        metrics.AddMeter("Microsoft.Extensions.Caching.Memory");
    });

Os instrumentos permanecem inativos até TrackStatistics ser definido, então não há sobrecarga se você nunca optar por usá-lo. Dê a cada cache um Name e o tag cache.name torna o cache do catálogo trivialmente separável do cache de sessão no Grafana ou no Azure Monitor.

As métricas se encaixam ao lado do tracing nativo de OpenTelemetry que o ASP.NET Core adotou mais cedo no ciclo do .NET 11, o que significa que um trace de requisição e o comportamento de cache por trás dele agora compartilham o mesmo pipeline. Pegue o .NET 11 Preview 4 e apague seu BackgroundService de estatísticas de cache.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar