github.com-google-perfetto
all · 30 devs · built 2026-06-13
Repository snapshot
Monthly reports
Highlights
- Enhanced *Trace Processor* capabilities with new GPU tracing features, including accurate processing of Adreno command batch events to fix GPU event drift [d119b70f · Ross Ning].
- Introduced comprehensive *memory profiling* enhancements, including decoding new packed smaps trace packets into `process_memory_mappings` [7181bb6e · Ryan] and adding path name redaction rules for smaps [34088e9f · Ryan].
- Significant advancements in *AI-driven analysis* with an improved Android heap dump skill and a new clustering capability for heap dump attribution paths [82ad4b69 · Lalit Maganti].
- Expanded *proto2 extension support* across *protozero* and *trace_processor*, enabling flexible out-of-tree extensions and unifying extension registries [40bad2d9 · sashwinbalaji], [9be74dee · sashwinbalaji].
- Major *UI/UX improvements* to the QueryLog tab, adding interactive features and enhancing debugging for slow UI queries [f7dba46f · Steve Golton].
- Improved *SDK flexibility* by allowing selective enablement of *zlib compression* and *RE2 regex support* within the amalgamated SDK [d1adf399 · Lalit Maganti].
- Introduced a *security fix* for *Perfetto's `traced` service* by scoping `RelayPort` exposure to explicitly opted-in producer sockets [b577c79f · Lalit Maganti].
Observations
- The *waste score* for May 2026 was 6, representing a +22% increase compared to the 2-month average of 5, indicating a period with more bug fixes and rework.
- Several critical *bug fixes* were implemented, addressing out-of-bounds reads in the *Trace Processor* for Interval Intersect plugin [6c63b492 · Lalit Maganti] and TCP event parsing [91cc0e8b · Lalit Maganti].
- A critical bug causing *silent chunk loss* for *TCP producer sockets* in the *Relay service* was fixed, preventing significant data loss for high-volume producers [683a6365 · Lalit Maganti].
- Multiple *build system issues* were resolved, including preventing `libz` dependency in client SDKs for Android auto-roll [b62042fa · sashwinbalaji] and fixing regex backend build failures [ac5767d3 · sashwinbalaji].
- The *trace processor* saw targeted *performance optimizations* through lazy materialization of `SqlSource::rewritten_sql` [5876af31 · Lalit Maganti] and avoiding unnecessary zero-fills in `StringPool` block allocation [d8307171 · Lalit Maganti].
- Commit volume for May 2026 was 305, a +9% increase compared to the 2-month average of 280 commits, reflecting a slightly elevated level of activity.
Performance over time
ETV stacked by Growth, Maintenance and Fixes — 90-day moving average, normalized to ETV / month.
Average performance per developer
ETV per active developer per month — 30-day moving average.
Active developers over time
Unique developers committing each day — 90-day moving average.
Knowledge concentration
How dependent is this repo on a small number of contributors? Higher top-1 share = higher key-person risk.
Lalit Maganti owns 27.5 % of commits.
Top contributors
Most impactful commits
Top 20 by ETV in the all-time window.
- 4.4ETVCopy Perfetto Java SDK Java and C++ (JNI) code from AOSP. Java and C++ classes are copied and refactored as follows: 1. SDK package renamed from 'os.android' to 'dev.perfetto'. 2. 'PerfettoTrace_register' function signature fixed to follow JNI ABI. 3. 'JNI_OnLoad' function used to register JNI functions. 4. Internal namespace renamed from 'tracing_perfetto' to 'perfetto'. 5. From java code deleted everything related to 'Ravenwood'. 6. From 'PerfettoTraceTest' class deleted platform related test. 'NativeAllocationRegistry' API is not supported outside of framework, so we intentionally don't free native memory accosted with Java objects, we will address this in future CLs. The leaking memory doesn't affect code correctness, all tests passes. We also do the following: 1. Copy 'nativehelper' header library from AOSP, because JNI code depends on it. 2. Change code formatting to be consistent with perfetto style. 3. Generate Android.bp and BUILD targets. PerfettoTrace.java copied from: https://source.corp.google.com/h/googleplex-android/platform/superproject/main/+/main:frameworks/base/core/java/android/os/PerfettoTrace.java;drc=029c7a04cc36484fe7c0d69c75b29bd9eff1e3a6 PerfettoTrackEventExtra.java copied from: https://source.corp.google.com/h/googleplex-android/platform/superproject/main/+/main:frameworks/base/core/java/android/os/PerfettoTrackEventExtra.java;drc=029c7a04cc36484fe7c0d69c75b29bd9eff1e3a6 com_google_perfetto_sdk_PerfettoTrace.cc copied from: https://source.corp.google.com/h/googleplex-android/platform/superproject/main/+/main:frameworks/base/core/jni/android_os_PerfettoTrace.cpp;drc=ea0f2553f513f05de29e2fe8d0769b13e93d912b com_google_perfetto_sdk_PerfettoTrackEventExtra.cc copied from: https://source.corp.google.com/h/googleplex-android/platform/superproject/main/+/main:frameworks/base/core/jni/android_os_PerfettoTrackEventExtra.cpp;drc=50adc08679d5b380dee7785111860cf3568b5a86 Tested: `atest perfetto_trace_instrumentation_test` and ``` tools/bazel test //:src_android_sdk_java_test_perfetto_trace_instrumentation_test --nocache_test_results --test_output=all ``` Bug: b/386353531 Change-Id: Ibf3b8d73f7cd85f72f65ad4f7290f9a5c32785fcKirill Timofeev · 994cb32a · 2025-03-21
- 4.0ETVbt-ui: Revamp Bigtrace settings architecture and UI (#6205) Overhauls the Bigtrace settings infrastructure to consolidate storage, improve the UI, and simplify query execution. Key changes: - Trace Selection Grid: Introduces a dedicated, filterable DataGrid on the Settings page to select the exact traces a query will run over (the /trace_metadata wire contract), replacing the legacy panel. - Unified UI: Replaces the legacy trace-metadata panel with a cohesive settings strip and modal on the query page. - Storage & Mapping: Dedupes settings storage into SingleFieldStorage and centralizes the mapping logic for the /trace_metadata and /execute_* endpoints. - Component Polish: Makes boolean settings immediately editable (no enable/disable toggle), adds a "reset to default" affordance, and ensures default metadata columns are visible. - Layout & Rendering: Groups metadata result columns in a trailing block, places the link column first, and bounds the results grid for proper virtualization. - History & State: Restores history-entry hover states, parses camelCase setting IDs from snapshots to restore disabled settings, and defaults new queries to persistent execution.gignat-dev · cb8c1445 · 2026-06-11
- 3.8ETVprotovm: initial implementation (#1275)Kean Mariotti · e03aa8d2 · 2025-04-28
- 3.8ETVbt-ui: Implement and polish Bigtrace asynchronous queries (#5822) This PR introduces comprehensive support for executing asynchronous queries in the Bigtrace UI, along with a series of architectural improvements and UX polish. Key additions and improvements include: * Core Async Support: Introduces the ability to submit, track, and manage long-running asynchronous Bigtrace queries. * Architecture: Implements a centralized BigtraceQueryClient and QueryRunner to manage query lifecycles, separating state management from the UI components. * DataGrid Integration: Replaces traditional pagination with a scroll-based approach and integrates with server-side sorting (order_by) and filter encoding for Datagrid chips. * History & State: Adds persistent query history with background status polling, and fixes ephemeral tab state when switching pages. * UI/UX Polish: Introduces updated progress bars, detailed post-filter row counts, and improved duration formatting.gignat-dev · 3748a38e · 2026-05-20
- 3.2ETVcore: Introduce TraceBufferV2 (#3092) TraceBufferV2 is a major rewrite of the historical TraceBuffer. The main reasons for the redesign are: - Supporting ProtoVM and future interning improvements. - Reducing space wasted for internal fragmentation when a chunk contains only few bytes of trace data. - Making the trace output respect more the input ordering, rather than completely reordering packets by sequence. This CL contains a design doc that discusses various aspects and challenges of the new TraceBuffer architecture. Benchmark results: ``` Apple Macbook (M4) ------------------ BM_TraceBuffer_WR_SingleWriter<TraceBufferV1> bytes_per_second=9.77742G/s BM_TraceBuffer_WR_SingleWriter<TraceBufferV2> bytes_per_second=12.6395G/s BM_TraceBuffer_WR_MultipleWriters<TraceBufferV1> bytes_per_second=8.65385G/s BM_TraceBuffer_WR_MultipleWriters<TraceBufferV2> bytes_per_second=11.7582G/s BM_TraceBuffer_RD_MixedPackets<TraceBufferV1> bytes_per_second=4.27694G/s BM_TraceBuffer_RD_MixedPackets<TraceBufferV2> bytes_per_second=4.35475G/s Pixel 7 ------- BM_TraceBuffer_WR_SingleWriter<TraceBufferV1> bytes_per_second=4.4379G/s BM_TraceBuffer_WR_SingleWriter<TraceBufferV2> bytes_per_second=3.7931G/s BM_TraceBuffer_WR_MultipleWriters<TraceBufferV1> bytes_per_second=3.19148G/s BM_TraceBuffer_WR_MultipleWriters<TraceBufferV2> bytes_per_second=3.47354G/s BM_TraceBuffer_RD_MixedPackets<TraceBufferV1> bytes_per_second=1.26698G/s BM_TraceBuffer_RD_MixedPackets<TraceBufferV2> bytes_per_second=1.35394G/s ``` Bug: b/447426810 **Stack:** - [#3091](https://github.com/google/perfetto/pull/3091) (tb_extract) - **[This PR] (tbv2)**Primiano Tucci · 480bbd10 · 2025-12-16
- 2.9ETVde: Add visualisation node (#4891) New node. - In terms of SQ it is passthrough + filters created from charts brushing -> a filter node - Only supports Histogram and Bar chart for now - Shows charts at the dataExplorer tab at the bottomMayzner · 00b4babb · 2026-02-24
- 2.7ETVui: Add Heapdump Explorer plugin (#5276) Add the com.android.HeapDumpExplorer plugin, inspired by Android's ahat tool, with navigation, shared components, queries, and all heap analysis views: overview dashboard, classes, objects, instances, dominators, bitmap gallery, and strings. Uses DataGrid with SQLDataSource for efficient sorting and filtering of large datasets.zezeozue · 12afa830 · 2026-03-25
- 2.6ETVtp: decouple sorting from TraceProcessorContext (#2411) Allows parsing of multiple traces simultaneously without getting clashes between them from using the same parsers/tokenizers etc.Lalit Maganti · ffb178a1 · 2025-08-05
- 2.5ETVBigtrace UI V0 (#5243) This change introduces "BigTrace UI", a standalone bigtrace query interface within perfetto UI source code. BigTrace provides a focused environment for executing and managing complex SQL queries against traces. Key features and components: - Application Shell: A new entry point and lightweight application singleton (BigTraceApp) managing its own command and omnibox instances. - Multi-tab SQL Editor: A robust query interface supporting multiple persistent tabs, syntax-highlighted editors, and result limiting. - Result Visualization: Integration with DataGrid for high-performance rendering of SQL query results, including support for linkified columns and uuid-based row tracking. - Navigation & Layout: Custom routing (router.ts, routes.ts) and layout components (Sidebar, Topbar, Omnibox) tailored for the BigTrace experience. - Persistence: Local storage integration for saving editor tabs, query history, and user preferences across sessions. - Settings Management: A dedicated SettingsPage and storage service for configuring Brush-specific parameters, such as backend endpoints and default result limits. - Home & Help: A landing page with "getting started" guidance and a help modal detailing available keyboard shortcuts. - Styling: Dedicated SCSS for BigTrace to ensure a consistent and modern aesthetic. Note: we may have duplicated classes/interfaces between Bigtrace UI and Perfetto UI, because we wanted to **isolate** the changes and avoid exposing classes/interfaces from Perfetto UI. In a follow-up, we will expose the classes/interfaces suitable for reuse.gignat-dev · 2984b76b · 2026-04-28
- 2.5ETVtp: de: Serializer responsiblity moved to Trace Processor (#4682) This change moves query materialization responsibility from the UI to Trace Processor (TP), establishing TP as the single source of truth for all materialization state. ## Changes **Public API (include/perfetto/trace_processor/):** - Added new experimental `Summarizer` interface for managing lazy materialization of structured queries - Added `CreateSummarizer()` method to `TraceProcessor` (returns ownership via out parameter) - Added `SummarizerUpdateSpecResult` with nested `QuerySyncInfo` for sync status - Added `SummarizerQueryResult` for query results - All Summarizer APIs marked as EXPERIMENTAL **Trace Processor (C++):** - Added `SummarizerImpl` class with smart optimizations: - Lazy materialization: tables created only when `Query()` is called - Proto-based change detection via hashing - Dependency propagation: if query A changes, all dependents (B→C→D) re-materialize - Table-source substitution: unchanged queries reference materialized tables directly - RPC layer manages Summarizer IDs (C++ TraceProcessor layer is ID-agnostic) - Summarizers automatically cleared when trace processor is reset **UI (TypeScript):** - Simplified `QueryExecutionService` by removing ~500 lines of complex state management - Removed UI-side query hash caching, materialization lifecycle, staleness detection - TP is now queried on-demand for table names and state - Updated `Engine` interface with new `createSummarizer()`, `updateSummarizerSpec()`, `querySummarizer()`, and `destroySummarizer()` methodsMayzner · 3050c06b · 2026-02-05
- 2.4ETVde: Add dashboard functionality (#5104) Add dashboard functionality to the Data Explorer, allowing users to create dashboard tabs that display charts from exported data sources. Users connect upstream nodes to "Export to Dashboard" nodes in graph tabs, then visualize the exported data on free-form dashboard canvases with drag-and-drop, resize, cross-chart brush filtering, and source switching.Mayzner · 3733eab8 · 2026-03-13
- 2.4ETVde: Download from metric (#5212) This provides loading dowloading the .pbtxt file with TraceSummary or metric and show it as a graph. This is a big change, but relatively self contained - this whole file will disappear once we migrate proto based serialization.Mayzner · ac6282fc · 2026-03-23
- 2.4ETVtp: migrate all static table functions to dataframe (#1848) This completes the dataframe migration: * static tables * runtime tables * static table functions are all using dataframe. Follow up CLs will delete the legacy table implementation from the codebase once these set of changes sticksLalit Maganti · 3940ed80 · 2025-06-17
- 2.3ETVui: Split widgets page into subpages (#3465) Split widgets page into one widget per page with a nav menu.Steve Golton · 57fb8570 · 2025-11-03
- 2.3ETVui: Refactor DataGrid SQL datasource (#4384) - Migrate to QuerySlots. - Break up SQL datasource implementation into multiple files. - Materialize perfetto table to make tree queries more efficient - fixes slow group collapsing/expanding and sorting when in pivot+tree mode. - Fix bug where a flash of stale data is shown while the new data loads when switching between datagrid modes like flat->pivot or pivot->drilldown.Steve Golton · 1f512c98 · 2026-02-09
- 2.2ETVui: Memscope - Live dashboard page (#5785) This patch adds a new `dev.perfetto.Memscope` UI plugin: a live memory dashboard that connects to an Android (ADB / WDP) or Linux (websocket) target, starts a lightweight trace, and renders periodically refreshed snapshots across four tabs (Processes, System, File Cache, Pressure & Swap). NOTE: In order to keep the PRs as small as possible, this is just the first part of the memscope plugin which only features the dashboard - no profiling mode is implemented yet. ## Key bits - Live tracing session (sessions/live_session.ts): low-overhead monitoring config (process_stats, sys_stats, ftrace). Polls snapshots on an interval, parsing and extracting key counter information. - Connection view (views/connection.ts): Landing page when no session is currently running. Allows the user to select a device protocol, and, if relevant, presents a device list to allow device selection. - Dashboard view: (views/dashboard.ts): Shows up when the user connects to a device and starts recording a live tracing session. Displays a toolbar showing the status of the live session and buttons to control the session, and the four tabs with a tab switcher (SegmentedButton). - Tabs: - Processes tab (views/tabs/processes.ts): Shows a few header cards showing high level system memory usage, a chart showing the sum of all processes grouped by category (arbitrary list defined in process_categories.ts), and a table of all processes with various stats spread across various columns. - System tab (views/tabs/system.ts): Shows various system level memory stats across billboards and a chart. - Page cache tab (views/tabs/page_cache.ts): Show page cache stats including usage and activity charts. - Pressure, swap and LMK tab (views/tabs/pressure_swap.ts): Displays swap usage, memory pressure and LMK events. - Process categorization (process_categories.ts): maps Android process names → high-level categories (Framework, HAL, System UI, …). Colors are assigned positionally from the chart palette so adding categories doesn't require picking hex. ## Usage / testing: - Enable the dev.perfetto.Memscope plugin & restart the page. - Click the memscope sidebar entry. - Connect to your Android/Linux device of choice. - Verify stats look correct. Press pause and play again to ensure the snapshots stop updating when paused. - Switching tabs should stop the periodic updates (and period redraws). - Stop & Open Trace produces a working trace in the main UI. - Verify category chips and OOM-bucket chips read well in both light and dark themesSteve Golton · a0a484ac · 2026-05-12
- 2.1ETVtracing: integrate ProtoVM (#3814) This commit integrates ProtoVM into traced as specified in go/perfetto-proto-vm. The commit also includes new protobuf messages to: - specify ProtoVM configs in DataSourceConfig - specify a ProtoVM program in the DataSourceDescriptor - specify ProtoVM instances in TracePacket as well as minor ProtoVM changes required for the integration.Kean Mariotti · 2353a958 · 2026-02-11
- 2.1ETVui: Add GpuCompute plugin for GPU kernel performance analysis (#5436) Adds the dev.perfetto.GpuCompute plugin for analyzing GPU compute kernel performance across multiple vendors and hardware architectures in the Perfetto trace viewer. When a compute GPU slice (render stage event) is selected, the Compute tab automatically opens and loads detailed metrics for the selected kernel. Core plugin (dev.perfetto.GpuCompute): - Compute tab that auto-opens on compute slice selection - Details tab with per-kernel metric tables, collapsible sections, baseline comparison, and percent bars - Summary table with sortable columns and double-click navigation - Toolbar with kernel selector, terminology picker, humanize toggle, and baseline comparison controls - Declarative Section registry for metric group definitions - Terminology registry for adapting GPU concepts (thread, warp, block, SM, etc.) to different vendors - Well-known metric registry for vendor-agnostic toolbar and summary display (duration, cycles, frequency, throughput) - Analysis provider interface for optional analysis backends Built-in vendor support: - CUDA (NVIDIA) — metrics, terminology, well-known metrics - AMD — metrics, well-known metrics - OpenCL — terminology Additional vendors can register support through companion plugins that provide terminologies, metric sections, well-known metrics, and analysis providers. Built-in sections (section/): - Speed of Light — compute and memory throughput overview - Launch Statistics — kernel launch configuration - Occupancy — warp occupancy and limiting factors - Workload Analysis — per-pipeline utilization --------- Co-authored-by: Steve Golton <stevegolton@google.com>David Reveman · ed9dc728 · 2026-04-24
- 2.1ETVexp: Simplify the ports (#3848) ## Summary Refactors the query node port system to use a clearer, more explicit model with `primaryInput` for single-input operations and `secondaryInputs` (with cardinality constraints) for multi-input operations. This replaces the previous confusing mix of `prevNode`, `prevNodes`, and `inputNodes` properties. ## Changes - Introduces `SecondaryInputSpec` interface with a `Map<number, QueryNode>` for connections and explicit `min`/`max` cardinality requirements - Replaces `prevNode` → `primaryInput` for single-input operations (Filter, Sort, Aggregation, etc.) - Replaces `prevNodes`/`inputNodes` → `secondaryInputs.connections` for multi-input operations (Union, Merge, IntervalIntersect) - Adds `singleNodeOperation()` helper to classify node types - Updates all node implementations, serialization/deserialization, and tests to use the new model ## Notes - Multi-source nodes (Union, Merge, IntervalIntersect) now use only `secondaryInputs` with no `primaryInput` - AddColumnsNode uses both `primaryInput` (for the main data flow) and `secondaryInputs` (for the join source) - Serialization stores `primaryInputId` and node-specific input IDs rather than generic `prevNode`/`prevNodes` arraysMayzner · 914bc23d · 2025-11-26
- 2.0ETVui: Grid QoL improvements (#3318) Grid QoL improvements: - Stable, resizable, auto-sizable column widths with sensible defaults. - Columns can be user-resized by dragging on the column handle. - A sensible initial size is decided as soon as we have some data based on measuring the cells in place. - Column widths are stable and persist over various operations such as filtering, sorting, et al. - Right click context menus in data cells rather than triple dot menu saving valuable real estate and avoiding awkward gaps in the layout. - Header cell buttons are now removed entirely from the layout when hidden, saving valuable real estate. - Virtual scrolling and dynamic data loading now supported at the Grid level. - The old VirtualTable widget has been removed in favor of Grid. - PivotTable now uses virtual scrolling to improve performance. - DataGrid now uses virtual scrolling also to improve performance, but also in order to support pivoting in the future as the grouping UX would be very awkward with pagination.Steve Golton · 13075b42 · 2025-10-21