Search in sources :

Example 1 with LeanNode

use of com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode in project honest-profiler by jvm-profiling-tools.

the class DescendantTreeAggregator method addChildren.

/**
 * Recursive method for aggregating the children (and descendants) of the {@link LeanNode}s which are aggregated by
 * the provided {@link Node}.
 * <p>
 * @param source the original {@link AggregationProfile}
 * @param child the input {@link Node}
 * @param tree the resulting {@link Tree}
 * @param grouping the key calculation grouping
 */
private void addChildren(AggregationProfile source, Node child, Tree tree, CombinedGrouping grouping) {
    Map<String, Node> result = child.getAggregatedNodes().stream().flatMap(node -> node.getChildren().stream()).collect(groupingBy(// Group LeanNodes by calculated key
    node -> grouping.apply(source, node), // Downstream collector, collects LeanNodes in a single group
    of(// Supplier, creates an empty Node
    () -> {
        Node node = new Node(tree);
        // Set the reference by default for all nodes to the global aggregation.
        node.setReference(source.getGlobalData());
        return node;
    }, // Accumulator, aggregates a LeanNode into the Node accumulator
    (x, y) -> {
        x.add(y);
        x.setKey(grouping.apply(source, y));
    }, // Combiner, combines two Nodes with the same key
    (x, y) -> x.combine(y))));
    // Add the aggregated children as children to the Node, and recurse
    result.values().forEach(parent -> {
        child.addChild(parent);
        // Recursively add descendants
        addChildren(source, parent, tree, grouping);
    });
}
Also used : CombinedGrouping(com.insightfullogic.honest_profiler.core.aggregation.grouping.CombinedGrouping) LeanNode(com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode) Tree(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Tree) Map(java.util.Map) Aggregation(com.insightfullogic.honest_profiler.core.aggregation.result.Aggregation) Keyed(com.insightfullogic.honest_profiler.core.aggregation.result.Keyed) Entry(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Entry) Node(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Node) Collectors.groupingBy(java.util.stream.Collectors.groupingBy) AggregationProfile(com.insightfullogic.honest_profiler.core.aggregation.AggregationProfile) Collector.of(java.util.stream.Collector.of) LeanNode(com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode) Node(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Node)

Example 2 with LeanNode

use of com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode in project honest-profiler by jvm-profiling-tools.

the class FlatProfileAggregator method aggregate.

/**
 * Aggregates an {@link AggregationProfile} into a {@link Flat}. The {@link CombinedGrouping} specifies which
 * {@link LeanNode}s are aggregated together.
 *
 * @see ProfileAggregator#aggregate(AggregationProfile, CombinedGrouping)
 */
@Override
public Flat aggregate(AggregationProfile input, CombinedGrouping grouping) {
    // Prepare result.
    Flat result = new Flat(input, grouping);
    LeanProfile source = input.getSource();
    // Flatten all LeanNodes into a Stream, then collect it into a Map where the key is calculated by the groupings,
    // and the value is the aggregation of the LeanNodes corresponding to the key.
    Map<String, Entry> entryMap = source.getThreads().values().stream().flatMap(LeanNode::flatten).filter(node -> !node.isThreadNode()).collect(groupingBy(// Group LeanNodes by calculated key
    node -> grouping.apply(input, node), // Downstream collector, aggregates LeanNodes in a single group
    of(// Supplier, creates an empty Entry
    () -> new Entry(result), // Accumulator, aggregates a LeanNode into the Entry accumulator
    (entry, leanNode) -> entry.add(leanNode), // Combiner, combines two Entries with the same key
    (entry1, entry2) -> entry1.combine(entry2))));
    // Add the aggregated Entries to the result list, after setting their key and reference.
    result.getData().addAll(entryMap.entrySet().stream().map(mapEntry -> {
        Entry entry = mapEntry.getValue();
        // The key must be set explicitly here because it isn't set in the collector.
        entry.setKey(mapEntry.getKey());
        // Set the reference by default for all nodes to the global aggregation.
        entry.setReference(input.getGlobalData());
        return entry;
    }).collect(toList()));
    return result;
}
Also used : LeanNode(com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode) Collectors.toList(java.util.stream.Collectors.toList) CombinedGrouping(com.insightfullogic.honest_profiler.core.aggregation.grouping.CombinedGrouping) LeanNode(com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode) Map(java.util.Map) Entry(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Entry) Collectors.groupingBy(java.util.stream.Collectors.groupingBy) Flat(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Flat) AggregationProfile(com.insightfullogic.honest_profiler.core.aggregation.AggregationProfile) LeanProfile(com.insightfullogic.honest_profiler.core.profiles.lean.LeanProfile) Collector.of(java.util.stream.Collector.of) Entry(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Entry) LeanProfile(com.insightfullogic.honest_profiler.core.profiles.lean.LeanProfile) Flat(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Flat)

Example 3 with LeanNode

use of com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode in project honest-profiler by jvm-profiling-tools.

the class TreeProfileAggregator method aggregate.

// Aggregator Implementation
/**
 * Aggregates an {@link AggregationProfile} into a {@link Tree}. The {@link CombinedGrouping} specifies which
 * {@link LeanNode}s are aggregated together.
 *
 * @see ProfileAggregator#aggregate(AggregationProfile, CombinedGrouping)
 */
@Override
public Tree aggregate(AggregationProfile input, CombinedGrouping grouping) {
    // Prepare result.
    Tree result = new Tree(input, grouping);
    LeanProfile profile = input.getSource();
    Map<String, Node> nodeMap = profile.getThreads().values().stream().collect(groupingBy(// Group LeanNodes by calculated key
    node -> grouping.apply(input, node), // Downstream collector, aggregates LeanNodes in a single group
    of(// Supplier, creates an empty Node
    () -> new Node(result), // Accumulator, aggregates a LeanNode into the Node accumulator
    (node, leanNode) -> {
        node.add(leanNode);
        node.setKey(grouping.apply(input, leanNode));
        // Aggregate descendants of a LeanNode recursively into children of accumulator. The recursion
        // happens inside the Node.addChild() method, triggered by the boolean parameter.
        leanNode.getChildren().forEach(child -> node.addChild(child, grouping, true));
    }, // Combiner, combines two Nodes with the same key
    (node1, node2) -> node1.combine(node2))));
    // Set the reference by default for all nodes to the global aggregation.
    // We do this here because the addChild() method doesn't propagate the reference, and proably shouldn't.
    nodeMap.values().stream().flatMap(Node::flatten).forEach(node -> {
        node.setReference(input.getGlobalData());
    });
    result.getData().addAll(nodeMap.values());
    return result;
}
Also used : CombinedGrouping(com.insightfullogic.honest_profiler.core.aggregation.grouping.CombinedGrouping) LeanNode(com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode) Tree(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Tree) Map(java.util.Map) Node(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Node) Collectors.groupingBy(java.util.stream.Collectors.groupingBy) AggregationProfile(com.insightfullogic.honest_profiler.core.aggregation.AggregationProfile) LeanProfile(com.insightfullogic.honest_profiler.core.profiles.lean.LeanProfile) Collector.of(java.util.stream.Collector.of) LeanProfile(com.insightfullogic.honest_profiler.core.profiles.lean.LeanProfile) LeanNode(com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode) Node(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Node) Tree(com.insightfullogic.honest_profiler.core.aggregation.result.straight.Tree)

Example 4 with LeanNode

use of com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode in project honest-profiler by jvm-profiling-tools.

the class LeanProfileGenerator method assertProfileContainsStack.

public void assertProfileContainsStack(long threadId, StackFrame... stack) {
    LeanNode current = currentProfile.getThreads().get(threadId);
    assertNotNull("Thread not found in Profile", current);
    int level = 0;
    List<StackFrame> frames = asList(stack);
    reverse(frames);
    for (StackFrame frame : frames) {
        level++;
        Optional<LeanNode> child = current.getChildren().stream().filter(node -> node.getFrame().getMethodId() == frame.getMethodId() && node.getFrame().getLineNr() == frame.getLineNumber() && node.getFrame().getBci() == frame.getBci()).findFirst();
        assertTrue("Descendant at level " + level + " not found", child.isPresent());
        current = child.get();
        assertNodeRepresentsFrame(current, frame);
    }
}
Also used : LeanNode(com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode) Collections.reverse(java.util.Collections.reverse) Assert.assertNotNull(org.junit.Assert.assertNotNull) NumericInfo(com.insightfullogic.honest_profiler.core.profiles.lean.info.NumericInfo) ThreadInfo(com.insightfullogic.honest_profiler.core.profiles.lean.info.ThreadInfo) Assert.assertTrue(org.junit.Assert.assertTrue) StackFrame(com.insightfullogic.honest_profiler.core.parser.StackFrame) Method(com.insightfullogic.honest_profiler.core.parser.Method) LeanLogCollectorDriver(com.insightfullogic.honest_profiler.framework.LeanLogCollectorDriver) MethodInfo(com.insightfullogic.honest_profiler.core.profiles.lean.info.MethodInfo) List(java.util.List) LeanNode(com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode) Assert.assertNull(org.junit.Assert.assertNull) FrameInfo(com.insightfullogic.honest_profiler.core.profiles.lean.info.FrameInfo) Arrays.asList(java.util.Arrays.asList) ThreadMeta(com.insightfullogic.honest_profiler.core.parser.ThreadMeta) Optional(java.util.Optional) BigInteger(java.math.BigInteger) LeanProfile(com.insightfullogic.honest_profiler.core.profiles.lean.LeanProfile) Assert.assertEquals(org.junit.Assert.assertEquals) StackFrame(com.insightfullogic.honest_profiler.core.parser.StackFrame)

Example 5 with LeanNode

use of com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode in project honest-profiler by jvm-profiling-tools.

the class LeanProfileGenerator method getNode.

public LeanNode getNode(long threadId, StackFrame... stack) {
    LeanNode current = currentProfile.getThreads().get(threadId);
    List<StackFrame> frames = asList(stack);
    reverse(frames);
    for (StackFrame frame : frames) {
        Optional<LeanNode> child = current.getChildren().stream().filter(node -> node.getFrame().getMethodId() == frame.getMethodId()).findFirst();
        current = child.get();
    }
    return current;
}
Also used : LeanNode(com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode) Collections.reverse(java.util.Collections.reverse) Assert.assertNotNull(org.junit.Assert.assertNotNull) NumericInfo(com.insightfullogic.honest_profiler.core.profiles.lean.info.NumericInfo) ThreadInfo(com.insightfullogic.honest_profiler.core.profiles.lean.info.ThreadInfo) Assert.assertTrue(org.junit.Assert.assertTrue) StackFrame(com.insightfullogic.honest_profiler.core.parser.StackFrame) Method(com.insightfullogic.honest_profiler.core.parser.Method) LeanLogCollectorDriver(com.insightfullogic.honest_profiler.framework.LeanLogCollectorDriver) MethodInfo(com.insightfullogic.honest_profiler.core.profiles.lean.info.MethodInfo) List(java.util.List) LeanNode(com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode) Assert.assertNull(org.junit.Assert.assertNull) FrameInfo(com.insightfullogic.honest_profiler.core.profiles.lean.info.FrameInfo) Arrays.asList(java.util.Arrays.asList) ThreadMeta(com.insightfullogic.honest_profiler.core.parser.ThreadMeta) Optional(java.util.Optional) BigInteger(java.math.BigInteger) LeanProfile(com.insightfullogic.honest_profiler.core.profiles.lean.LeanProfile) Assert.assertEquals(org.junit.Assert.assertEquals) StackFrame(com.insightfullogic.honest_profiler.core.parser.StackFrame)

Aggregations

LeanNode (com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode)7 AggregationProfile (com.insightfullogic.honest_profiler.core.aggregation.AggregationProfile)4 CombinedGrouping (com.insightfullogic.honest_profiler.core.aggregation.grouping.CombinedGrouping)4 LeanProfile (com.insightfullogic.honest_profiler.core.profiles.lean.LeanProfile)4 Map (java.util.Map)4 Collector.of (java.util.stream.Collector.of)4 Collectors.groupingBy (java.util.stream.Collectors.groupingBy)4 Entry (com.insightfullogic.honest_profiler.core.aggregation.result.straight.Entry)3 Node (com.insightfullogic.honest_profiler.core.aggregation.result.straight.Node)3 Tree (com.insightfullogic.honest_profiler.core.aggregation.result.straight.Tree)3 Aggregation (com.insightfullogic.honest_profiler.core.aggregation.result.Aggregation)2 Keyed (com.insightfullogic.honest_profiler.core.aggregation.result.Keyed)2 Method (com.insightfullogic.honest_profiler.core.parser.Method)2 StackFrame (com.insightfullogic.honest_profiler.core.parser.StackFrame)2 ThreadMeta (com.insightfullogic.honest_profiler.core.parser.ThreadMeta)2 FrameInfo (com.insightfullogic.honest_profiler.core.profiles.lean.info.FrameInfo)2 MethodInfo (com.insightfullogic.honest_profiler.core.profiles.lean.info.MethodInfo)2 NumericInfo (com.insightfullogic.honest_profiler.core.profiles.lean.info.NumericInfo)2 ThreadInfo (com.insightfullogic.honest_profiler.core.profiles.lean.info.ThreadInfo)2 LeanLogCollectorDriver (com.insightfullogic.honest_profiler.framework.LeanLogCollectorDriver)2