diff --git a/perfgenie/src/main/java/server/PerfGenieService.java b/perfgenie/src/main/java/server/PerfGenieService.java index 23c44bd..f7fb419 100644 --- a/perfgenie/src/main/java/server/PerfGenieService.java +++ b/perfgenie/src/main/java/server/PerfGenieService.java @@ -230,16 +230,16 @@ public String getCustomEvents(final String tenant, long start, long end, final M static double threshold = 0.01; private final Map> surfaceData = new ConcurrentHashMap>(); private final List uniquePaths = new ArrayList(); - private final Map uniquePathsSize = new HashMap<>(); + private final Map uniquePathsSize = new HashMap<>(); private boolean useTimeSeries = true; - private int totalSize = 0; + private long totalSize = 0; private Map chunkSurfaceData = new ConcurrentHashMap<>(); class SurfaceDataResponse { private List cpuSamplesList; private List chunkSamplesTotalList; private List pathList = new ArrayList(); - private List pathSizeList = new ArrayList(); + private List pathSizeList = new ArrayList(); private Map> data = new HashMap<>(); SurfaceDataResponse(List cpuSamplesList, List chunkSamplesTotalList, Map> surfaceData) { @@ -298,11 +298,11 @@ public void setPathList(List pathList) { this.pathList = pathList; } - public List getPathSizeList() { + public List getPathSizeList() { return pathSizeList; } - public void setPathSizeList(List pathSizeList) { + public void setPathSizeList(List pathSizeList) { this.pathSizeList = pathSizeList; } diff --git a/perfgenie/src/main/resources/config.properties b/perfgenie/src/main/resources/config.properties index b36e497..9390549 100644 --- a/perfgenie/src/main/resources/config.properties +++ b/perfgenie/src/main/resources/config.properties @@ -1,5 +1,5 @@ customevents=LogContext;MqFrm;CPUEvent;MemoryEvent -profiles=ExecutionS;Socket +profiles=ExecutionS;Socket;NewTLAB;OutsideTLAB jfrdir=/tmp/jfrs tenant=dev diff --git a/perfgenie/src/main/resources/templates/filter-panel.ftl b/perfgenie/src/main/resources/templates/filter-panel.ftl index 15f704e..62262fd 100644 --- a/perfgenie/src/main/resources/templates/filter-panel.ftl +++ b/perfgenie/src/main/resources/templates/filter-panel.ftl @@ -200,6 +200,16 @@ .cct-customized-scrollbar::-webkit-scrollbar-thumb { background: #6D6F70; } + + table.alternate_color tr:nth-of-type(even) { + background-color:#F9F9F9; + } + + table.alternate_color th, td { + border: 1px solid #E8EAEC; + border-collapse: collapse; + } +
diff --git a/utils/src/main/java/perfgenie/utils/CustomJfrParser.java b/utils/src/main/java/perfgenie/utils/CustomJfrParser.java index 2465c92..805e98d 100644 --- a/utils/src/main/java/perfgenie/utils/CustomJfrParser.java +++ b/utils/src/main/java/perfgenie/utils/CustomJfrParser.java @@ -10,6 +10,7 @@ import com.google.common.base.Stopwatch; import org.openjdk.jmc.common.IMCStackTrace; import org.openjdk.jmc.common.IMCThread; +import org.openjdk.jmc.common.IMCType; import org.openjdk.jmc.common.item.*; import org.openjdk.jmc.common.unit.IQuantity; import org.openjdk.jmc.common.unit.ITypedQuantity; @@ -106,7 +107,7 @@ public EventHandler doParseStream(final EventHandler handler, final ByteArrayInp processJfrEvents(handler, events); logger.info("doParseStream parse time sec: {}", timer.stop().elapsed(TimeUnit.SECONDS)); return handler; - } catch (CouldNotLoadRecordingException e) { + } catch (Exception e) { throw new RuntimeException(e); } } @@ -120,6 +121,8 @@ void processJfrEvents(final EventHandler handler, final IItemCollection events){ Map k = iterable_element.getType().getAccessorKeys(); int tid = -1; long epoc = -1; + int weight = 1; + String classStr = null; handler.initializeProfile(iterable_element.getType().getIdentifier()); handler.initializePid(iterable_element.getType().getIdentifier()); System.out.println(iterable_element.getType().getIdentifier()); @@ -128,6 +131,13 @@ void processJfrEvents(final EventHandler handler, final IItemCollection events){ for (final IItem item : iterable_element) { final IMCStackTrace stackTrace = accessor.getMember(item); for (Object key : k.keySet()) { + if(((Attribute) key).getName().equals("Allocation Size")){ + ITypedQuantity v = (ITypedQuantity) iterable_element.getType().getAccessor((IAccessorKey) key).getMember(item); + weight = (int)v.longValue(); + } + if (((Attribute) key).getContentType().getIdentifier().equals("class")) { + classStr=((IMCType)iterable_element.getType().getAccessor((IAccessorKey) key).getMember(item)).getTypeName(); + } if (((Attribute) key).getContentType().getIdentifier().equals("thread")) { final IMCThread thread = (IMCThread) iterable_element.getType().getAccessor((IAccessorKey) key).getMember(item); tid = thread.getThreadId().intValue(); @@ -136,7 +146,13 @@ void processJfrEvents(final EventHandler handler, final IItemCollection events){ epoc = v.longValue(); } } - handler.processEvent(sb, stackTrace, iterable_element.getType().getIdentifier(), tid, epoc); + try { + if(stackTrace != null) { + handler.processEvent(sb, stackTrace, iterable_element.getType().getIdentifier(), tid, epoc, weight, classStr); + } + }catch (Exception e){ + throw e; + } } } else if (config.isCustomEvent(iterable_element.getType().getIdentifier())) { List l = iterable_element.getType().getAttributes(); diff --git a/utils/src/main/java/perfgenie/utils/EventHandler.java b/utils/src/main/java/perfgenie/utils/EventHandler.java index 227540d..6d4c2d9 100644 --- a/utils/src/main/java/perfgenie/utils/EventHandler.java +++ b/utils/src/main/java/perfgenie/utils/EventHandler.java @@ -34,7 +34,7 @@ public class EventHandler { private Map>> records = new ConcurrentHashMap<>(); private Map> header = new ConcurrentHashMap<>(); - private final Map sampleCount = new ConcurrentHashMap<>(); + //private final Map sampleCount = new ConcurrentHashMap<>(); //aggregations private StackFrame calltreeAggregated = new StackFrame(ROOT.hashCode()); @@ -42,7 +42,7 @@ public class EventHandler { private Map> pidDataAggregated = new ConcurrentHashMap>(); private Map profiles = new ConcurrentHashMap<>(); - private Map eventCounts = new ConcurrentHashMap<>(); + private Map eventCounts = new ConcurrentHashMap<>(); private int eventCount = 0; private int threshold = 1; @@ -85,7 +85,7 @@ public void reset() { threshold = 1; startEpoch = 0L; endEpoch = 0L; - sampleCount.clear(); + //sampleCount.clear(); clearProfile(); frames.clear(); for (Map.Entry>> entry : pidDatas.entrySet()) { @@ -400,15 +400,19 @@ public boolean processJstackEvent(long time, final String jstack) { } } - private int getHash(final StringBuilder stringBuilder, final IMCStackTrace stackTrace) { - int hash = 0; //toddo, check if it causes any collisions due to int instead of long - for (int i = 0; i < stackTrace.getFrames().size(); i++) { - hash = CustomHash(hash, getFrameNm(stringBuilder, stackTrace.getFrames().get(i))); + private int getHash(int hash, final StringBuilder stringBuilder, final IMCStackTrace stackTrace) { + try { +// int hash = 0; //toddo, check if it causes any collisions due to int instead of long + for (int i = 0; i < stackTrace.getFrames().size(); i++) { + hash = CustomHash(hash, getFrameNm(stringBuilder, stackTrace.getFrames().get(i))); + } + return hash; + }catch (Exception e){ + throw e; } - return hash; } - public void processEvent(final StringBuilder sb, final IMCStackTrace stackTrace, String type, int tid, long time) { + public void processEvent(final StringBuilder sb, final IMCStackTrace stackTrace, String type, int tid, long time, long weight, String cls) { if (startEpoch == 0L || time < startEpoch) { setStartEpoch(time); } @@ -416,37 +420,58 @@ public void processEvent(final StringBuilder sb, final IMCStackTrace stackTrace, setEndEpoch(time); } StackFrame frame = profiles.get(type); - final int hash = getHash(sb, stackTrace); - int sz = 1; + final int hash = getHash(cls == null ? 0 : cls.hashCode(), sb, stackTrace); + + long sz = weight; if (!pidDatas.get(type).containsKey(tid)) { pidDatas.get(type).put(tid, new ArrayList()); } pidDatas.get(type).get(tid).add(new StackidTime(hash, time)); - if (sampleCount.containsKey(hash)) { - sz = sampleCount.get(hash); - frame = profiles.get(type); - } + //if (sampleCount.containsKey(hash)) { + // sz = sampleCount.get(hash); + // frame = profiles.get(type); + //} + if (!eventCounts.containsKey(type)) { - eventCounts.put(type, 1); + eventCounts.put(type, weight); } else { - eventCounts.put(type, eventCounts.get(type) + 1); + eventCounts.put(type, eventCounts.get(type) + weight); } if (sz >= 0) { frame.sz += sz; - int sf = 0; + long sf = 0; final int count = stackTrace.getFrames().size(); - for (int i = 0; i < count; i++) { - final int fN = getFrameNm(sb, stackTrace.getFrames().get(i)); + if(cls == null) { + for (int i = 0; i < count; i++) { + final int fN = getFrameNm(sb, stackTrace.getFrames().get(i)); - if (i == count - 1) { - sf = sz; + if (i == count - 1) { + sf = sz; + } + if (i == 0 || i == count - 1) { + frame = frame.addFrame(fN, sz, sf, true, hash); + } else { + frame = frame.addFrame(fN, sz, sf, false, 0); + } } - if (i == 0 || i == count - 1) { - frame = frame.addFrame(fN, sz, sf, true, hash); - } else { - frame = frame.addFrame(fN, sz, sf, false, 0); + }else{ + frame = frame.addFrame(cls.hashCode(), sz, sf, true, hash); + if(!frames.containsKey(cls.hashCode())) { + frames.put(cls.hashCode(), cls); + } + for (int i = 0; i < count; i++) { + final int fN = getFrameNm(sb, stackTrace.getFrames().get(i)); + + if (i == count - 1) { + sf = sz; + } + if (i == count - 1) { + frame = frame.addFrame(fN, sz, sf, true, hash); + } else { + frame = frame.addFrame(fN, sz, sf, false, 0); + } } } } @@ -462,7 +487,7 @@ public void processEvent(final int tid, final long time, final String ctx, final int sz = 1; if (!eventCounts.containsKey(type)) { - eventCounts.put(type, 1); + eventCounts.put(type, 1L); } else { eventCounts.put(type, eventCounts.get(type) + 1); } @@ -845,22 +870,22 @@ public void setNm(int nm) { this.nm = nm; } - public void setSz(int sz) { + public void setSz(long sz) { this.sz = sz; } - public void setSf(int sf) { + public void setSf(long sf) { this.sf = sf; } int nm; - int sz = 0; + long sz = 0; - public int getSf() { + public long getSf() { return sf; } - int sf = 0; + long sf = 0; List ch = null; transient Map chMap = new HashMap<>(1); transient Map sm = new HashMap<>(1);//to tell a stack start and end in tree @@ -879,7 +904,7 @@ public void addFrame(StackFrame frame) { ch.add(frame); } - public StackFrame addFrame(final int frameNm, final int sz, final int sf, final boolean start, final int hash) { + public StackFrame addFrame(final int frameNm, final long sz, final long sf, final boolean start, final int hash) { if (ch == null) { ch = new ArrayList<>(); } @@ -897,7 +922,7 @@ public StackFrame addFrame(final int frameNm, final int sz, final int sf, final return frame; } - public int getSz() { + public long getSz() { return sz; } @@ -1528,16 +1553,16 @@ enum EventType { static double plotThreshold = 0.01; private final Map> surfaceData = new ConcurrentHashMap>(); private final List uniquePaths = new ArrayList(); - private final Map uniquePathsSize = new HashMap<>(); + private final Map uniquePathsSize = new HashMap<>(); private boolean useTimeSeries = true; - private int totalSize = 0; + private long totalSize = 0; private Map chunkSurfaceData = new ConcurrentHashMap<>(); class SurfaceDataResponse { private List cpuSamplesList; private List chunkSamplesTotalList; private List pathList = new ArrayList(); - private List pathSizeList = new ArrayList(); + private List pathSizeList = new ArrayList(); private Map> data = new HashMap<>(); SurfaceDataResponse(List cpuSamplesList, List chunkSamplesTotalList, Map> surfaceData) { @@ -1596,11 +1621,11 @@ public void setPathList(List pathList) { this.pathList = pathList; } - public List getPathSizeList() { + public List getPathSizeList() { return pathSizeList; } - public void setPathSizeList(List pathSizeList) { + public void setPathSizeList(List pathSizeList) { this.pathSizeList = pathSizeList; }