Granulate / gprofiler

gProfiler is a system-wide profiler, combining multiple sampling profilers to produce unified visualization of what your CPU is spending time on.
https://profiler.granulate.io
Apache License 2.0
743 stars 54 forks source link

Aggregate frames by line-in-function (java) #799

Open Jongy opened 1 year ago

Jongy commented 1 year ago

gProfiler collects profiles function-based, i.e, each frame represents a function. An alternative is to aggregate line-in-function, so each frame is function:line. This creates a graph that is more fragmented, but carries more information (for example: function A calling function B twice will now have 2 separate callstacks for B under A, allowing you to differentiate).

Various profilers already support it (for example, py-spy does, as far as I'm aware). I want to start with support in Java (so async-profiler). The feature requirements are:

  1. A flag in gProfiler enabling the behavior: --line-numbers suffices.
  2. This flag is passed into ProfilerState and used by Profiler classes supporting it.
  3. In the case of JavaProfiler, async-profiler alreadys supports line numbering, see code that extracts the BCI -> line numbers table here. It exists for JFR. As we're using the collapsed format, we can add this support to collapsed, like we added method modifers.
  4. Syntax of the frame can be: add :line_number between the _[...] suffix to the frame name itself.

Note that line-of-function was added here: https://github.com/Granulate/gprofiler/pull/821. This ticket is for line-in-function.

Jongy commented 1 year ago

@mpozniak95 as discussed, I suggest we add a flag --java-line-numbers, which will have 2 values now - none and line-of-function. This ticket is line-in-function and you currently implementing line-of-function, so we'll start only with none and line-of-function. Default value is none.

You can move it out from ProfilerState to JavaProfiler.

mpozniak95 commented 1 year ago

Since PR's that I created are different feature, I am removing my assignment from this issue for now