Features and enhancements
- Added experimental support for asynchronous query execution (#4995).
- Added trace ID filtering to the v2 read path via
trace_id_selector, with a--trace-idflag inprofilecli(#5284, #5300). - Added
SymbolRefTableandsymbol_refstree fields to the query API (#5318). - Exposed address-level symbol resolution as a public symbolizer API (#5317).
- Added an optional admin HTTP server on a separate port (#5191).
- Kept totals and labels of sampled-out profiles (#5354).
- Added autocomplete to the query bar in the v2 embedded UI (#5172).
- Unified merged profile query formats in the querier (#5358).
- Added a distributor
push_batch_serieshistogram (#5305). - Improved performance of pprof language detection (~40% faster and now deterministic) and label validation (#5309, #5313).
- Added a
service_namerelabel rule to the Alloy scrape config in the Helm chart (#5262).
Bug fixes
- Returned HTTP 429 for ingestion-limit rejections on the OTLP and
/ingestpaths (#5372). - Sent all converted OTLP profiles in a single
PushBatchper export and boundedPushBatchseries fan-out with a per-tenant limit (#5339, #5306). - Enforced tenant header extraction in the auth interceptor (#5251).
- Rejected non-positive ingest sample rates and improved sample rate errors (#5253, #5276).
- Enabled metastore retention cleanup by default and fixed retention to keep shards with recent data (#5280, #5360).
- Fixed span selector handling in pprof and tree query paths, and returned trace IDs in span heatmaps (#5273, #5353).
- Treated two nil value types as compatible in
ProfileMerge(#5315). - Preserved line-less locations when rewriting symbol database partitions (#5337).
- Added bounds checks to tree deserialization (#5145).
- Fixed a data race in usage stats counters (#5303).
- Declined empty build IDs during debug info uploads and improved
ListDebugInfoperformance for large tenants (#5302, #5286). - Fixed the Helm chart to respect metastore raft
extraArgsoverrides (#5275).
Security updates
- Updated Go to 1.25.12 (#5338).
Documentation updates
- Clarified which flags are v1-exclusive (#5308).
- Added documentation for supported platforms (#5316).
- Documented Python SDK fork safety (#5364).
Changelog
- 0a1f541 Add signed commits requirement for pull requests (#5277)
- c5455a9 Update golang version to 1.25.12 (#5338)
- b9092a1 chore(deps): bump github.com/grafana/jfr-parser to v0.18.0 (#5355)
- def8afc chore(helm): improve chart description, re-triggering the 2.1.1 release (#5352)
- 8f5e03f chore: Bump renovate baseBranchPatterns before releasing v2.2 (#5376)
- 12a3632 chore: Cleanup no longer used tool (#5357)
- a70c936 chore: Ensure examples have consistent services (#5248)
- d7ad244 chore: bump Helm chart to v2.1.0 (#5267)
- 10446dc chore: bump Helm chart to v2.1.1 (#5346)
- ddd724a chore: enable renovate on release branches (#5282)
- f6e417d chore: fix spelling mistakes (#5294)
- faaa8c5 ci(backport): migrate to grafana-github-actions-go for signed commits (#5320)
- 343959e ci(examples): run all examples for harness changes (#5365)
- 19f8bcc ci(examples): run example tests on same-repo PRs touching examples/ (#5272)
- e896d94 ci(helm): bump update-helm-repo workflow to pick up signed index.yaml commits (#5351)
- af325ae ci(release): create Homebrew formula commits via GitHub API so they are signed (#5347)
- abcc775 docs: Make clear what flags are v1 exclusive (#5308)
- 380aa94 docs: add docs for supported platforms (#5316)
- d34c47c docs: add v2.0.4 release notes (#5268)
- 6b5747d docs: add v2.0.5 release notes (#5283)
- 277dc2f docs: add v2.0.6 release notes (#5343)
- e463d5e docs: add v2.1 release notes (#5266)
- d9cc2e5 docs: add v2.1.1 release notes (#5342)
- 560ae48 docs: document Python SDK fork safety (#5364)
- 8cb642c docs: require signed release tags (#5287)
- 7f2def6 dx: upgrade devcontainer to Go 1.25 and add DinD support (#5288)
- 7edf681 feat(distributor): add push_batch_series histogram (#5305)
- f35082e feat(experimental): support async query execution (#4995)
- ce3edc3 feat(profilecli): add --trace-id to filter query profile samples by trace (#5300)
- 26eb6d4 feat(querier): unify merged profile query formats (#5358)
- 6d16eb9 feat(query): add SymbolRefTable and symbol_refs tree fields to the query API (#5318)
- c37faf2 feat(query): support trace_id_selector in the v2 read path (#5284)
- bbe8169 feat(symbolizer): expose address-level symbol resolution as a public API (#5317)
- a732678 feat: add optional admin HTTP server on separate port (#5191)
- b265cd2 feat: keep totals and labels of sampled-out profiles (#5354)
- 59a02ff feature(ui): Add autocomplete to v2 embedded UI query bar (#5172)
- 24bf180 fix(debuginfo): decline empty build IDs during upload initiation (#5302)
- 62e1c90 fix(debuginfo): improve ListDebugInfo performances for large tenants (#5286)
- 254c688 fix(distributor): bound PushBatch series fan-out with a per-tenant limit (#5306)
- c47a33a fix(examples): repair Django rideshare startup (#5363)
- 3eb7f23 fix(helm): respect metastore raft extraArgs overrides (#5275)
- 0771f81 fix(ingester): return 429 for ingestion-limit rejections on OTLP and /ingest paths (#5372)
- 7820b85 fix(metastore): retain shards with recent data (#5360)
- 5acc2f1 fix(otlp): send all converted profiles in a single PushBatch per export (#5339)
- bff1b6c fix(pprof): treat two nil value types as compatible in ProfileMerge (#5315)
- 6d0f831 fix(query): return trace IDs in span heatmaps (#5353)
- 506c6f3 fix(querybackend): forward and apply span selector in pprof and tree query paths (#5273)
- f156a4f fix(symdb): preserve line-less locations when rewriting partitions without functions (#5337)
- f9fe9a5 fix(tree): add bounds checks to DeserializeNoDict (#5145)
- 4dc429e fix(usagestats): guard MultiCounter/MultiStatistics total against data race (#5303)
- 5f64687 fix: enable metastore retention cleanup by default (#5280)
- 01a56aa fix: enforce tenant header extraction in auth interceptor (#5251)
- 3d08dbf fix: reject non-positive ingest sample rates (#5253)
- 5fa8702 fix: sample rate errors (#5276)
- 80c4d21 helm: add service_name relabel rule to alloy scrape config (#5262)
- e9cfdaf perf(pprof): make language detection deterministic and ~40% faster (#5309)
- 96e53a1 perf(validation): hoist per-label tenant limit lookups in ValidateLabels (#5313)
As always, feedback is more than welcome, feel free to open issues/discussions.
You can reach out to the team using:
Docker Images
docker pull grafana/pyroscope:2.2.0