Go's garbage collector is one of those things that usually "just works". And that is a good thing: most of the time, you do not want to think about it.

Until a service starts slowing down under load, latency increases, and memory usage jumps.

At that point, you usually check the obvious things first: CPU, locks, network, pprof, application metrics. The garbage collector often does not come to mind immediately, even though it can absolutely be part of the performance story.

Go already gives us ways to observe the garbage collector from the outside. The runtime can print information about every GC cycle through gctrace and gcpacertrace, and it also exposes structured data through runtime/metrics.

The problem is that during a real run, this quickly turns into a stream of lines and numbers. One or two lines are fine. But understanding the overall picture is much harder: