Skip to content
Back to skills

061 Architecture 60c22208

ASecurity

Complete reference for Grafana Pyroscope architecture, deployment modes, and scaling.

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
developmentgonodekubernetesazuretestingapifrontendperformance

Works with

  • api

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 061-architecture_60c22208 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 061 Architecture 60c22208?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 061 Architecture 60c22208
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-061-architecture-60c22208/badge)](https://www.skillsdirectory.com/skills/tools-only-061-architecture-60c22208)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
# Pyroscope Architecture Reference

Complete reference for Grafana Pyroscope architecture, deployment modes, and scaling.

## Deployment Modes

### Monolithic Mode

**Flag:** `-target=all` (default)

All components run in a single process. Simplest configuration for getting started.

```text
┌─────────────────────────────────────────────┐
│              Pyroscope (Single Process)     │
│                                             │
│  ┌──────────┐ ┌──────────┐ ┌─────────────┐ │
│  │Distributor│ │ Ingester │ │   Querier   │ │
│  └──────────┘ └──────────┘ └─────────────┘ │
│  ┌──────────┐ ┌──────────┐ ┌─────────────┐ │
│  │Compactor │ │Store-GW  │ │Query-Frontend│ │
│  └──────────┘ └──────────┘ └─────────────┘ │
└─────────────────────────────────────────────┘
```

**Use Cases:**

- Development and testing
- Small-scale deployments (~20GB profiles/day)
- Quick experimentation

**Limitations:**

- No horizontal scaling
- Multiple instances don't share data
- Not suitable for production at scale

**Query URL:** `http://pyroscope:4040/`

### Microservices Mode

**Flag:** `-target=[component_name]`

Each component runs as a separate process, enabling horizontal scaling and
fault isolation.

```text
                    ┌───────────────┐
                    │  SDK / Alloy  │
                    └───────┬───────┘
                            │
                    ┌───────▼───────┐
                    │  Distributor  │  (Stateless)
                    └───────┬───────┘
                            │
                    ┌───────▼───────┐
                    │   Ingesters   │  (Stateful - 3+ replicas)
                    └───────┬───────┘
                            │
              ┌─────────────┼─────────────┐
              │             │             │
      ┌───────▼───────┐     │     ┌───────▼───────┐
      │   Compactor   │     │     │ Store-Gateway │
      └───────────────┘     │     └───────────────┘
                            │
                    ┌───────▼───────┐
                    │Object Storage │
                    │(S3/GCS/Azure) │
                    └───────────────┘

Query Path:
┌─────────────┐   ┌────────────────┐   ┌─────────────┐
│Query-Frontend│──▶│Query-Scheduler │──▶│   Querier   │
└─────────────┘   └────────────────┘   └─────────────┘
```

**Use Cases:**

- Production environments
- High-scale deployments
- Multi-tenant systems
- Independent component scaling

**Query URL:** `http://pyroscope-querier:4040/`

## Core Components

### Distributor (Stateless)

**Purpose:** Entry point for profile ingestion. Routes profiles to ingesters.

**Responsibilities:**

1. **Data Validation** - Validates incoming profiles
2. **Series Sharding** - Distributes series across ingesters using consistent hashing
3. **Replication** - Replicates each series to multiple ingesters

**Replication Model:**

- Dynamo-style quorum consistency
- Default replication factor: 3
- Write success requires n/2 + 1 confirmations (2 of 3)

**Configuration:**

```yaml
distributor:
  push_timeout: 5s
  ingestion_tenant_shard_size: 4  # Shuffle sharding
  ring:
    kvstore: memberlist
    heartbeat_timeout: 5m
```

**Scaling:** Horizontally scalable, stateless

### Ingester (Stateful)

**Purpose:** Receives and temporarily stores profiles before writing to
long-term storage.

**Responsibilities:**

1. **Profile Reception** - Receives profiles from distributors
2. **In-Memory Buffering** - Stores recent data in memory
3. **Batch Compression** - Compresses and batches samples
4. **Storage Upload** - Writes blocks to object storage

**Ring States:**

| State | Description |
|-------|-------------|
| PENDING | Starting up |
| JOINING | Initializing |
| ACTIVE | Operational |
| LEAVING | Shutting down |
| UNHEALTHY | Failed heartbeat |

**Configuration:**

```yaml
ingester:
  num_tokens: 128
  heartbeat_interval: 5s
  heartbeat_timeout: 10s
  lifecycle:
    num_flush_instances: 3
    claim_on_rollout: true
    ring_timeout: 5m
```

**Data Safety:**

- Each profile replicates to 3 ingesters by default
- Single ingester failure causes no data loss
- Write-ahead log for crash recovery

**Scaling:** Stateful, minimum 3 replicas for production

### Querier (Stateless)

**Purpose:** Handles query execution on the read path.

**Responsibilities:**

1. **Query Evaluation** - Executes profile queries
2. **Data Fetching** - Retrieves from ingesters (recent) and store-gateways (historical)
3. **Result Aggregation** - Merges results from multiple sources

**Data Sources:**

- **Ingesters** - Recent profile data (not yet flushed)
- **Store-Gateways** - Historical data from object storage

**Configuration:**

```yaml
querier:
  query_store_after: 4h
  query_ingesters_within: 1h
  shuffle_sharding_ingesters_enabled: true
  max_query_lookback: 30d
```

**Scaling:** Horizontally scalable, stateless

### Query Frontend (Stateless)

**Purpose:** API gateway for the read path. Optimizes query execution.

**Responsibilities:**

1. **Query Reception** - Receives incoming queries
2. **Queue Management** - Enqueues queries via query-scheduler
3. **Result Aggregation** - Collects and returns results

**Benefits:**

- Fair scheduling across tenants
- Query splitting and caching
- Horizontal scaling of query capacity

**Configuration:**

```yaml
query_frontend:
  max_outstanding_per_tenant: 200
  querier_forget_delay: 15m
```

**Scaling:** Horizontally scalable, minimum 2 replicas for HA

### Query Scheduler (Stateless)

**Purpose:** Manages query queue and distributes work to queriers.

**Flow:**

1. Query-frontend receives and processes queries
2. Query-frontend enqueues to query-scheduler
3. Query-scheduler maintains in-memory queue
4. Queriers pull and execute queries
5. Results route back through query-frontend

**Configuration:**

```yaml
query_scheduler:
  max_outstanding_requests_per_tenant: 2048
```

**Scaling:** Minimum 2 replicas for HA

### Compactor (Stateless)

**Purpose:** Optimizes storage by merging blocks and managing retention.

**Responsibilities:**

1. **Block Compaction** - Merges small blocks into larger ones
2. **De-duplication** - Removes duplicate data from replication
3. **Retention Enforcement** - Deletes expired data
4. **Bucket Index** - Maintains per-tenant block index

**Compaction Process:**

**Stage 1 - Vertical Compaction:**

- Merges blocks from same time range
- Eliminates duplicates from replication

**Stage 2 - Horizontal Compaction:**

- Combines adjacent time ranges
- Reduces index size significantly

**Configuration:**

```yaml
compactor:
  data_dir: ./data
  block_ranges:
    - 1h
    - 2h
    - 8h
  compaction_interval: 30m
  compaction_concurrency: 4
  deletion_delay: 12h
```

**Disk Requirements:**

```text
Minimum disk = compaction_concurrency × max_block_size × 2
```

**Scaling:** Stateless, shuffle sharding for horizontal scaling

### Store Gateway (Distributed)

**Purpose:** Provides access to long-term storage for historical queries.

**Responsibilities:**

1. **Block Management** - Each instance manages subset of blocks
2. **Query Serving** - Retrieves profile data from object storage
3. **Caching** - Caches frequently accessed blocks

**Configuration:**

```yaml
store_gateway:
  sharding_ring:
    enabled: true
    kvstore: memberlist
  sync_interval: 15m
  ignore_blocks_within: 3h
```

**Scaling:** Distributed block assignment enables horizontal scaling

## Data Structures

### Block Format

Each block contains profiling data for a single tenant:

```text
<block-ulid>/
├── meta.json      # Block metadata (time range, etc.)
├── index.tsdb     # TSDB index (labels → profiles)
├── profiles.parquet  # Profile data (Parquet format)
└── symbols.symdb  # Symbol information for profiles
```

**Characteristics:**

- Unique ULID identifier
- Single-tenant isolation
- Google pprof protocol compatible
- Label-based organization

### Bucket Index

Per-tenant file listing all blocks:

```json
{
  "blocks": [...],
  "block_deletion_marks": [...],
  "updated_at": 1234567890
}
```

**Benefits:**

- Eliminates costly "list objects" API calls
- Store-gateways consult index directly
- Updated by compactor periodically

## Hash Rings

Used for consistent data distribution:

**Memberlist Configuration:**

```yaml
memberlist:
  bind_addr: 0.0.0.0
  bind_port: 7946
  join:
    - dnssrv+pyroscope-memberlist._tcp.pyroscope.svc.cluster.local
  gossip_interval: 1s
  gossip_nodes: 3
  retransmit_factor: 4
```

**Ring Types:**

- **Ingester Ring** - Distributes profiles across ingesters
- **Store-Gateway Ring** - Assigns blocks to store-gateways
- **Compactor Ring** - Coordinates compaction work

## Shuffle Sharding

Limits which components handle specific tenants:

```yaml
# Ingesters per tenant
distributor:
  ingestion_tenant_shard_size: 4

# Queriers per tenant
query_frontend:
  max_queriers_per_tenant: 2

# Store-gateways per tenant
store_gateway:
  tenant_shard_size: 3

# Compactors per tenant
compactor:
  compactor_tenant_shard_size: 1
```

**Benefits:**

- Failure isolation between tenants
- Resource fairness
- Reduced blast radius

## Scaling Guidelines

### Horizontal Scaling

| Component | Scaling Approach | Trigger |
|-----------|-----------------|---------|
| Distributor | Add replicas | High ingestion rate |
| Ingester | Add replicas | Memory pressure, ingestion lag |
| Querier | Add replicas | Query latency, queue depth |
| Query Frontend | Add replicas | Request rate |
| Store Gateway | Add replicas | Query latency on historical data |
| Compactor | Increase concurrency | Compaction backlog |

### Vertical Scaling

| Component | Key Resource | Tuning |
|-----------|--------------|--------|
| Ingester | Memory | Increase for higher cardinality |
| Compactor | CPU, Disk | More concurrency = more CPU |
| Store Gateway | Memory | Cache size for query performance |

### Production Replica Counts

| Component | Minimum | Recommended |
|-----------|---------|-------------|
| Distributor | 2 | 3 |
| Ingester | 3 | 5 |
| Querier | 2 | 3-5 |
| Query Frontend | 2 | 2 |
| Query Scheduler | 2 | 2 |
| Compactor | 1 | 3 |
| Store Gateway | 2 | 3 |

## Data Flow Details

### Write Path

```text
1. SDK/Alloy pushes profile to Distributor
2. Distributor validates and hashes profile labels
3. Distributor identifies target ingesters via hash ring
4. Profile replicated to N ingesters (default: 3)
5. Ingester buffers profile in memory
6. After block duration, ingester flushes to object storage
7. Compactor merges and optimizes blocks
```

### Read Path

```text
1. Query arrives at Query Frontend
2. Query Frontend enqueues to Query Scheduler
3. Querier pulls query from scheduler
4. Querier determines time range:
   - Recent: Query ingesters
   - Historical: Query store-gateways
5. Store-gateways fetch blocks from object storage
6. Results aggregated and returned via Query Frontend
```

## Consistency Model

**Write Consistency:**

- Quorum-based (n/2 + 1 replicas)
- Default: 2 of 3 ingesters must confirm

**Read Consistency:**

- Eventual consistency for recent data
- Strong consistency for flushed data

**Data Durability:**

- 3-way replication prevents data loss
- WAL recovery for crash scenarios

## Deployment Decision Matrix

| Factor | Monolithic | Microservices |
|--------|-----------|--------------|
| Setup Complexity | Simple | Complex |
| Horizontal Scaling | Not viable | Excellent |
| Failure Isolation | None | Per-component |
| Resource Efficiency | Good (small) | Better (large) |
| Production Ready | Dev/test only | Fully |
| Kubernetes | Yes | Recommended |
| Data Sharing | Single instance | Multi-instance |
| Configuration | Minimal | Extensive |

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.