use of com.insightfullogic.honest_profiler.core.parser.Method in project honest-profiler by jvm-profiling-tools.
the class FlameGraphCollector method addCurrentTrace.
private void addCurrentTrace() {
if (currentMethodIds == null || currentMethodIds.size() == 0)
return;
if (lastMethodIds.equals(currentMethodIds)) {
trace.incrementWeight();
return;
}
List<Method> methods = currentMethodIds.stream().map(method -> this.methods.getOrDefault(method, unknownMethod)).collect(toList());
trace = new FlameTrace(methods, 1);
flameGraph.onNewTrace(trace);
}
use of com.insightfullogic.honest_profiler.core.parser.Method in project honest-profiler by jvm-profiling-tools.
the class LogCollectorTest method logCollectorShouldCopeWithUnexpectedFrames.
@Test
public void logCollectorShouldCopeWithUnexpectedFrames() {
final Deque<Profile> found = new ArrayDeque<>();
final LogCollector collector = new LogCollector(found::add, true);
for (int i = 0; i < 10; i++) {
collector.handle(new Method(i, "a", "Bass", "c" + i));
}
assertTrue("methods don't cause profiles", found.isEmpty());
int threadId = 0;
collector.handle(new TraceStart(2, ++threadId, 1, 1));
assertTrue("nothing to profile still", found.isEmpty());
collector.handle(new StackFrame(LINE, 0));
collector.handle(new StackFrame(LINE, 1));
// ..and one unexpected frame
collector.handle(new StackFrame(LINE, 2));
// normal method afterwards
collector.handle(new TraceStart(2, ++threadId, 1, 1));
collector.handle(new StackFrame(LINE, 6));
collector.handle(new StackFrame(LINE, 7));
// and continuation
collector.handle(new TraceStart(20, ++threadId, 1, 1));
assertArrayEquals(new long[] { 2, 7 }, idOfLastMethodInEachThread(found.getLast()));
}
use of com.insightfullogic.honest_profiler.core.parser.Method in project honest-profiler by jvm-profiling-tools.
the class ConsoleLogDumpApplication method run.
public void run() {
final PrintStream err = error.stream();
if (!logLocation.exists() || !logLocation.canRead()) {
err.println("Unable to find log file at: " + logLocation);
return;
}
final PrintStream out = output.stream();
out.println("Printing text representation for: " + logLocation.getAbsolutePath());
Monitor.consumeFile(new FileLogSource(logLocation), new LogEventListener() {
int indent;
long traceidx;
long errCount;
Map<String, Counter> errHistogram = new HashMap<>();
Map<Long, BoundMethod> methodNames = new HashMap<>();
Map<Long, String> threadNames = new HashMap<>();
@Override
public void handle(Method method) {
BoundMethod boundMethod = new BoundMethod(method.getClassName(), method.getMethodReturnType(), method.getMethodName(), method.getMethodSignature());
out.printf("Method : %d -> %s %s.%s%s\n", method.getMethodId(), method.getMethodReturnType(), method.getClassName(), method.getMethodName(), method.getMethodSignature());
methodNames.put(method.getMethodId(), boundMethod);
}
@Override
public void handle(StackFrame stackFrame) {
indent--;
long methodId = stackFrame.getMethodId();
BoundMethod boundMethod = methodNames.get(methodId);
if (methodId == 0) {
errCount++;
// null method
out.print("StackFrame: ");
indent(out);
out.printf("%d @ %s (bci=%s)\n", methodId, stackFrame.getLineNumber(), stackFrame.getBci());
Counter counter = errHistogram.computeIfAbsent("Null jmethodId", k -> new Counter());
counter.inc();
} else if (methodId < 0) {
errCount++;
// bad sample dressed up as a frame
out.print("StackFrame: ");
indent(out);
out.printf("%s %s::%s%s \n", boundMethod.returnType, boundMethod.className, boundMethod.methodName, boundMethod.methodSignature);
Counter counter = errHistogram.computeIfAbsent(boundMethod.methodName, k -> new Counter());
counter.inc();
} else if (boundMethod == null) {
out.print("StackFrame: ");
indent(out);
out.printf("%d @ %s (bci=%s)\n", methodId, stackFrame.getLineNumber(), stackFrame.getBci());
} else {
out.print("StackFrame: ");
indent(out);
out.printf("%s %s::%s%s @ %s (bci=%s)\n", boundMethod.returnType, boundMethod.className, boundMethod.methodName, boundMethod.methodSignature, stackFrame.getLineNumber(), stackFrame.getBci());
}
}
private void indent(final PrintStream out) {
for (int i = 0; i < indent; i++) out.print(' ');
}
@Override
public void handle(TraceStart traceStart) {
int frames = traceStart.getNumberOfFrames();
long tid = traceStart.getThreadId();
String tidString = tid >= 0 ? ("tid=" + tid) : "tid=unknown";
String name = threadNames.get(tid);
if (name == null || "".equals(name)) {
name = "Unknown";
}
out.printf("TraceStart: [%d] %d.%d %s,%s,frames=%d\n", traceidx, traceStart.getTraceEpoch(), traceStart.getTraceEpochNano(), name, tidString, frames);
indent = frames;
traceidx++;
}
@Override
public void handle(ThreadMeta newThreadMeta) {
long tid = newThreadMeta.getThreadId();
String name = newThreadMeta.getThreadName();
out.printf("ThreadMeta: tid=%d,name=%s\n", tid, name);
threadNames.put(tid, name);
}
@Override
public void endOfLog() {
out.printf("Processed %d traces, %d faulty\n", traceidx, errCount);
for (Map.Entry<String, Counter> e : errHistogram.entrySet()) {
final String errCode = e.getKey();
final int errCodeCount = e.getValue().i;
out.printf("%-20s: %d \n", errCode, errCodeCount);
}
}
});
}
use of com.insightfullogic.honest_profiler.core.parser.Method in project honest-profiler by jvm-profiling-tools.
the class CallCountAggregator method toFlatProfileEntry.
private FlatProfileEntry toFlatProfileEntry(final T key, final CallCounts callCounts, final int traceCount) {
int totalCount = callCounts.getTimeAppeared();
int selfCount = callCounts.getTimeInvokingThis();
Method method;
final Long methodId = getMethodId.apply(key);
method = methodByMethodId.get(methodId);
if (method == null) {
method = new Method(methodId, "UNKNOWN", "UNKNOWN", String.valueOf(methodId));
}
Frame frame;
if (key instanceof StackFrame) {
frame = new FullFrame(method, (StackFrame) key);
} else {
frame = method;
}
return new FlatProfileEntry(frame, totalCount, selfCount, traceCount);
}
use of com.insightfullogic.honest_profiler.core.parser.Method in project honest-profiler by jvm-profiling-tools.
the class NodeCollector method normaliseBy.
private ProfileNode normaliseBy(int parentVisits, LongFunction<Method> nameRegistry) {
Method method = nameRegistry.apply(methodId);
List<ProfileNode> children = childrenByMethodId.values().stream().map(child -> child.normaliseBy(parentVisits, nameRegistry)).sorted(bySelfTimeShare).collect(toList());
return new ProfileNode(method, visits, parentVisits, children);
}
Aggregations