From 323892b48ea5d4177242ad1187879dfad4e01aa6 Mon Sep 17 00:00:00 2001 From: chewiebug Date: Tue, 2 Jan 2018 15:40:37 +0100 Subject: [PATCH 1/4] #155 refactor DataReaderUnifiedJvmLogging to prepare reading heap details if gc,heap information is present --- .../gcviewer/imp/AbstractDataReaderSun.java | 4 +- .../perf/gcviewer/imp/DataReaderTools.java | 11 +- .../imp/DataReaderUnifiedJvmLogging.java | 218 +++++++++++------- .../perf/gcviewer/model/AbstractGCEvent.java | 17 +- .../perf/gcviewer/UnittestHelper.java | 76 ++++-- .../impl/GCModelSeriesLoaderImplTest.java | 25 +- .../ctrl/impl/GcSeriesLoaderTest.java | 34 +-- .../gcviewer/ctrl/impl/TestGCModelLoader.java | 11 +- .../impl/TestGCModelLoaderController.java | 39 ++-- .../gcviewer/imp/TestDataReaderFacade.java | 56 ++--- .../gcviewer/imp/TestDataReaderFactory.java | 12 +- .../gcviewer/imp/TestDataReaderHPUX1_2.java | 8 +- .../gcviewer/imp/TestDataReaderHPUX1_4_1.java | 8 +- .../gcviewer/imp/TestDataReaderIBM1_2_2.java | 8 +- .../gcviewer/imp/TestDataReaderIBM1_3_1.java | 8 +- .../gcviewer/imp/TestDataReaderIBM1_4_2.java | 8 +- .../gcviewer/imp/TestDataReaderIBMJ9_5_0.java | 10 +- .../imp/TestDataReaderIBM_J9_R26.java | 3 +- .../imp/TestDataReaderIBM_J9_R27.java | 3 +- .../imp/TestDataReaderIBM_J9_R28.java | 3 +- .../imp/TestDataReaderIBMi5OS1_4_2.java | 8 +- .../imp/TestDataReaderJRockit1_4_2.java | 8 +- .../imp/TestDataReaderJRockit1_5_0.java | 8 +- .../imp/TestDataReaderJRockit1_6_0.java | 8 +- .../imp/TestDataReaderSun1_3_1_19.java | 8 +- .../gcviewer/imp/TestDataReaderSun1_4_0.java | 15 +- .../gcviewer/imp/TestDataReaderSun1_5_0.java | 8 +- .../gcviewer/imp/TestDataReaderSun1_6_0.java | 23 +- .../imp/TestDataReaderSun1_6_0G1.java | 23 +- .../gcviewer/imp/TestDataReaderSun1_7_0.java | 11 +- .../imp/TestDataReaderSun1_7_0G1.java | 25 +- .../gcviewer/imp/TestDataReaderSun1_8_0.java | 8 +- .../imp/TestDataReaderSun1_8_0G1.java | 10 +- .../gcviewer/imp/TestDataReaderUJLCMS.java | 25 +- .../gcviewer/imp/TestDataReaderUJLG1.java | 25 +- .../imp/TestDataReaderUJLParallel.java | 25 +- .../gcviewer/imp/TestDataReaderUJLSerial.java | 23 +- .../imp/TestDataReaderUJLShenandoah.java | 24 +- .../gcviewer/model/GcResourceSeriesTest.java | 27 +-- .../perf/gcviewer/model/TestGCModel.java | 27 +-- .../util/TestHttpUrlConnectionHelper.java | 5 +- .../sample-ujl-cms-gc-defaults.txt | 2 +- 42 files changed, 484 insertions(+), 424 deletions(-) diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java index 37308549..67416505 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/AbstractDataReaderSun.java @@ -301,8 +301,8 @@ protected ExtendedType parseType(String line, ParseInformation pos) throws Parse } - protected ExtendedType extractTypeFromParsedString(String typeName) throws UnknownGcTypeException { - return getDataReaderTools().extractTypeFromParsedString(typeName); + protected ExtendedType extractTypeFromParsedString(String typeName) { + return getDataReaderTools().parseTypeWithCause(typeName); } /** diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderTools.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderTools.java index 7b98a8b4..29f2c50b 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderTools.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderTools.java @@ -60,7 +60,7 @@ else if ('G' == memUnit) { * @throws UnknownGcTypeException If typeString can't be converted to an ExtendedType */ public ExtendedType parseType(String typeString) throws UnknownGcTypeException { - ExtendedType gcType = extractTypeFromParsedString(typeString.trim()); + ExtendedType gcType = parseTypeWithCause(typeString.trim()); if (gcType == null) { throw new UnknownGcTypeException(typeString); } @@ -68,7 +68,14 @@ public ExtendedType parseType(String typeString) throws UnknownGcTypeException { return gcType; } - public ExtendedType extractTypeFromParsedString(String typeName) { + /** + * Same as @{link {@link #parseType(String)}}, but returns null instead of exception, if no type could + * be found. + * + * @param typeName string representation of the gc event + * @return ExtendedType representing typeString, or null if none could be found + */ + public ExtendedType parseTypeWithCause(String typeName) { typeName = typeName.trim(); ExtendedType extendedType = null; String lookupTypeName = typeName.endsWith("--") diff --git a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java index 2d042b0e..b05fafbb 100644 --- a/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java +++ b/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderUnifiedJvmLogging.java @@ -13,10 +13,13 @@ import java.util.stream.Stream; import com.tagtraum.perf.gcviewer.model.AbstractGCEvent; +import com.tagtraum.perf.gcviewer.model.AbstractGCEvent.Concurrency; +import com.tagtraum.perf.gcviewer.model.AbstractGCEvent.GcPattern; import com.tagtraum.perf.gcviewer.model.ConcurrentGCEvent; import com.tagtraum.perf.gcviewer.model.GCEvent; import com.tagtraum.perf.gcviewer.model.GCModel; import com.tagtraum.perf.gcviewer.model.GCResource; +import com.tagtraum.perf.gcviewer.util.NumberParser; /** * DataReaderUnifiedJvmLogging can parse all gc events of unified jvm logs with default decorations. @@ -38,49 +41,52 @@ */ public class DataReaderUnifiedJvmLogging extends AbstractDataReader { + // matches the whole line and extracts decorators from it (decorators always appear between [] and are independent of the gc algorithm being logged) // Input: [0.693s][info][gc ] GC(0) Pause Init Mark 1.070ms - // Group 1: 0.693 - // Group 2: Pause Init Mark - // Group 3: 1.070 -> optional - // Regex: ^\[([^s\]]*)[^\-]*\)[ ]([^\-]*)[ ]([0-9]+[.,][0-9]+) - private static final Pattern PATTERN_WITHOUT_HEAP = Pattern.compile( - "^\\[([^s\\]]*)[^\\-]*\\)[ ]([^\\d]*)(([0-9]+[.,][0-9]+)|$)"); - - // Input: [13.522s][info][gc ] GC(708) Concurrent evacuation 4848M->4855M(4998M) 2.872ms - // Group 1: 13.522 - // Group 2: Concurrent evacuation - // Group 3: 4848M->4855M(4998M) - // Group 4: 2.872 - // Regex: ^\[([^s\]]*).*\)[ ](.*)[ ]([0-9]+[BKMG]\-\>[0-9]+[BKMG]\([0-9]+[BKMG]\)) ([0-9]+[.,][0-9]+) - private static final Pattern PATTERN_WITH_HEAP = Pattern.compile( - "^\\[([^s\\]]*).*\\)[ ](.*)[ ]([0-9]+[BKMG]\\-\\>[0-9]+[BKMG]\\([0-9]+[BKMG]\\)) ([0-9]+[.,][0-9]+)"); - - // Input: 4848M->4855M(4998M) + // Group 1 / time: (optional group, no full timestamp present) + // Group 2 / uptime: 0.693 (optional group, present in this example) + // Group 3 / level: info + // Group 4 / tags: gc + // Group 5 / gcnumber: 0 + // Group 6 / tail: Pause Init Mark 1.070ms + // Regex: ^(?:\[(?