---
title: "Profile types and instrumentation | Grafana Pyroscope documentation"
description: "Learn about the different profiling types available in Pyroscope and"
---

# Profile types and instrumentation

Profiling is an essential tool for understanding and optimizing application performance. In Pyroscope, various profiling types allow for an in-depth analysis of different aspects of your application. This guide explores these types and explain their impact on your program.

Profiling types refer to different dimensions of application performance analysis, focusing on specific aspects like CPU usage, memory allocation, or thread synchronization.

Note that when Pyroscope receives a Java wall profile, both `cpu` and `wall` profiles are automatically ingested, even if `cpu` profiling is turned off.

Pyroscope supports these profile types:

- CPU (CPU time, wall time)
- Memory (allocation objects, allocation space, heap)
- In use objects and in-use space
- Goroutines
- Mutex count and duration
- Block count and duration
- Lock count and duration
- Exceptions

Refer to [Understand profiling types and their uses in Pyroscope](/docs/pyroscope/latest/introduction/profiling-types/) for more details about the profile types.

## Profile type support by instrumentation method

The instrumentation method you use determines which profile types are available. You can use either auto or manual instrumentation.

### Auto-instrumentation with Grafana Alloy

You can send data from your application using Grafana Alloy collector. Alloy supports profiling with eBPF, Java, and Golang in pull mode.

The eBPF profiler collects CPU profiles. Natively compiled languages like C/C++, Go, Rust, and Zig are supported. Frame pointers are not required — the profiler uses `.eh_frame` data for unwinding. Refer to [Troubleshooting unknown symbols](/docs/pyroscope/latest/configure-client/grafana-alloy/ebpf/troubleshooting/#troubleshoot-unknown-symbols) for additional requirements and information.

The following high-level languages are also supported: Java (Hotspot JVM), .NET, Python, Ruby, PHP, Node.js, and Perl. Each high-level language can be individually enabled or disabled in the [pyroscope.ebpf](/docs/alloy/latest/reference/components/pyroscope/pyroscope.ebpf/) Alloy component configuration.

For more information, refer to [Configure the client to send profiles with Grafana Alloy](/docs/pyroscope/latest/configure-client/grafana-alloy/).

This table lists the available profile types based on auto instrumentation using Alloy.

Expand table

| Profile type   | Go (pull) | Java | eBPF |
|----------------|-----------|------|------|
| CPU            | Yes       | Yes  | Yes  |
| Alloc Objects  | Yes       | Yes  |      |
| Alloc Space    | Yes       | Yes  |      |
| Inuse Objects  |           |      |      |
| Inuse Space    |           |      |      |
| Goroutines     | Yes       |      |      |
| Mutex Count    |           |      |      |
| Mutex Duration |           |      |      |
| Block Count    | Yes       |      |      |
| Block Duration | Yes       |      |      |
| Lock Count     |           | Yes  |      |
| Lock Duration  |           | Yes  |      |
| Exceptions     |           |      |      |
| Wall           |           | Yes  |      |
| Heap           |           |      |      |

### Instrumentation with SDKs

Using the Pyroscope language SDKs lets you instrument your application directly for precise profiling. You can customize the profiling process according to your application’s specific requirements.

For more information on the language SDKs, refer to [Pyroscope language SDKs](/docs/pyroscope/latest/configure-client/language-sdks/).

This table lists the available profile types based on the language SDK.

Expand table

| Profile type   | Go (push) | Java | .NET       | Ruby | Python | Rust | Node.js |
|----------------|-----------|------|------------|------|--------|------|---------|
| CPU            | Yes       | Yes  | Yes        | Yes  | Yes    | Yes  | Yes     |
| Alloc Objects  | Yes       | Yes  | Yes        |      |        |      |         |
| Alloc Space    | Yes       | Yes  | Yes        |      |        |      |         |
| Inuse Objects  | Yes       |      | Yes (7.0+) |      |        |      |         |
| Inuse Space    | Yes       |      | Yes (7.0+) |      |        |      |         |
| Goroutines     | Yes       |      |            |      |        |      |         |
| Mutex Count    | Yes       |      | Yes        |      |        |      |         |
| Mutex Duration | Yes       |      | Yes        |      |        |      |         |
| Block Count    | Yes       |      |            |      |        |      |         |
| Block Duration | Yes       |      |            |      |        |      |         |
| Lock Count     |           | Yes  | Yes        |      |        |      |         |
| Lock Duration  |           | Yes  | Yes        |      |        |      |         |
| Exceptions     |           |      | Yes        |      |        |      |         |
| Wall           |           | Yes  | Yes        |      |        |      | Yes     |
| Heap           |           |      | Yes (7.0+) |      |        |      | Yes     |

## Profile types supported with span profiles

Pyroscope can integrate with distributed tracing systems supporting the OpenTelemetry standard. This integration lets you link traces with the profiling data and find resource usage for specific lines of code for your trace spans.

Only CPU profile type is supported for span profiles.

The following languages are supported:

- [Go](/docs/pyroscope/latest/configure-client/trace-span-profiles/go-span-profiles/)
- [Java](/docs/pyroscope/latest/configure-client/trace-span-profiles/java-span-profiles/)
- [Ruby](/docs/pyroscope/latest/configure-client/trace-span-profiles/ruby-span-profiles/)
- [.NET](/docs/pyroscope/latest/configure-client/trace-span-profiles/dotnet-span-profiles/)
- [Python](/docs/pyroscope/latest/configure-client/trace-span-profiles/python-span-profiles/)
