---
title: "Pyroscope Block format | Grafana Pyroscope documentation"
description: "Describe how Pyroscope's stores profiles on the durable object storage"
---

# Pyroscope Block format

> Note
> 
> This page describes the v1 block format. For the v2 block format, refer to [Pyroscope v2 block format](/docs/pyroscope/next/reference-pyroscope-v2-architecture/block-format/).

This document describes how Pyroscope stores the data in its blocks. Each block belongs to a single tenant and is identified by a unique [ULID](https://github.com/ulid/spec). Within the block there are multiple files:

- A metadata file `meta.json`, which contains information about what the block contains, like the time range of the profiling data.
- A [TSDB index](https://ganeshvernekar.com/blog/prometheus-tsdb-persistent-block-and-its-index/) `index.tsdb` mapping the external labels to the profiles stored in the profiles table.
- `profiles.parquet` [parquet](https://parquet.apache.org/docs/) table that contains profiles.
- `symbols.symdb` that contains symbolic information for the profiles stored in the block.

## Data model

The data model within the block is fairly aligned to Google’s [proto definition](https://github.com/google/pprof/blob/main/proto/profile.proto) for the pprof wire format.

Profile series labels contain additional information gathered at ingestion time and can be used to select certain profiles. They are comparable to Prometheus/Loki labels and typical label names are `namespace` and `pod` to describe which workload the profiles are coming from.

Each profile ingested will be added into a new row in the profile table. If there are entries missing in the tables for the different models they are also inserted.
