> ## Documentation Index
> Fetch the complete documentation index at: https://docs.odigos.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Pyroscope

> Configuring the Pyroscope backend (Self-Hosted)

### Getting Started

<img src="https://d15jtxgb40qetw.cloudfront.net/pyroscope.svg" alt="pyroscope" className="not-prose h-20" />

[Grafana Pyroscope](https://grafana.com/oss/pyroscope/) is an open-source continuous profiling backend. Odigos exports profile data over OTLP to Pyroscope so the same eBPF profiler that powers in-product views can also feed long-term, queryable storage.

<Note>
  This destination only emits the **Profiles** signal. The destination must include `PROFILES`, and continuous profiling must be enabled for the agent you use:

  * **K8s Agent**: [Continuous Profiling overview](/enterprise/instrumentations/profiling/overview) and [getting started](/enterprise/instrumentations/profiling/getting-started)
  * **VM Agent**: [Continuous Profiling overview](/vmagent/instrumentations/profiling/overview) and [getting started](/vmagent/instrumentations/profiling/getting-started)
</Note>

**Pyroscope version**<br />
Use a Pyroscope build that accepts OTLP profiles on the endpoint you configure. If you are unsure, upgrade to a recent release before configuring Odigos.

**Quickstart: self-hosted Pyroscope**<br />
If you don't already run Pyroscope, the upstream Helm chart gets you a working instance in a couple of commands:

```bash theme={null}
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install pyroscope grafana/pyroscope \
  --namespace pyroscope --create-namespace
```

The distributor will be reachable in-cluster at `pyroscope.pyroscope:4040` — use that as the `PYROSCOPE_URL` value below.

<Warning>
  Provide the distributor's `host:port` only. Do **not** add `/otlp` or other path suffixes — Odigos sends OTLP profiles to `/v1development/profiles` on the host you configure.
</Warning>

**TLS**<br />
Toggle `PYROSCOPE_TLS_ENABLED` when Pyroscope is fronted by TLS. For plain traffic, leave it off.

**Verifying the export**<br />
After applying the destination and sending traffic to a profiled source, open the Pyroscope UI (`kubectl -n pyroscope port-forward svc/pyroscope 4040`) and confirm that profiles appear under your service.

### Configuring Destination Fields

<Accordion title="Supported Signals:">
  ❌ Traces
  ❌ Metrics
  ❌ Logs
  ✅ Profiles
</Accordion>

* **PYROSCOPE\_URL** `string` : Pyroscope Endpoint. Hostname and port of the Pyroscope distributor HTTP API (e.g. `pyroscope.pyroscope:4040`). Odigos sends OTLP profiles to `/v1development/profiles` on this host; do not add an `/otlp` path.
  * This field is required
  * Example: `host:port`
* **PYROSCOPE\_TLS\_ENABLED** `boolean` : Enable TLS. Secure connection
  * This field is optional and defaults to `False`

### Adding Destination to Odigos

There are two primary methods for configuring destinations in Odigos:

##### **Using the UI**

<Steps>
  <Step>
    Use the [Odigos CLI](https://docs.odigos.io/cli/odigos_ui) to access the UI

    ```bash theme={null}
    odigos ui
    ```
  </Step>

  <Step>
    Click on `Add Destination`, select `Pyroscope` and follow the on-screen instructions
  </Step>
</Steps>

##### **Using Kubernetes manifests**

<Steps>
  <Step>
    Save the YAML below to a file (e.g. `pyroscope.yaml`)

    ```yaml theme={null}
    apiVersion: odigos.io/v1alpha1
    kind: Destination
    metadata:
      name: pyroscope-example
      namespace: odigos-system
    spec:
      data:
        PYROSCOPE_URL: <Pyroscope Endpoint>
        # Note: The commented fields below are optional.
        # PYROSCOPE_TLS_ENABLED: <Enable TLS>
      destinationName: pyroscope
      signals:
      - PROFILES
      type: pyroscope
    ```
  </Step>

  <Step>
    Apply the YAML using `kubectl`

    ```bash theme={null}
    kubectl apply -f pyroscope.yaml
    ```
  </Step>
</Steps>
