Capture Java thread names per-sample for Spark task attribution - #78
Merged
Conversation
artursarlo
approved these changes
Aug 11, 2026
artursarlo
left a comment
There was a problem hiding this comment.
LGTM. Tested those changes locally on a DEV environment. Working as expected.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Enables accurate per-thread attribution in Java flamegraphs for workloads that rename threads at runtime — most importantly Spark executors, which rename their task-pool threads per task (e.g.
Executor task launch worker for task 21.0 in stage 492.0).Two changes:
scripts/async_profiler_build_shared.sh— build async-profiler from thev3.0g1_threadpoolbranch (Granulate/async-profiler#10, "capture thread names for every sample"). Stockv3.0g1records a thread's name only once, so long-lived Spark executor pool threads keep a stale task/stage label across their lifetime; the threadpool build re-reads the name at each sample.gprofiler/profilers/java.py— addthreadsto async-profiler's collapsed-outputFORMAT_PARAMSso each sample is prefixed with its (now current) thread name.Why
The Spark-on-k8s per-thread profiling demo (gprofiler-performance-studio#85) relies on thread names to break flamegraphs down by Spark stage/task. With the stock build, attribution silently drifts as executors reuse pool threads for new tasks. This PR makes the thread-name labels trustworthy.
Notes for reviewers
FORMAT_PARAMShunk can be dropped andthreadspassed via the existing--java-async-profiler-args=threadsflag instead — the build-script change alone is what fixes stale names.GIT_REVso builds are reproducible.🤖 Generated with Claude Code