diff --git a/README.md b/README.md index e295a05..6c624ea 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,9 @@ $ ./jfr-flame-graph -h -rv, --show-return-value Show return value for methods in the stack Default: false + -rev, --reverse-call-stack + Reverse call stacks so that it can show JFR style graph(bottom-up) + Default: false -st, --start-timestamp Start timestamp in seconds for filtering Default: -9223372036854775808 diff --git a/build/install/jfr-flame-graph/lib/jfr-flame-graph-0.0.4-SNAPSHOT.jar b/build/install/jfr-flame-graph/lib/jfr-flame-graph-0.0.4-SNAPSHOT.jar new file mode 100644 index 0000000..a0724d8 Binary files /dev/null and b/build/install/jfr-flame-graph/lib/jfr-flame-graph-0.0.4-SNAPSHOT.jar differ diff --git a/src/main/java/com/github/chrishantha/jfr/flamegraph/output/JFRToFlameGraphWriter.java b/src/main/java/com/github/chrishantha/jfr/flamegraph/output/JFRToFlameGraphWriter.java index da9e7d3..445a5a1 100644 --- a/src/main/java/com/github/chrishantha/jfr/flamegraph/output/JFRToFlameGraphWriter.java +++ b/src/main/java/com/github/chrishantha/jfr/flamegraph/output/JFRToFlameGraphWriter.java @@ -93,6 +93,10 @@ public final class JFRToFlameGraphWriter { "--event"}, description = "Type of event used to generate the flamegraph", converter = EventType.EventTypeConverter.class) EventType eventType = EventType.METHOD_PROFILING_SAMPLE; + @Parameter(names = {"-rev", + "--reverse-call-stack"}, description = "Reverse call stacks so that it can show JFR style graph(bottom-up)") + boolean reverseCallStack; + private static final String EVENT_VALUE_STACK = "(stackTrace)"; private static final String PRINT_FORMAT = "%-16s: %s%n"; @@ -236,6 +240,13 @@ private Stack getStack(IEvent event) { stack.push(frameName); } } + if(reverseCallStack){ + Stack stack_rev = new Stack<>(); + while(!stack.isEmpty()){ + stack_rev.push(stack.pop()); + } + stack = stack_rev; + } return stack; } diff --git a/src/main/java/com/github/chrishantha/jfr/flamegraph/output/JsonOutputWriter.java b/src/main/java/com/github/chrishantha/jfr/flamegraph/output/JsonOutputWriter.java index 0e1fb4f..137f635 100644 --- a/src/main/java/com/github/chrishantha/jfr/flamegraph/output/JsonOutputWriter.java +++ b/src/main/java/com/github/chrishantha/jfr/flamegraph/output/JsonOutputWriter.java @@ -77,7 +77,7 @@ public StackFrame(String name) { this.name = name; } - public StackFrame addFrame(String frameName) { + public StackFrame addFrame(String frameName, long size) { if (children == null) { children = new ArrayList<>(); } @@ -87,7 +87,7 @@ public StackFrame addFrame(String frameName) { childrenMap.put(frameName, frame); children.add(frame); } - frame.value++; + frame.value += size; return frame; } } @@ -108,7 +108,7 @@ public void processEvent(long startTimestamp, long endTimestamp, long duration, } while (!stack.empty()) { - frame = frame.addFrame(stack.pop()); + frame = frame.addFrame(stack.pop(), size); } } diff --git a/src/test/java/com/github/chrishantha/jfr/flamegraph/output/ApplicationTest.java b/src/test/java/com/github/chrishantha/jfr/flamegraph/output/ApplicationTest.java index d033b11..9479060 100644 --- a/src/test/java/com/github/chrishantha/jfr/flamegraph/output/ApplicationTest.java +++ b/src/test/java/com/github/chrishantha/jfr/flamegraph/output/ApplicationTest.java @@ -85,4 +85,9 @@ public void testEventTypeOptionDefaultValue() throws Exception { assertEquals(EventType.METHOD_PROFILING_SAMPLE, jfrToFlameGraphWriter.eventType); } + public void testReverseCallStackValue() throws Exception { + String[] args = {"-f", "temp", "-rev"}; + parseCommands(args); + assertTrue(jfrToFlameGraphWriter.reverseCallStack); + } }