Tooling

Continuous Profiling

Always-on flame graphs from production — Pyroscope, Parca, Polar Signals.

The third pillar after metrics and tracing. By 2026 it's affordable and ubiquitous.

What it is

Sample CPU / memory / IO / off-CPU from production processes continuously. Get flame graphs filtered by service / version / time / container — without restarting anything.

Open-source backends

  • Pyroscope (Grafana Labs) — Phlare-merged; multi-format (pprof, JFR, .NET); pairs with Grafana. The default.
  • Parca (Polar Signals) — eBPF-based whole-system profiling; minimal app instrumentation.
  • Apache SkyWalking eBPF — bundled with SkyWalking.

Hosted

  • Grafana Cloud Profiles — managed Pyroscope; generous free tier.
  • Polar Signals Cloud — managed Parca.
  • Datadog Continuous Profiler — paid; great UI.
  • New Relic CodeStream — Code-level perf; paid.
  • Sentry Continuous Profiling — bundled with Sentry; paid tier.

Agents / instrumentation

  • Pyroscope agent — Go / Java / Python / Ruby / .NET / Node.js (eBPF + manual SDKs).
  • Parca agent — eBPF; sees every process on a host with no app changes.
  • OpenTelemetry profiling signal — newer standard; SDKs adding it; Pyroscope and Parca both can ingest.
  • pprof endpoints in Go / Rust services — Pyroscope scrapes these directly.
  • Async-profiler (Java) — bundled or scraped by Pyroscope.

Profiling types

  • CPU — where time is spent.
  • Allocations — where memory is being allocated.
  • Inuse memory — where memory currently lives.
  • Goroutines / threads — concurrency view.
  • Off-CPU / blocked — where threads are waiting.
  • Lock contention — synchronization.

Patterns to adopt

  • Default to eBPF where possible. Parca / Pyroscope eBPF agents avoid the "instrument every service" problem.
  • Tag profiles with service / version / region. Filter in the UI.
  • Compare versions — the killer feature. "Did my change make this slower?"
  • Sample, don't always-record at full rate. 100Hz is usually plenty.
  • Look at off-CPU when latency is the question — CPU profiles miss waiting time.

When profiling matters

  • A service is slow and metrics / traces don't explain why.
  • Memory growth that smells like a leak.
  • A specific request type is slow consistently — flame graph the spans involved.
  • Cost optimization: figure out what's burning CPU you're paying for.
  • Pre-launch perf testing.

When it's overkill

  • Tiny services, low traffic, occasional perf issue. node --prof or pprof ad-hoc is enough.
  • You don't have basic metrics yet — add those first.

Pick this if…

  • Default OSS: Pyroscope.
  • Whole-system / eBPF: Parca.
  • Hosted, free tier: Grafana Cloud Profiles.
  • Already on Datadog: their continuous profiler.
  • Java-heavy: async-profiler integration via Pyroscope.
  • Go service: Pyroscope scraping /debug/pprof.

On this page