pprof is a mature, production-grade profiling visualization and analysis tool for Go, C++, Java, and other languages that export profiles in the pprof protobuf format. It operates as both a command-line tool and an interactive web server, allowing users to inspect CPU, memory, contention, and goroutine profiles. The core architecture is a modular Go application: the `driver` package orchestrates fetching, symbolization, merging, and report generation; the `profile` package provides a standalone library for reading, writing, and manipulating profiles; the `graph` package builds weighted directed call graphs; and the `report` package outputs a variety of formats including text, SVG dot graphs, HTML flame graphs, annotated source, disassembly, and more. External dependencies include binutils (addr2line, nm, objdump) for local symbolization, Graphviz (dot) for graph rendering, and optionally Chrome for browser tests. The system supports profile comparison, filtering by tags or sample labels, and can symbolize using local binaries or remote symbolz services. The profile package is designed for reuse as a standalone library, making pprof useful both as a tool and as a data processing foundation for other profiling tooling.
Parca is a continuous profiling platform that collects, stores, queries, and visualizes pprof profiles in real time. The Go backend ingests profiles via gRPC (both pprof and OpenTelemetry OTLP), normalizes them into Apache Arrow columnar format, and stores them in either FrostDB (default) or ClickHouse. It provides a rich gRPC+JSON API for querying profiles (flamegraph, table, source view, callgraph, pprof download), scraping Prometheus-style targets, managing debug information for symbolization, and sharing profiles via links. The TypeScript/React frontend delivers an interactive profiling UI with flamegraphs, tables, source views, metrics graphs, sandwich views, and comparison mode, all backed by efficient Arrow-based querying. The codebase demonstrates strong engineering with reusable patterns (generic caching, signed request abstraction, Arrow compaction), but carries some drift risk from dual storage backends, generated protobuf code, and a complex UI state layer built with multiple state management strategies.