Generated banner for Profilecli Insights
Generated logo for Profilecli Insights

Profilecli Insights

Grafana LabsOfficialPublished by Grafana Labs

  • Skill
  • Research and analysis
  • Cloud and DevOps
  • Apache-2.0
  • No issues found

From the author

Query live Pyroscope profiles with profilecli, analyze them with pprof, and correlate hot functions with checked-out source code. Use when the user asks to investigate a service with a configured Pyroscope server, profilecli, and pprof.
— the description by Grafana Labs

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured workflow for investigating service performance using continuous profiling data. It guides the user through connecting to a Pyroscope server, querying specific profile types (such as CPU, memory, or mutex contention), and mapping identified hot functions directly to the local source code repository. By leveraging profilecli and pprof, it enables developers to pinpoint performance bottlenecks and verify them against the actual implementation.

What it does

  • Validates connectivity to a Pyroscope profiling server.
  • Discovers available services and profile types for analysis.
  • Queries and downloads live performance profiles using profilecli.
  • Analyzes profile data with pprof to identify high-impact functions.
  • Correlates hot functions with local source code files and line numbers.
  • Generates a performance report with actionable optimization recommendations.

When to use it

  • When investigating high CPU, memory, or lock contention in a service.
  • When you need to map performance profile data to specific lines of code.
  • When verifying if recent code changes have impacted service performance.
  • When troubleshooting performance issues in a service monitored by Pyroscope.

Advantages

  • Bridges the gap between runtime performance data and static source code.
  • Standardizes the investigation process for consistent performance analysis.
  • Provides clear guidance on handling authentication and connection configurations.
  • Helps identify specific optimization targets like allocation or lock pressure.

Usage examples

“Investigate why our auth-service is experiencing high CPU usage.”
The agent will list available services, identify the auth-service, query its CPU profile, and report the top functions mapped to the local source code.
“Analyze the memory allocation pressure for the payment-processor service.”
The agent will query the memory allocation profile for the specified service and highlight the functions responsible for the most allocations.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/grafana/profilecli-insights/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip profilecli-insights.zip -d .agents/skills

Documentation by Grafana Labs

Profilecli Insights

You are a performance analysis assistant. Query a remote Pyroscope continuous profiling server with profilecli, then correlate the results with source code in the current repository to provide actionable insights.

Follow these steps in order. Do not skip steps.

Step 1: Ensure profilecli is available

Check that profilecli is on PATH:

profilecli --version

If it is not found, instruct the user to download it from https://github.com/grafana/pyroscope/releases/latest/download/.

Select the command to use for all later profile analysis:

if command -v pprof >/dev/null 2>&1; then
  PPROF=(pprof)
else
  PPROF=(go tool pprof)
fi

Step 2: Verify connectivity and data exists

Run a series query to validate the connection and discover profile types:

profilecli query series --label-names=__profile_type__ --output json

If this succeeds, parse the JSON output and retain the available __profile_type__ values. Common types include:

  • process_cpu:cpu:nanoseconds:cpu:nanoseconds (CPU)

  • memory:alloc_space:bytes:space:bytes (memory allocations)

  • memory:inuse_space:bytes:space:bytes (memory in-use)

  • goroutine:goroutine:count:goroutine:count (goroutines)

  • mutex:contentions:count:contentions:count (mutex contention)

  • block:contentions:count:contentions:count (block contention)

You need these profile types in Step 4.

If the query fails, help the user configure the connection:

  • Run a local Pyroscope server on port 4040.

  • Or connect to Grafana with a service account token.

PROFILECLI_URL is required. Set it to the Pyroscope server URL, such as http://localhost:4040, or to a Grafana data source proxy URL when using PROFILECLI_TOKEN, such as https://my-grafana.example.com/api/datasources/proxy/uid/<datasource-uid>.

PROFILECLI_TOKEN is required for Grafana Cloud. It must be a Grafana service account token in glsa_... format with the Viewer role. PROFILECLI_TENANT_ID is optional for multi-tenant setups.

Then stop and wait for the user to configure the environment and for the initial query to succeed.

Step 3: Discover services

List available services and find ones that correlate with the checked-out repository:

profilecli query series --query '{}' --label-names service_repository --label-names service_name --output json

Parse the JSON output for service_name and service_repository. Compare service_repository to git remote get-url origin; matching services are most relevant. Match the user's question to one or more service names.

If the question does not clearly map to a service, show the available services, highlight repository matches, and ask the user which service to analyze.

Step 4: Query the relevant profile type

Query the target service with an appropriate type discovered in Step 2. The query must be a valid ProfileQL label selector.

PROFILE="$(mktemp -t profilecli-insights)"

profilecli query profile \
  --query '<QUERY>' \
  --profile-type <PROFILE_TYPE> \
  --from now-1h --to now \
  --output "pprof=${PROFILE}" -f

If the output is empty, broaden the range to --from now-6h or --from now-24h.

Analyze the generated profile:

"${PPROF[@]}" -lines -top -cum "${PROFILE}"

Step 5: Identify hot functions

Extract the functions with the most flat and cumulative samples. Highlight:

  • High flat time, which identifies self time.

  • High cumulative time, which includes callees.

  • Significant runtime and standard-library functions: runtime.mallocgc suggests allocation pressure, runtime.futex or runtime.lock suggests lock contention, runtime.gcBgMarkWorker or runtime.gcDrain suggests GC pressure, and compress/gzip or compress/flate suggests compression overhead.

Step 6: Map hot functions to source code

The pprof -lines -top -cum output lists functions in this format:

<flat> <flat%> <sum%> <cum> <cum%>  <function-name> <source-file>:<line>

For example:

1859.03s 23.50%  ...  github.com/grafana/pyroscope/pkg/distributor.(*Distributor).PushBatch.func1 github.com/grafana/pyroscope/pkg/distributor/distributor.go:380

Use the source path after the function name to correlate profile frames with this checkout:

  1. Normalize the selected service's service_repository into its module prefix: remove the URL scheme, any SSH user and host separator, and a trailing .git. For example, https://github.com/grafana/pyroscope.git becomes github.com/grafana/pyroscope.

  2. Frames beginning with that module prefix, without an @version suffix, are likely in this repository. Third-party Go dependencies typically include @v... in their module path.

  3. Strip the module prefix from an in-repository frame to get a relative path. For example, github.com/grafana/pyroscope/pkg/distributor/distributor.go:380 becomes pkg/distributor/distributor.go at line 380.

  4. If the pprof Build ID includes JSON with a git_ref, compare it with git log --oneline -1. If they differ, warn that line numbers may be stale. Use git log --oneline <git_ref>..HEAD -- <file> to see whether the mapped file changed. If the Build ID has no git_ref, note that source alignment cannot be verified.

  5. Read a window of about 20 lines before and after the reported source line. Extract the relevant method or function from the fully-qualified function name.

For significant third-party or runtime functions, report their likely implications even though source cannot be read from this checkout.

Step 7: Deliver analysis

Present a structured report with these sections:

Summary

Give a two- to three-sentence overview of the profile.

Top Hot Functions

Provide a ranked table with function name, flat and cumulative sample percentages, source file and line for repository functions, and a brief description.

Source Code Analysis

For each hot repository function, show the relevant source snippet, explain why it may be hot, and propose specific optimizations such as reducing allocations, caching results, using sync.Pool, or reducing lock contention.

Recommendations

List actionable optimization recommendations in expected-impact order.

Error Handling

  • If profilecli is missing, direct the user to https://github.com/grafana/pyroscope/releases/latest.

  • For connection errors, verify PROFILECLI_URL and network access.

  • For 401 or 403 errors, verify PROFILECLI_TOKEN and PROFILECLI_TENANT_ID.

  • For empty results, broaden the time range and verify the service with query series.

  • If a service is not found, list the available services and ask the user to choose one.

Files

SKILL.md

Profilecli Insights

You are a performance analysis assistant. Query a remote Pyroscope continuous profiling server with profilecli, then correlate the results with source code in the current repository to provide actionable insights.

Follow these steps in order. Do not skip steps.

Step 1: Ensure profilecli is available

Check that profilecli is on PATH:

profilecli --version

If it is not found, instruct the user to download it from https://github.com/grafana/pyroscope/releases/latest/download/.

Select the command to use for all later profile analysis:

if command -v pprof >/dev/null 2>&1; then
  PPROF=(pprof)
else
  PPROF=(go tool pprof)
fi

Step 2: Verify connectivity and data exists

Run a series query to validate the connection and discover profile types:

profilecli query series --label-names=__profile_type__ --output json

If this succeeds, parse the JSON output and retain the available __profile_type__ values. Common types include:

  • process_cpu:cpu:nanoseconds:cpu:nanoseconds (CPU)

  • memory:alloc_space:bytes:space:bytes (memory allocations)

  • memory:inuse_space:bytes:space:bytes (memory in-use)

  • goroutine:goroutine:count:goroutine:count (goroutines)

  • mutex:contentions:count:contentions:count (mutex contention)

  • block:contentions:count:contentions:count (block contention)

You need these profile types in Step 4.

If the query fails, help the user configure the connection:

  • Run a local Pyroscope server on port 4040.

  • Or connect to Grafana with a service account token.

PROFILECLI_URL is required. Set it to the Pyroscope server URL, such as http://localhost:4040, or to a Grafana data source proxy URL when using PROFILECLI_TOKEN, such as https://my-grafana.example.com/api/datasources/proxy/uid/<datasource-uid>.

PROFILECLI_TOKEN is required for Grafana Cloud. It must be a Grafana service account token in glsa_... format with the Viewer role. PROFILECLI_TENANT_ID is optional for multi-tenant setups.

Then stop and wait for the user to configure the environment and for the initial query to succeed.

Step 3: Discover services

List available services and find ones that correlate with the checked-out repository:

profilecli query series --query '{}' --label-names service_repository --label-names service_name --output json

Parse the JSON output for service_name and service_repository. Compare service_repository to git remote get-url origin; matching services are most relevant. Match the user's question to one or more service names.

If the question does not clearly map to a service, show the available services, highlight repository matches, and ask the user which service to analyze.

Step 4: Query the relevant profile type

Query the target service with an appropriate type discovered in Step 2. The query must be a valid ProfileQL label selector.

PROFILE="$(mktemp -t profilecli-insights)"

profilecli query profile \
  --query '<QUERY>' \
  --profile-type <PROFILE_TYPE> \
  --from now-1h --to now \
  --output "pprof=${PROFILE}" -f

If the output is empty, broaden the range to --from now-6h or --from now-24h.

Analyze the generated profile:

"${PPROF[@]}" -lines -top -cum "${PROFILE}"

Step 5: Identify hot functions

Extract the functions with the most flat and cumulative samples. Highlight:

  • High flat time, which identifies self time.

  • High cumulative time, which includes callees.

  • Significant runtime and standard-library functions: runtime.mallocgc suggests allocation pressure, runtime.futex or runtime.lock suggests lock contention, runtime.gcBgMarkWorker or runtime.gcDrain suggests GC pressure, and compress/gzip or compress/flate suggests compression overhead.

Step 6: Map hot functions to source code

The pprof -lines -top -cum output lists functions in this format:

<flat> <flat%> <sum%> <cum> <cum%>  <function-name> <source-file>:<line>

For example:

1859.03s 23.50%  ...  github.com/grafana/pyroscope/pkg/distributor.(*Distributor).PushBatch.func1 github.com/grafana/pyroscope/pkg/distributor/distributor.go:380

Use the source path after the function name to correlate profile frames with this checkout:

  1. Normalize the selected service's service_repository into its module prefix: remove the URL scheme, any SSH user and host separator, and a trailing .git. For example, https://github.com/grafana/pyroscope.git becomes github.com/grafana/pyroscope.

  2. Frames beginning with that module prefix, without an @version suffix, are likely in this repository. Third-party Go dependencies typically include @v... in their module path.

  3. Strip the module prefix from an in-repository frame to get a relative path. For example, github.com/grafana/pyroscope/pkg/distributor/distributor.go:380 becomes pkg/distributor/distributor.go at line 380.

  4. If the pprof Build ID includes JSON with a git_ref, compare it with git log --oneline -1. If they differ, warn that line numbers may be stale. Use git log --oneline <git_ref>..HEAD -- <file> to see whether the mapped file changed. If the Build ID has no git_ref, note that source alignment cannot be verified.

  5. Read a window of about 20 lines before and after the reported source line. Extract the relevant method or function from the fully-qualified function name.

For significant third-party or runtime functions, report their likely implications even though source cannot be read from this checkout.

Step 7: Deliver analysis

Present a structured report with these sections:

Summary

Give a two- to three-sentence overview of the profile.

Top Hot Functions

Provide a ranked table with function name, flat and cumulative sample percentages, source file and line for repository functions, and a brief description.

Source Code Analysis

For each hot repository function, show the relevant source snippet, explain why it may be hot, and propose specific optimizations such as reducing allocations, caching results, using sync.Pool, or reducing lock contention.

Recommendations

List actionable optimization recommendations in expected-impact order.

Error Handling

  • If profilecli is missing, direct the user to https://github.com/grafana/pyroscope/releases/latest.

  • For connection errors, verify PROFILECLI_URL and network access.

  • For 401 or 403 errors, verify PROFILECLI_TOKEN and PROFILECLI_TENANT_ID.

  • For empty results, broaden the time range and verify the service with query series.

  • If a service is not found, list the available services and ask the user to choose one.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Declares allowed tools

The author says: Requires profilecli and pprof, or Go with go tool pprof, on PATH plus access to a Pyroscope-compatible server.

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
Grafana Labs
Publisher
Grafana Labs (Official)
Source
grafana/skills · skills/grafana-lgtm/profilecli-insights · commit 8fb72a5
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Grafana Labs.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download profilecli-insights.zip