Important: This documentation is about an older version. It's relevant only to the release noted, many of the features and functions have been updated or replaced. Please view the current version.
Go (pull mode)
The Grafana Agent is responsible for pulling profiles from applications and delivering them to the Pyroscope database.
Prerequisites
To be able to pull profiles from applications, your applications needs to expose pprof endpoints.
Before proceeding with the configuration, ensure that you have the following:
- Install Grafana Agent in flow mode
- Configure Grafana Agent in flow mode
- Start the Grafana Agent
Adding Profiling to the Grafana Agent
This guide presents how to configure the Grafana Agent for scraping performance profiles from a pprof endpoint using pyroscope.scrape and then write to a reciever defined in pyroscope.write.
While this documentation will contain a simple example for more configuration options visit the agent documentation for pyrosope.scrape and pyroscope.write.
Agent Configuration
In /agent/config/config.river file you will need two blocks, pyroscope.write and pyroscope.scrape:

pyroscope.writeto configure the receivers to which the profiles are forwarded.pyroscope.scrapeto establish a pprof scraping job for specific targets. The performance profiles obtained from the scraping process are then passed to the receivers specified inforward_to. You can define multiplepyroscope.scrapecomponents, each distinguished by unique labels.
Here is the general usage:
pyroscope.write "example" {
// Send metrics to a locally running Pyroscope instance.
endpoint {
url = "http://pyroscope:4040"
// To send data to Grafana Cloud you'll need to provide username and password.
// basic_auth {
// username = "myuser"
// password = "mypassword"
// }
}
external_labels = {
"env" = "staging",
}
}
pyroscope.scrape "LABEL" {
targets = TARGET_LIST
forward_to = RECEIVER_LIST
}Here, LABEL is a unique identifier for the scraping job, TARGET_LIST is a list of target endpoints, and RECEIVER_LIST is a list of receivers to which scraped profiles are forwarded.
Profiling Configuration
The profiling_config block inside of pyroscope.scrape tailors the profiling settings for the scraping targets. It includes a number of blocks, each corresponding to a specific profile type. These blocks can be enabled or disabled, and the scraping path can be customized. A delta option is available to scrape the profile as a delta, adding a seconds query parameter to requests.
Below are the blocks available within profiling_config:
profile.memory
Collects profiles on memory consumption.
| Argument | Type | Description | Default | Required |
|---|---|---|---|---|
| enabled | boolean | Enable this profile type to be scraped. | true | no |
| path | string | The path to the profile type on the target. | “/debug/pprof/memory” | no |
| delta | boolean | Whether to scrape the profile as a delta. | false | no |
profile.block
Collects profiles on process blocking.
| Argument | Type | Description | Default | Required |
|---|---|---|---|---|
| enabled | boolean | Enable this profile type to be scraped. | true | no |
| path | string | The path to the profile type on the target. | “/debug/pprof/block” | no |
| delta | boolean | Whether to scrape the profile as a delta. | false | no |
profile.goroutine
Collects profiles on the number of goroutines.
| Argument | Type | Description | Default | Required |
|---|---|---|---|---|
| enabled | boolean | Enable this profile type to be scraped. | true | no |
| path | string | The path to the profile type on the target. | “/debug/pprof/goroutine” | no |
| delta | boolean | Whether to scrape the profile as a delta. | false | no |
profile.mutex
Collects profiles on mutexes.
| Argument | Type | Description | Default | Required |
|---|---|---|---|---|
| enabled | boolean | Enable this profile type to be scraped. | true | no |
| path | string | The path to the profile type on the target. | “/debug/pprof/mutex” | no |
| delta | boolean | Whether to scrape the profile as a delta. | false | no |
profile.process_cpu
Collects profiles on CPU consumption for the process.
| Argument | Type | Description | Default | Required |
|---|---|---|---|---|
| enabled | boolean | Enable this profile type to be scraped. | true | no |
| path | string | The path to the profile type on the target. | “/debug/pprof/profile” | no |
| delta | boolean | Whether to scrape the profile as a delta. | true | no |
profile.fgprof
Collects profiles from an fgprof endpoint.
| Argument | Type | Description | Default | Required |
|---|---|---|---|---|
| enabled | boolean | Enable this profile type to be scraped. | false | no |
| path | string | The path to the profile type on the target. | “/debug/fgprof” | no |
| delta | boolean | Whether to scrape the profile as a delta. | true | no |
profile.godeltaprof_memory
Collects profiles from godeltaprof memory endpoint. The delta is computed on the target.
| Argument | Type | Description | Default | Required |
|---|---|---|---|---|
| enabled | boolean | Enable this profile type to be scraped. | false | no |
| path | string | The path to the profile type on the target. | “/debug/pprof/delta_heap” | no |
profile.godeltaprof_mutex
Collects profiles from godeltaprof mutex endpoint. The delta is computed on the target.
| Argument | Type | Description | Default | Required |
|---|---|---|---|---|
| enabled | boolean | Enable this profile type to be scraped. | false | no |
| path | string | The path to the profile type on the target. | “/debug/pprof/delta_mutex” | no |
profile.godeltaprof_block
Collects profiles from godeltaprof block endpoint. The delta is computed on the target.
| Argument | Type | Description | Default | Required |
|---|---|---|---|---|
| enabled | boolean | Enable this profile type to be scraped. | false | no |
| path | string | The path to the profile type on the target. | “/debug/pprof/delta_block” | no |
Example
The following configuration sets up a scraping job in config.river that scrapes the application. The profiles obtained are then sent over to the receivers as defined by other components.
Setup project structure
To set up the Grafana Agent for profiling in pull mode (see example), follow these steps:
Create the following directory structure:
├── examples
│ └── your-application-example
│ ├── agent
│ │ └── config
│ │ └── config.river
│ │── docker-compose.yml
└── ...Setup river config
We will use the following config.river file to configure the Grafana Agent to scrape profiles from the application and send them to the Pyroscope server. Be sure to replace the url property with the correct Pyroscope instance.
Note: We have swapped out the standard pprof block, mutex and memory profiles with the more efficient godeltaprof package which produces godeltaprof_block, godeltaprof_mutex and godeltaprof_memoryrespectively.
The reason for using this special package is because godeltaprof is a memory profiler specialized for collecting cumulative profiles (heap, block, mutex) efficiently. It is more efficient because it does the delta/merging before producing pprof data, avoiding extra decompression/parsing/allocations/compression.
To start using godeltaprof in pull mode in a Go application, you need to include godeltaprof module in your app:
go get github.com/grafana/pyroscope-go/godeltaprof@latestand add it to your imports:
import _ "net/http/pprof"
import _ "github.com/grafana/pyroscope-go/godeltaprof/http/pprof"// add this line as wellIf you do not have ability to update your code then disable all the goddeltaprof_X profiles and enable the corresponding standard X profiles.
pyroscope.write "example" {
endpoint {
url = "http://pyroscope:4040"
}
}
pyroscope.scrape "default_settings" {
targets = [ { "__address__" = "http://localhost:12345", "service_name" = "example_service" } ]
forward_to = [pyroscope.write.example.receiver]
profiling_config {
profile.goroutine {
enabled = true
path = "/debug/pprof/goroutine"
delta = false
}
profile.process_cpu {
enabled = true
path = "/debug/pprof/profile"
delta = true
}
profile.godeltaprof_memory {
enabled = true
path = "/debug/pprof/delta_heap"
}
profile.memory {
enabled = false
path = "/debug/pprof/heap"
delta = false
}
profile.godeltaprof_mutex {
enabled = true
path = "/debug/pprof/delta_mutex"
}
profile.mutex {
enabled = false
path = "/debug/pprof/mutex"
delta = false
}
profile.godeltaprof_block {
enabled = true
path = "/debug/pprof/delta_block"
}
profile.block {
enabled = false
path = "/debug/pprof/block"
delta = false
}
}
}By adjusting the configuration as demonstrated above, you can enable the Grafana Agent to suitably scrape and process profile data from your pprof endpoints.
Resources
Visit the Pyroscope examples to see an example of how to run Pyroscope with the Grafana Agent.


