The Pprof Receiver collects profiles from files specified with a glob pattern, from a remote endpoint or the running collector.
| Status | |
|---|---|
| Stability | alpha: profiles |
| Distributions | contrib |
| Issues | |
| Code coverage | |
| Code Owners | @MovieStoreGuy, @atoulme |
The receiver supports four independent ingestion modes that can be combined in a single receiver instance. At least one section must be configured.
remote: poll pprof from a remote HTTP endpointfile: read pprof files matching a glob patternself: profile the running collectorserver: accept pushed pprof data over HTTP atPOST /v1/pprof
Each scraping section (remote, file, self) accepts its own collection_interval
(default 10s) and initial_delay (default 1s).
Accepts every field of confighttp.ClientConfig.
endpoint(required): the URL to fetch pprof data from.
include(required): glob pattern for pprof files to read.
block_profile_fraction(default1): fraction of blocking events profiled. See https://golang.org/pkg/runtime/#SetBlockProfileRate.mutex_profile_fraction(default1): fraction of mutex contention events profiled. See https://golang.org/pkg/runtime/#SetMutexProfileFraction.
Accepts every field of confighttp.ServerConfig.
The server exposes a single endpoint:
POST /v1/pprof
Content-Type: application/octet-stream
The body is a serialized pprof profile.proto. Standard Content-Encoding values
(e.g. gzip) are handled transparently by confighttp.
A profile.proto is already gzip-encoded on disk by the standard runtime/pprof
package, so the file bytes can be sent as-is with Content-Encoding: gzip:
package main
import (
"log"
"net/http"
"os"
)
func main() {
f, err := os.Open("cpu.pprof")
if err != nil {
log.Fatal(err)
}
defer f.Close()
req, err := http.NewRequest(http.MethodPost, "http://localhost:4040/v1/pprof", f)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Content-Type", "application/octet-stream")
req.Header.Set("Content-Encoding", "gzip")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusNoContent {
log.Fatalf("unexpected status: %s", resp.Status)
}
}receivers:
pprof:
remote:
endpoint: http://my-svc:9090/debug/pprof/profile?seconds=1
collection_interval: 30s
initial_delay: 10s
server:
endpoint: 0.0.0.0:4040
tls:
cert_file: server.crt
key_file: server.key
file:
include: /tmp/pprof/*
collection_interval: 10s
initial_delay: 20s
self:
collection_interval: 15s
initial_delay: 1s