Loading...
Loading...
Grafana Pyroscope continuous profiling platform. Covers instrumentation of Go/Java/Python/Ruby/Node.js/ .NET/Rust apps via SDKs or eBPF (Alloy), flame graph analysis, ProfileQL queries, server configuration and architecture, Grafana Cloud Profiles integration, and trace-profile linking (Span Profiles). Use when working with profiling data, instrumenting apps for Pyroscope, analyzing performance profiles, or deploying Pyroscope server.
npx skill4agent add grafana/skills pyroscopepyroscope.receive_httppip install pyroscope-ioimport pyroscope, os
pyroscope.configure(
application_name = "my.python.app",
server_address = "http://pyroscope:4040",
sample_rate = 100,
oncpu = True,
tags = {"region": os.getenv("REGION"), "env": "prod"},
)
# Dynamic labels for specific code sections
with pyroscope.tag_wrapper({"controller": "slow_controller"}):
slow_code()pyroscope.configure(
application_name = "my.python.app",
server_address = "https://profiles-prod-xxx.grafana.net",
basic_auth_username = "123456",
basic_auth_password = os.getenv("GRAFANA_API_KEY"),
)<!-- Maven -->
<dependency>
<groupId>io.pyroscope</groupId>
<artifactId>agent</artifactId>
<version>2.1.2</version>
</dependency>// Method 1: Application code
PyroscopeAgent.start(
new Config.Builder()
.setApplicationName("my-java-app")
.setProfilingEvent(EventType.ITIMER)
.setFormat(Format.JFR) // required for multiple events
.setServerAddress("http://pyroscope:4040")
.build()
);
// Dynamic labels
Pyroscope.LabelsWrapper.run(new LabelsSet("controller", "slow_controller"), () -> {
slowCode();
});# Method 2: Java Agent (no code changes)
export PYROSCOPE_APPLICATION_NAME=my.java.app
export PYROSCOPE_SERVER_ADDRESS=http://pyroscope:4040
java -javaagent:pyroscope.jar -jar app.jar| Env Var | Description | Default |
|---|---|---|
| | |
| | |
| Allocation bytes threshold; | disabled |
| Lock contention threshold (ns) | disabled |
| Upload frequency | |
npm install @pyroscope/nodejsconst Pyroscope = require('@pyroscope/nodejs');
Pyroscope.init({
serverAddress: 'http://pyroscope:4040',
appName: 'my-node-service',
tags: { region: process.env.REGION },
basicAuthUser: process.env.PYROSCOPE_USER,
basicAuthPassword: process.env.PYROSCOPE_PASSWORD,
flushIntervalMs: 60000,
});
Pyroscope.start();
// Dynamic labels
Pyroscope.wrapWithLabels({ vehicle: 'bike' }, () => slowCode());bundle add pyroscoperequire 'pyroscope'
Pyroscope.configure do |config|
config.application_name = "my.ruby.app"
config.server_address = "http://pyroscope:4040"
config.tags = { hostname: ENV["HOSTNAME"] }
end
# Dynamic tags
Pyroscope.tag_wrapper({ controller: "slow_controller" }) do
slow_code
end# System requirements: Linux amd64, .NET 6+
export PYROSCOPE_APPLICATION_NAME=my.dotnet.app
export PYROSCOPE_SERVER_ADDRESS=http://pyroscope:4040
export PYROSCOPE_PROFILING_ENABLED=1
export CORECLR_ENABLE_PROFILING=1
export CORECLR_PROFILER={BD1A650D-AC5D-4896-B64F-D6FA25D6B26A}
export CORECLR_PROFILER_PATH=/dotnet/Pyroscope.Profiler.Native.so
export LD_PRELOAD=/dotnet/Pyroscope.Linux.ApiWrapper.x64.so// Dynamic labels
var labels = Pyroscope.LabelSet.Empty.BuildUpon()
.Add("controller", "slow")
.Build();
Pyroscope.LabelsWrapper.Do(labels, () => SlowCode());cargo add pyroscope pyroscope_pprofrslet pprof_config = PprofConfig::new().sample_rate(100);
let agent = PyroscopeAgent::builder("http://pyroscope:4040", "my-rust-app")
.backend(pprof_backend(pprof_config))
.tags([("env", "prod"), ("region", "us-east")].to_vec())
.basic_auth(user, password)
.build()?;
let agent_running = agent.start().unwrap();
// ... app runs ...
let agent_ready = agent_running.stop().unwrap();
agent_ready.shutdown();discovery.kubernetes "all_pods" {
role = "pod"
selectors {
field = "spec.nodeName=" + sys.env("HOSTNAME")
}
}
discovery.relabel "local_pods" {
targets = discovery.kubernetes.all_pods.targets
rule {
source_labels = ["__meta_kubernetes_namespace"]
target_label = "namespace"
}
}
pyroscope.ebpf "local_pods" {
forward_to = [pyroscope.write.cloud.receiver]
targets = discovery.relabel.local_pods.output
sample_rate = 97 // samples per second
collect_interval = "15s"
}
pyroscope.write "cloud" {
endpoint {
url = "https://profiles-prod-xxx.grafana.net"
basic_auth {
username = sys.env("PYROSCOPE_USER")
password = sys.env("GRAFANA_API_KEY")
}
}
}# All CPU profiles for a service
{service_name="myapp", __profile_type__="process_cpu:cpu:nanoseconds:cpu:nanoseconds"}
# Filter by label
{service_name="myapp", env="prod"}
# Profile types format: <type>:<value_type>:<value_unit>:<span_name>:<span_unit>process_cpu:cpu:nanoseconds:cpu:nanosecondsmemory:inuse_space:bytes:space:bytesmemory:alloc_space:bytes:space:bytesgoroutine:goroutine:count::mutex:contentions:count::| Language | CPU | Memory | Goroutines | Allocations |
|---|---|---|---|---|
| Go | ✓ | ✓ | ✓ | ✓ |
| Java | ✓ | ✓ | ✓ | ✓ |
| Python | ✓ | - | - | - |
| Node.js | ✓ | ✓ | - | ✓ |
| Ruby | ✓ | ✓ | - | - |
| .NET | ✓ | ✓ | - | ✓ |
| Rust | ✓ | - | - | - |
| eBPF | ✓ | - | - | - |
[a-zA-Z_][a-zA-Z0-9_]*