Blog
Mert Özen's blog posts on software development, backend, frontend, and DevOps.
What Changed in Diagnostics from .NET 8 to .NET 11: The System.Runtime Meter, New dotnet-trace Profiles, collect-linux, Runtime Async Stacks and In-Process Crash Reports
.NET 9 replaced the old EventCounters with the System.Runtime Meter, .NET 10 brought new dotnet-trace defaults and collect-linux, and .NET 11 added lossless event buffering, runtime async and in-process crash reports. We give a mapping table from old to new metric names and show, with real runs on .NET 10 and 11, the cpu-sampling and Block mode errors, runtime async stacks before and after a suspension, and crash report output.
Diagnostics in Production: dotnet-monitor, Collection Rules, Kubernetes Sidecars and Continuous Profiling
dotnet-monitor collects traces, gcdumps and dumps through an HTTP API and collection rules, so nobody has to get into the container; rules need Listen mode, and security needs a localhost-bound API, an API key and restricted egress. We run Bookstore with a sidecar on kind, measure rules triggered by slow report requests and by our own meter, the throttling of Limits and the suspend/nosuspend difference, and look at the alpha status of OpenTelemetry Profiles.
The .NET Diagnostics Map: Which Tool for Which Question? EventPipe, Diagnostic Ports and Safe Collection
Tool choice starts from the question: dotnet-counters for whether something is wrong, dotnet-trace for where time goes, dotnet-gcdump for what stays in memory, dotnet-dump for the full process state. We measure the EventPipe vs ETW vs user_events difference, the diagnostic port's TMPDIR and user rules, sidecars in containers, installing with dnx and a tool manifest, and the real overhead and file size of a trace in the Bookstore lab.