Find the code using your CPU and memory.
Explore continuous production profiles by function, and compare two releases to see what got more expensive. Where a trace names the slow span, a profile names the code inside it.
Narrow a slow span to a function
Profiling picks up where a trace stops: inside a span that is doing work rather than waiting. Here is one span, from the trace to the function that explains it.
Explore and compare production profiles
Continuous sampling profiles, joined to the traces and releases that explain them.
Where wall time and CPU time go, by function, with self time and total time separated.
cpuWhat allocates, how often, and what keeps it alive.
heapThe call tree drawn to scale, so the width of a frame is the time spent in it.
flamegraphSee which functions use more CPU or allocate more memory after a deployment, as one ranked list.
diffFrom a slow span to the frames that were on the stack while it ran, on the same service and time range.
trace-linkGo, Java, Python, Node, Ruby and .NET, through pprof and OTLP profile signals.
pprof · otlpThe profiler samples stacks on a timer rather than wrapping your functions, so it can stay on in production.
always-onCompare two profiles side by side.
Pick two time windows or two releases and read the ranked list of what got more expensive between them, alongside the flame graph for each.
- Pick two windows. Before a deploy and after it, or one host against a healthy one.
- Read the movers. Functions ordered by how much they grew, not by how large they are.
- Land on a line. File and line number, resolved from the binary you shipped.
- Confirm the fix. Run the same comparison after the change to see the frame come back down.
- PriceRules.evaluate
- +35.1 pts
- json.Unmarshal
- +12.4 pts
- runtime.mallocgc
- +4.8 pts
- sql.QueryContext
- −1.2 pts
- Total CPU, service
- +41% at same RPS
Start profiling production.
Send pprof or OTLP profiles from Go, Java, Python, Node, Ruby or .NET and compare your next two releases. Start on the free plan with no card.