---
title: "Version 2.3 release notes | Grafana Pyroscope documentation"
description: "Release notes for Grafana Pyroscope 2.3"
---

> For a curated documentation index, see [llms.txt](/llms.txt). For the complete documentation index, see [llms-full.txt](/llms-full.txt).

This is documentation for the **next** version of Grafana Pyroscope documentation. For the latest stable release, go to the [latest version](/docs/pyroscope/latest/).

[Documentation](/docs/)![breadcrumb arrow](/static/assets/img/icons/grafana-icon-breadcrumb-arrow-gray.svg) [Grafana Pyroscope](/docs/pyroscope/next/)![breadcrumb arrow](/static/assets/img/icons/grafana-icon-breadcrumb-arrow-gray.svg) [Release notes](/docs/pyroscope/next/release-notes/)![breadcrumb arrow](/static/assets/img/icons/grafana-icon-breadcrumb-arrow-gray.svg) V2.3

Open source

## Version 2.3.0 release notes

The Pyroscope team is excited to present Grafana Pyroscope 2.3.0.

This release adds a balanced query planner, symbol-ref tree resolution across the read path, and resumable asynchronous queries, together with performance and stability work in the metastore and compaction paths.

Notable changes are listed below. For the full diff, check out the [2.3.0 changelog](https://github.com/grafana/pyroscope/compare/v2.2.0...v2.3.0).

### Enhancements

- Implement a balanced query planner ([#5501](https://github.com/grafana/pyroscope/pull/5501))
- **read path**: Produce and aggregate symbol-ref trees across the model, symdb, and query backend ([#5321](https://github.com/grafana/pyroscope/pull/5321), [#5322](https://github.com/grafana/pyroscope/pull/5322))
- **frontend**: Resolve symbol-ref trees after the final merge ([#5334](https://github.com/grafana/pyroscope/pull/5334))
- **experimental**: Make asynchronous queries resumable ([#5442](https://github.com/grafana/pyroscope/pull/5442))
- **compaction**: Optionally read block metadata from object storage, adding the `metadata_source` and `metadata_fetch_timeout` options ([#5427](https://github.com/grafana/pyroscope/pull/5427))
- **symbolizer**: Improve debuginfod client resilience and observability, adding the `resolve_timeout` option ([#5449](https://github.com/grafana/pyroscope/pull/5449))
- **distributor**: Track SDK scope usage ([#5366](https://github.com/grafana/pyroscope/pull/5366))
- **profilecli**: Add `replay dump` and `replay push` commands ([#5374](https://github.com/grafana/pyroscope/pull/5374))
- **symdb**: Align the sample appender ([#5535](https://github.com/grafana/pyroscope/pull/5535))
- Optimize the index symbol cache layout ([#5534](https://github.com/grafana/pyroscope/pull/5534))
- **metastore**: Scan block bounds before decoding ([#5407](https://github.com/grafana/pyroscope/pull/5407))
- **compaction**: Avoid deep label clones when building block indexes ([#5398](https://github.com/grafana/pyroscope/pull/5398))
- **timeseries**: Reduce allocations in series build and merge ([#5311](https://github.com/grafana/pyroscope/pull/5311))

### Fixes

- **metastore**: Don’t let a single bad DLQ object block recovery ([#5371](https://github.com/grafana/pyroscope/pull/5371))
- **metastore**: Disable raft pipeline replication ([#5518](https://github.com/grafana/pyroscope/pull/5518))
- **metastore**: Fix a double prefix on index cache and DLQ metrics ([#5543](https://github.com/grafana/pyroscope/pull/5543))
- **segment-writer**: Allow the shard shuffle table to grow past 4096 entries ([#5519](https://github.com/grafana/pyroscope/pull/5519))
- **v2**: Serve profile-type Series queries from metadata when the selector is empty ([#5483](https://github.com/grafana/pyroscope/pull/5483))
- **compaction**: Use `raft_log.CompactionJobStatusUpdate` instead of `metastorev1.CompactionJobStatusUpdate` ([#5465](https://github.com/grafana/pyroscope/pull/5465))
- **adaptiveplacement**: Key distribution stats by tenant and dataset ([#5450](https://github.com/grafana/pyroscope/pull/5450))
- **distributor**: Collapse stripped profiles to a single sample ([#5409](https://github.com/grafana/pyroscope/pull/5409))
- **jfr**: Treat a profile size limit of 0 as unlimited ([#5502](https://github.com/grafana/pyroscope/pull/5502))
- **profilecli**: Exclude the pre-window boundary point from query top totals ([#5359](https://github.com/grafana/pyroscope/pull/5359))
- **monitoring**: Point v2 dashboard event annotations at the Alloy events stream ([#5499](https://github.com/grafana/pyroscope/pull/5499))
- Helm: Add the missing namespace in discovery RBAC objects ([#5447](https://github.com/grafana/pyroscope/pull/5447))

### Security fixes

- Update the Go toolchain to 1.25.13 ([#5520](https://github.com/grafana/pyroscope/pull/5520))
- Update `go.etcd.io/etcd/client/pkg/v3` to v3.6.14 ([#5526](https://github.com/grafana/pyroscope/pull/5526))
- Update `golang.org/x/mod` to v0.40.0 ([#5521](https://github.com/grafana/pyroscope/pull/5521))
- **ui**: Bump `nanoid` to 3.3.18 ([#5522](https://github.com/grafana/pyroscope/pull/5522))

This release also includes every security fix from 2.2.1.

### Documentation

- Add Node.js to the source code integration docs ([#5490](https://github.com/grafana/pyroscope/pull/5490))
- Document Python memory profiling ([#5406](https://github.com/grafana/pyroscope/pull/5406))
- **contributing**: Clarify build targets and the `ui/dist` requirement ([#5457](https://github.com/grafana/pyroscope/pull/5457))
