From 0b4d83b0c323eded16fcb97127e0d97773d5465b Mon Sep 17 00:00:00 2001 From: ZeroNeT_T Date: Mon, 13 Nov 2017 18:02:46 +0500 Subject: [PATCH 1/5] Added interfaces for time and data parsing --- .../java/ru/naumen/sd40/log/parser/App.java | 47 ++----------------- .../ru/naumen/sd40/log/parser/GCParser.java | 37 +++++++++++++-- .../naumen/sd40/log/parser/IDataParser.java | 7 +++ .../naumen/sd40/log/parser/ITimeParser.java | 7 +++ .../ru/naumen/sd40/log/parser/TimeParser.java | 38 +++++++++++++-- .../ru/naumen/sd40/log/parser/TopParser.java | 7 +-- 6 files changed, 86 insertions(+), 57 deletions(-) create mode 100644 src/main/java/ru/naumen/sd40/log/parser/IDataParser.java create mode 100644 src/main/java/ru/naumen/sd40/log/parser/ITimeParser.java diff --git a/src/main/java/ru/naumen/sd40/log/parser/App.java b/src/main/java/ru/naumen/sd40/log/parser/App.java index cbb518f..ff1030e 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/App.java +++ b/src/main/java/ru/naumen/sd40/log/parser/App.java @@ -10,7 +10,6 @@ import org.springframework.web.multipart.MultipartFile; import ru.naumen.perfhouse.influx.InfluxDAO; -import ru.naumen.sd40.log.parser.GCParser.GCTimeParser; /** * Created by doki on 22.10.16. @@ -36,58 +35,22 @@ public static void parse(MultipartFile logs, String nameInfluxDB, String timeZon BatchPoints points = influxDAO.startBatchPoints(influxDb); HashMap data = new HashMap<>(); - TimeParser timeParser = new TimeParser(timeZone); - GCTimeParser gcTime = new GCTimeParser(timeZone); - switch (parseMode) { case "sdng": //Parse sdng - try (BufferedReader br = new BufferedReader(new InputStreamReader(logs.getInputStream()))) - { - String line; - while ((line = br.readLine()) != null) - { - long time = timeParser.parseLine(line); - - if (time == 0) - { - continue; - } - - int min5 = 5 * 60 * 1000; - long count = time / min5; - long key = count * min5; - - data.computeIfAbsent(key, k -> new DataSet()).parseLine(line); - } - } + GCParser gcParser = new GCParser(); + gcParser.parse(data, timeZone, logs); break; case "gc": //Parse gc log - try (BufferedReader br = new BufferedReader(new InputStreamReader(logs.getInputStream()))) - { - String line; - while ((line = br.readLine()) != null) - { - long time = gcTime.parseTime(line); - - if (time == 0) - { - continue; - } - - int min5 = 5 * 60 * 1000; - long count = time / min5; - long key = count * min5; - data.computeIfAbsent(key, k -> new DataSet()).parseGcLine(line); - } - } + TimeParser timeParser = new TimeParser(); + timeParser.parse(data, timeZone, logs); break; case "top": + //Parse top TopParser topParser = new TopParser(logs, data); topParser.configureTimeZone(timeZone); - //Parse top topParser.parse(); break; default: diff --git a/src/main/java/ru/naumen/sd40/log/parser/GCParser.java b/src/main/java/ru/naumen/sd40/log/parser/GCParser.java index 6b80531..52c95e3 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/GCParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/GCParser.java @@ -3,20 +3,23 @@ import static ru.naumen.sd40.log.parser.NumberUtils.getSafeDouble; import static ru.naumen.sd40.log.parser.NumberUtils.roundToTwoPlaces; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.HashMap; import java.util.Locale; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; +import org.springframework.web.multipart.MultipartFile; -public class GCParser -{ - public final static class GCTimeParser - { +public class GCParser{ + public final static class GCTimeParser implements ITimeParser{ private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", new Locale("ru", "RU")); @@ -32,7 +35,7 @@ public GCTimeParser(String timeZone) { DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(timeZone)); } - + public long parseTime(String line) throws ParseException { Matcher matcher = PATTERN.matcher(line); @@ -77,4 +80,28 @@ public void parseLine(String line) ds.addValue(Double.parseDouble(matcher.group(1).trim().replace(',', '.'))); } } + + public void parse(HashMap data, String timeZone, MultipartFile logs) + throws ParseException, IOException { + GCTimeParser gcTime = new GCTimeParser(timeZone); + try (BufferedReader br = new BufferedReader(new InputStreamReader(logs.getInputStream()))) + { + String line; + while ((line = br.readLine()) != null) + { + long time = gcTime.parseTime(line); + + if (time == 0) + { + continue; + } + + int min5 = 5 * 60 * 1000; + long count = time / min5; + long key = count * min5; + + data.computeIfAbsent(key, k -> new DataSet()).parseGcLine(line); + } + } + } } diff --git a/src/main/java/ru/naumen/sd40/log/parser/IDataParser.java b/src/main/java/ru/naumen/sd40/log/parser/IDataParser.java new file mode 100644 index 0000000..790ea42 --- /dev/null +++ b/src/main/java/ru/naumen/sd40/log/parser/IDataParser.java @@ -0,0 +1,7 @@ +package ru.naumen.sd40.log.parser; + +import java.text.ParseException; + +public interface IDataParser { + public void parseLine(String line) throws ParseException; +} diff --git a/src/main/java/ru/naumen/sd40/log/parser/ITimeParser.java b/src/main/java/ru/naumen/sd40/log/parser/ITimeParser.java new file mode 100644 index 0000000..a3b8fd0 --- /dev/null +++ b/src/main/java/ru/naumen/sd40/log/parser/ITimeParser.java @@ -0,0 +1,7 @@ +package ru.naumen.sd40.log.parser; + +import java.text.ParseException; + +public interface ITimeParser { + public long parseTime(String line) throws ParseException; +} diff --git a/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java b/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java index adbd9d0..f5ad119 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java @@ -1,18 +1,23 @@ package ru.naumen.sd40.log.parser; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.HashMap; import java.util.Locale; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.springframework.web.multipart.MultipartFile; + /** * Created by doki on 22.10.16. */ -public class TimeParser -{ +public class TimeParser implements ITimeParser{ private static final Pattern TIME_PATTERN = Pattern .compile("^\\d+ \\[.*?\\] \\((\\d{2} .{3} \\d{4} \\d{2}:\\d{2}:\\d{2},\\d{3})\\)"); private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd MMM yyyy HH:mm:ss,SSS", @@ -27,9 +32,32 @@ public TimeParser(String zoneId) { DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(zoneId)); } + + public void parse(HashMap data, String timeZone, MultipartFile logs) + throws IOException, ParseException { + TimeParser timeParser = new TimeParser(timeZone); + try (BufferedReader br = new BufferedReader(new InputStreamReader(logs.getInputStream()))) + { + String line; + while ((line = br.readLine()) != null) + { + long time = timeParser.parseTime(line); - public long parseLine(String line) throws ParseException - { + if (time == 0) + { + continue; + } + + int min5 = 5 * 60 * 1000; + long count = time / min5; + long key = count * min5; + + data.computeIfAbsent(key, k -> new DataSet()).parseLine(line); + } + } + } + + public long parseTime(String line) throws ParseException { Matcher matcher = TIME_PATTERN.matcher(line); if (matcher.find()) @@ -39,5 +67,5 @@ public long parseLine(String line) throws ParseException return recDate.getTime(); } return 0L; - } + } } diff --git a/src/main/java/ru/naumen/sd40/log/parser/TopParser.java b/src/main/java/ru/naumen/sd40/log/parser/TopParser.java index 1f6ae81..4ac2c32 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/TopParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/TopParser.java @@ -16,8 +16,7 @@ * @author dkolmogortsev * */ -public class TopParser -{ +public class TopParser implements IDataParser{ private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH:mm"); @@ -45,7 +44,6 @@ public TopParser(MultipartFile logs, Map existingDataSet) throws this.logs = logs; this.existing = existingDataSet; sdf.setTimeZone(TimeZone.getTimeZone("GMT")); - } public void configureTimeZone(String timeZone) @@ -65,8 +63,7 @@ public void parse() throws IOException, ParseException } } - private void parseLine(String line) throws IOException, ParseException - { + public void parseLine(String line) throws ParseException{ //check time long time = 0; Matcher matcher = timeRegex.matcher(line); From 780cdba1ced3b322fd48f7c1f368261011d182f5 Mon Sep 17 00:00:00 2001 From: ZeroNeT_T Date: Tue, 14 Nov 2017 15:07:03 +0500 Subject: [PATCH 2/5] Refactoring for parse method(put it in App) --- .../java/ru/naumen/sd40/log/parser/App.java | 46 ++++++++++++------- .../ru/naumen/sd40/log/parser/GCParser.java | 29 ------------ .../ru/naumen/sd40/log/parser/TimeParser.java | 30 ------------ .../ru/naumen/sd40/log/parser/TopParser.java | 1 - 4 files changed, 30 insertions(+), 76 deletions(-) diff --git a/src/main/java/ru/naumen/sd40/log/parser/App.java b/src/main/java/ru/naumen/sd40/log/parser/App.java index ff1030e..cfc139a 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/App.java +++ b/src/main/java/ru/naumen/sd40/log/parser/App.java @@ -35,17 +35,16 @@ public static void parse(MultipartFile logs, String nameInfluxDB, String timeZon BatchPoints points = influxDAO.startBatchPoints(influxDb); HashMap data = new HashMap<>(); - switch (parseMode) - { + switch (parseMode){ case "sdng": //Parse sdng GCParser gcParser = new GCParser(); - gcParser.parse(data, timeZone, logs); + parse(data, timeZone, logs, (ITimeParser)gcParser); break; case "gc": //Parse gc log TimeParser timeParser = new TimeParser(); - timeParser.parse(data, timeZone, logs); + parse(data, timeZone, logs, (ITimeParser)timeParser); break; case "top": //Parse top @@ -58,38 +57,53 @@ public static void parse(MultipartFile logs, String nameInfluxDB, String timeZon "Unknown parse mode! Availiable modes: sdng, gc, top. Requested mode: " + parseMode); } - if (traceCheck) - { + if (traceCheck){ System.out.print("Timestamp;Actions;Min;Mean;Stddev;50%%;95%%;99%%;99.9%%;Max;Errors\n"); } - data.forEach((k, set) -> - { + data.forEach((k, set) ->{ ActionDoneParser dones = set.getActionsDone(); dones.calculate(); ErrorParser erros = set.getErrors(); - if (traceCheck) - { + if (traceCheck){ System.out.print(String.format("%d;%d;%f;%f;%f;%f;%f;%f;%f;%f;%d\n", k, dones.getCount(), dones.getMin(), dones.getMean(), dones.getStddev(), dones.getPercent50(), dones.getPercent95(), dones.getPercent99(), dones.getPercent999(), dones.getMax(), erros.getErrorCount())); } - if (!dones.isNan()) - { + if (!dones.isNan()){ influxDAO.storeActionsFromLog(points, influxDb, k, dones, erros); } GCParser gc = set.getGc(); - if (!gc.isNan()) - { + if (!gc.isNan()){ influxDAO.storeGc(points, influxDb, k, gc); } TopData cpuData = set.cpuData(); - if (!cpuData.isNan()) - { + if (!cpuData.isNan()){ influxDAO.storeTop(points, influxDb, k, cpuData); } }); influxDAO.writeBatch(points); } + + private static void parse(HashMap data, String timeZone, + MultipartFile logs, ITimeParser parser) + throws ParseException, IOException { + try (BufferedReader br = new BufferedReader(new InputStreamReader(logs.getInputStream()))){ + String line; + while ((line = br.readLine()) != null){ + long time = parser.parseTime(line); + + if (time == 0){ + continue; + } + + int min5 = 5 * 60 * 1000; + long count = time / min5; + long key = count * min5; + + data.computeIfAbsent(key, k -> new DataSet()).parseLine(line); + } + } + } } diff --git a/src/main/java/ru/naumen/sd40/log/parser/GCParser.java b/src/main/java/ru/naumen/sd40/log/parser/GCParser.java index 52c95e3..5615644 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/GCParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/GCParser.java @@ -3,20 +3,15 @@ import static ru.naumen.sd40.log.parser.NumberUtils.getSafeDouble; import static ru.naumen.sd40.log.parser.NumberUtils.roundToTwoPlaces; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.HashMap; import java.util.Locale; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; -import org.springframework.web.multipart.MultipartFile; public class GCParser{ public final static class GCTimeParser implements ITimeParser{ @@ -80,28 +75,4 @@ public void parseLine(String line) ds.addValue(Double.parseDouble(matcher.group(1).trim().replace(',', '.'))); } } - - public void parse(HashMap data, String timeZone, MultipartFile logs) - throws ParseException, IOException { - GCTimeParser gcTime = new GCTimeParser(timeZone); - try (BufferedReader br = new BufferedReader(new InputStreamReader(logs.getInputStream()))) - { - String line; - while ((line = br.readLine()) != null) - { - long time = gcTime.parseTime(line); - - if (time == 0) - { - continue; - } - - int min5 = 5 * 60 * 1000; - long count = time / min5; - long key = count * min5; - - data.computeIfAbsent(key, k -> new DataSet()).parseGcLine(line); - } - } - } } diff --git a/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java b/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java index f5ad119..46ddf8e 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java @@ -1,19 +1,13 @@ package ru.naumen.sd40.log.parser; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.HashMap; import java.util.Locale; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.springframework.web.multipart.MultipartFile; - /** * Created by doki on 22.10.16. */ @@ -32,30 +26,6 @@ public TimeParser(String zoneId) { DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(zoneId)); } - - public void parse(HashMap data, String timeZone, MultipartFile logs) - throws IOException, ParseException { - TimeParser timeParser = new TimeParser(timeZone); - try (BufferedReader br = new BufferedReader(new InputStreamReader(logs.getInputStream()))) - { - String line; - while ((line = br.readLine()) != null) - { - long time = timeParser.parseTime(line); - - if (time == 0) - { - continue; - } - - int min5 = 5 * 60 * 1000; - long count = time / min5; - long key = count * min5; - - data.computeIfAbsent(key, k -> new DataSet()).parseLine(line); - } - } - } public long parseTime(String line) throws ParseException { Matcher matcher = TIME_PATTERN.matcher(line); diff --git a/src/main/java/ru/naumen/sd40/log/parser/TopParser.java b/src/main/java/ru/naumen/sd40/log/parser/TopParser.java index 4ac2c32..744f265 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/TopParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/TopParser.java @@ -100,5 +100,4 @@ private long prepareDate(long parsedDate) long count = parsedDate / min5; return count * min5; } - } From b20d830632afc0da1053c908b0df8c38967ce8ec Mon Sep 17 00:00:00 2001 From: ZeroNeT_T Date: Tue, 14 Nov 2017 17:04:10 +0500 Subject: [PATCH 3/5] Change sdng - gc --- src/main/java/ru/naumen/sd40/log/parser/App.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/naumen/sd40/log/parser/App.java b/src/main/java/ru/naumen/sd40/log/parser/App.java index cfc139a..14d3b0b 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/App.java +++ b/src/main/java/ru/naumen/sd40/log/parser/App.java @@ -38,13 +38,13 @@ public static void parse(MultipartFile logs, String nameInfluxDB, String timeZon switch (parseMode){ case "sdng": //Parse sdng - GCParser gcParser = new GCParser(); - parse(data, timeZone, logs, (ITimeParser)gcParser); + TimeParser timeParser = new TimeParser(); + parse(data, timeZone, logs, (ITimeParser)timeParser); break; case "gc": //Parse gc log - TimeParser timeParser = new TimeParser(); - parse(data, timeZone, logs, (ITimeParser)timeParser); + GCParser gcParser = new GCParser(); + parse(data, timeZone, logs, (ITimeParser)gcParser); break; case "top": //Parse top From 7530a5aaa93f850a318457054e501abe41706d7b Mon Sep 17 00:00:00 2001 From: ZeroNeT_T Date: Tue, 14 Nov 2017 23:17:05 +0500 Subject: [PATCH 4/5] implemented interfaces in appropriate parsers --- .../sd40/log/parser/ActionDoneParser.java | 3 +- .../java/ru/naumen/sd40/log/parser/App.java | 24 ++++----- .../ru/naumen/sd40/log/parser/DataSet.java | 26 ++------- .../naumen/sd40/log/parser/ErrorParser.java | 5 +- .../ru/naumen/sd40/log/parser/GCParser.java | 32 ++++------- .../ru/naumen/sd40/log/parser/SDNGParser.java | 51 ++++++++++++++++++ .../ru/naumen/sd40/log/parser/TimeParser.java | 41 -------------- .../ru/naumen/sd40/log/parser/TopParser.java | 53 +++++++------------ 8 files changed, 102 insertions(+), 133 deletions(-) create mode 100644 src/main/java/ru/naumen/sd40/log/parser/SDNGParser.java delete mode 100644 src/main/java/ru/naumen/sd40/log/parser/TimeParser.java diff --git a/src/main/java/ru/naumen/sd40/log/parser/ActionDoneParser.java b/src/main/java/ru/naumen/sd40/log/parser/ActionDoneParser.java index d3bb85c..29c8b97 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/ActionDoneParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/ActionDoneParser.java @@ -12,8 +12,7 @@ /** * Created by doki on 22.10.16. */ -public class ActionDoneParser -{ +public class ActionDoneParser implements IDataParser{ private static Set EXCLUDED_ACTIONS = new HashSet<>(); static diff --git a/src/main/java/ru/naumen/sd40/log/parser/App.java b/src/main/java/ru/naumen/sd40/log/parser/App.java index 14d3b0b..e6d8311 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/App.java +++ b/src/main/java/ru/naumen/sd40/log/parser/App.java @@ -10,6 +10,8 @@ import org.springframework.web.multipart.MultipartFile; import ru.naumen.perfhouse.influx.InfluxDAO; +import ru.naumen.sd40.log.parser.GCParser.GCTimeParser; +import ru.naumen.sd40.log.parser.SDNGParser.SDNGTimeParser; /** * Created by doki on 22.10.16. @@ -38,19 +40,21 @@ public static void parse(MultipartFile logs, String nameInfluxDB, String timeZon switch (parseMode){ case "sdng": //Parse sdng - TimeParser timeParser = new TimeParser(); - parse(data, timeZone, logs, (ITimeParser)timeParser); + SDNGParser sdngParser = new SDNGParser(); + SDNGTimeParser sdngTimeParser = new SDNGParser.SDNGTimeParser(); + parse(data, timeZone, logs, sdngParser, sdngTimeParser); break; case "gc": //Parse gc log GCParser gcParser = new GCParser(); - parse(data, timeZone, logs, (ITimeParser)gcParser); + GCTimeParser gcTimeParser = new GCParser.GCTimeParser(); + parse(data, timeZone, logs, gcParser, gcTimeParser); break; case "top": //Parse top TopParser topParser = new TopParser(logs, data); topParser.configureTimeZone(timeZone); - topParser.parse(); + parse(data, timeZone, logs, topParser, topParser); break; default: throw new IllegalArgumentException( @@ -87,22 +91,18 @@ public static void parse(MultipartFile logs, String nameInfluxDB, String timeZon } private static void parse(HashMap data, String timeZone, - MultipartFile logs, ITimeParser parser) + MultipartFile logs, IDataParser dataParser, ITimeParser timeParser) throws ParseException, IOException { try (BufferedReader br = new BufferedReader(new InputStreamReader(logs.getInputStream()))){ String line; while ((line = br.readLine()) != null){ - long time = parser.parseTime(line); + long time = timeParser.parseTime(line); if (time == 0){ continue; } - - int min5 = 5 * 60 * 1000; - long count = time / min5; - long key = count * min5; - - data.computeIfAbsent(key, k -> new DataSet()).parseLine(line); + + dataParser.parseLine(line); } } } diff --git a/src/main/java/ru/naumen/sd40/log/parser/DataSet.java b/src/main/java/ru/naumen/sd40/log/parser/DataSet.java index bdcd410..b02f8b9 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/DataSet.java +++ b/src/main/java/ru/naumen/sd40/log/parser/DataSet.java @@ -10,41 +10,25 @@ public class DataSet private GCParser gc; private TopData cpuData = new TopData(); - public DataSet() - { + public DataSet(){ actionsDone = new ActionDoneParser(); errors = new ErrorParser(); gc = new GCParser(); } - public void parseLine(String line) - { - errors.parseLine(line); - actionsDone.parseLine(line); - } - - public void parseGcLine(String line) - { - gc.parseLine(line); - } - - public ActionDoneParser getActionsDone() - { + public ActionDoneParser getActionsDone(){ return actionsDone; } - public ErrorParser getErrors() - { + public ErrorParser getErrors(){ return errors; } - public GCParser getGc() - { + public GCParser getGc(){ return gc; } - public TopData cpuData() - { + public TopData cpuData(){ return cpuData; } } diff --git a/src/main/java/ru/naumen/sd40/log/parser/ErrorParser.java b/src/main/java/ru/naumen/sd40/log/parser/ErrorParser.java index 32bc357..3325f36 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/ErrorParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/ErrorParser.java @@ -5,8 +5,7 @@ /** * Created by doki on 22.10.16. */ -public class ErrorParser -{ +public class ErrorParser implements IDataParser{ long warnCount; long errorCount; long fatalCount; @@ -15,7 +14,7 @@ public class ErrorParser Pattern errorRegEx = Pattern.compile("^\\d+ \\[.+?\\] \\(.+?\\) ERROR"); Pattern fatalRegEx = Pattern.compile("^\\d+ \\[.+?\\] \\(.+?\\) FATAL"); - void parseLine(String line) + public void parseLine(String line) { if (warnRegEx.matcher(line).find()) { diff --git a/src/main/java/ru/naumen/sd40/log/parser/GCParser.java b/src/main/java/ru/naumen/sd40/log/parser/GCParser.java index 5615644..4cd529d 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/GCParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/GCParser.java @@ -13,7 +13,7 @@ import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; -public class GCParser{ +public class GCParser implements IDataParser{ public final static class GCTimeParser implements ITimeParser{ private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", new Locale("ru", "RU")); @@ -21,21 +21,17 @@ public final static class GCTimeParser implements ITimeParser{ private static final Pattern PATTERN = Pattern .compile("^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}\\+\\d{4}).*"); - public GCTimeParser() - { + public GCTimeParser(){ DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); } - public GCTimeParser(String timeZone) - { + public GCTimeParser(String timeZone){ DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(timeZone)); } - public long parseTime(String line) throws ParseException - { + public long parseTime(String line) throws ParseException{ Matcher matcher = PATTERN.matcher(line); - if (matcher.find()) - { + if (matcher.find()){ Date parse = DATE_FORMAT.parse(matcher.group(1)); return parse.getTime(); } @@ -47,31 +43,25 @@ public long parseTime(String line) throws ParseException private Pattern gcExecutionTime = Pattern.compile(".*real=(.*)secs.*"); - public double getCalculatedAvg() - { + public double getCalculatedAvg(){ return roundToTwoPlaces(getSafeDouble(ds.getMean())); } - public long getGcTimes() - { + public long getGcTimes() { return ds.getN(); } - public double getMaxGcTime() - { + public double getMaxGcTime(){ return roundToTwoPlaces(getSafeDouble(ds.getMax())); } - public boolean isNan() - { + public boolean isNan(){ return getGcTimes() == 0; } - public void parseLine(String line) - { + public void parseLine(String line){ Matcher matcher = gcExecutionTime.matcher(line); - if (matcher.find()) - { + if (matcher.find()){ ds.addValue(Double.parseDouble(matcher.group(1).trim().replace(',', '.'))); } } diff --git a/src/main/java/ru/naumen/sd40/log/parser/SDNGParser.java b/src/main/java/ru/naumen/sd40/log/parser/SDNGParser.java new file mode 100644 index 0000000..9e7e909 --- /dev/null +++ b/src/main/java/ru/naumen/sd40/log/parser/SDNGParser.java @@ -0,0 +1,51 @@ +package ru.naumen.sd40.log.parser; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by doki on 22.10.16. + */ +public class SDNGParser implements IDataParser{ + public final static class SDNGTimeParser implements ITimeParser{ + private static final Pattern TIME_PATTERN = Pattern + .compile("^\\d+ \\[.*?\\] \\((\\d{2} .{3} \\d{4} \\d{2}:\\d{2}:\\d{2},\\d{3})\\)"); + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd MMM yyyy HH:mm:ss,SSS", + new Locale("ru", "RU")); + + public SDNGTimeParser() + { + DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); + } + + public SDNGTimeParser(String zoneId) + { + DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(zoneId)); + } + + public long parseTime(String line) throws ParseException { + Matcher matcher = TIME_PATTERN.matcher(line); + + if (matcher.find()){ + String timeString = matcher.group(1); + Date recDate = DATE_FORMAT.parse(timeString); + return recDate.getTime(); + } + return 0L; + } + } + + private DataSet currentSet; + + public void parseLine(String line){ + ErrorParser errors = currentSet.getErrors(); + ActionDoneParser actionsDone = currentSet.getActionsDone(); + errors.parseLine(line); + actionsDone.parseLine(line); + } +} diff --git a/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java b/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java deleted file mode 100644 index 46ddf8e..0000000 --- a/src/main/java/ru/naumen/sd40/log/parser/TimeParser.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.naumen.sd40.log.parser; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.TimeZone; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Created by doki on 22.10.16. - */ -public class TimeParser implements ITimeParser{ - private static final Pattern TIME_PATTERN = Pattern - .compile("^\\d+ \\[.*?\\] \\((\\d{2} .{3} \\d{4} \\d{2}:\\d{2}:\\d{2},\\d{3})\\)"); - private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd MMM yyyy HH:mm:ss,SSS", - new Locale("ru", "RU")); - - public TimeParser() - { - DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); - } - - public TimeParser(String zoneId) - { - DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(zoneId)); - } - - public long parseTime(String line) throws ParseException { - Matcher matcher = TIME_PATTERN.matcher(line); - - if (matcher.find()) - { - String timeString = matcher.group(1); - Date recDate = DATE_FORMAT.parse(timeString); - return recDate.getTime(); - } - return 0L; - } -} diff --git a/src/main/java/ru/naumen/sd40/log/parser/TopParser.java b/src/main/java/ru/naumen/sd40/log/parser/TopParser.java index 744f265..c4b0784 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/TopParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/TopParser.java @@ -16,10 +16,9 @@ * @author dkolmogortsev * */ -public class TopParser implements IDataParser{ - +public class TopParser implements IDataParser, ITimeParser{ private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH:mm"); - + private String dataDate; private MultipartFile logs; @@ -29,15 +28,13 @@ public class TopParser implements IDataParser{ private Pattern cpuAndMemPattren = Pattern .compile("^ *\\d+ \\S+ +\\S+ +\\S+ +\\S+ +\\S+ +\\S+ +\\S+ \\S+ +(\\S+) +(\\S+) +\\S+ java"); - - private DataSet currentSet; - - public TopParser(MultipartFile logs, Map existingDataSet) throws IllegalArgumentException - { + + private DataSet currentSet; + + public TopParser(MultipartFile logs, Map existingDataSet) throws IllegalArgumentException{ //Supports these masks in file name: YYYYmmdd, YYY-mm-dd i.e. 20161101, 2016-11-01 Matcher matcher = Pattern.compile("\\d{8}|\\d{4}-\\d{2}-\\d{2}").matcher(logs.getOriginalFilename()); - if (!matcher.find()) - { + if (!matcher.find()){ throw new IllegalArgumentException(); } this.dataDate = matcher.group(0).replaceAll("-", ""); @@ -46,33 +43,13 @@ public TopParser(MultipartFile logs, Map existingDataSet) throws sdf.setTimeZone(TimeZone.getTimeZone("GMT")); } - public void configureTimeZone(String timeZone) - { + public void configureTimeZone(String timeZone){ sdf.setTimeZone(TimeZone.getTimeZone(timeZone)); } - public void parse() throws IOException, ParseException - { - try (BufferedReader br = new BufferedReader(new InputStreamReader(logs.getInputStream()))) - { - String line; - while ((line = br.readLine()) != null) - { - parseLine(line); - } - } - } public void parseLine(String line) throws ParseException{ //check time - long time = 0; - Matcher matcher = timeRegex.matcher(line); - if (matcher.find()) - { - time = prepareDate(sdf.parse(dataDate + matcher.group(1)).getTime()); - currentSet = existing.computeIfAbsent(time, k -> new DataSet()); - return; - } if (currentSet != null) { //get la @@ -94,10 +71,20 @@ public void parseLine(String line) throws ParseException{ } } - private long prepareDate(long parsedDate) - { + private long prepareDate(long parsedDate){ int min5 = 5 * 60 * 1000; long count = parsedDate / min5; return count * min5; } + + public long parseTime(String line) throws ParseException { + long time; + Matcher matcher = Pattern.compile("\\d{8}|\\d{4}-\\d{2}-\\d{2}").matcher(logs.getOriginalFilename()); + if (matcher.find()){ + time = prepareDate(sdf.parse(dataDate + matcher.group(1)).getTime()); + currentSet = existing.computeIfAbsent(time, k -> new DataSet()); + return time; + } + return 0L; + } } From a417ca70a24228c08b15840a7c0c7fc661df93ae Mon Sep 17 00:00:00 2001 From: ZeroNeT_T Date: Wed, 15 Nov 2017 01:40:20 +0500 Subject: [PATCH 5/5] Sawn the classes to small parts --- .../java/ru/naumen/sd40/log/parser/App.java | 24 ++++----- .../ru/naumen/sd40/log/parser/GCParser.java | 29 ---------- .../naumen/sd40/log/parser/GCTimeParser.java | 34 ++++++++++++ .../ru/naumen/sd40/log/parser/SDNGParser.java | 34 ------------ .../sd40/log/parser/SDNGTimeParser.java | 35 ++++++++++++ .../ru/naumen/sd40/log/parser/TopParser.java | 53 +------------------ .../naumen/sd40/log/parser/TopTimeParser.java | 49 +++++++++++++++++ 7 files changed, 132 insertions(+), 126 deletions(-) create mode 100644 src/main/java/ru/naumen/sd40/log/parser/GCTimeParser.java create mode 100644 src/main/java/ru/naumen/sd40/log/parser/SDNGTimeParser.java create mode 100644 src/main/java/ru/naumen/sd40/log/parser/TopTimeParser.java diff --git a/src/main/java/ru/naumen/sd40/log/parser/App.java b/src/main/java/ru/naumen/sd40/log/parser/App.java index e6d8311..708bbdb 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/App.java +++ b/src/main/java/ru/naumen/sd40/log/parser/App.java @@ -10,8 +10,6 @@ import org.springframework.web.multipart.MultipartFile; import ru.naumen.perfhouse.influx.InfluxDAO; -import ru.naumen.sd40.log.parser.GCParser.GCTimeParser; -import ru.naumen.sd40.log.parser.SDNGParser.SDNGTimeParser; /** * Created by doki on 22.10.16. @@ -37,29 +35,30 @@ public static void parse(MultipartFile logs, String nameInfluxDB, String timeZon BatchPoints points = influxDAO.startBatchPoints(influxDb); HashMap data = new HashMap<>(); + IDataParser parser; + ITimeParser timeParser; switch (parseMode){ case "sdng": //Parse sdng - SDNGParser sdngParser = new SDNGParser(); - SDNGTimeParser sdngTimeParser = new SDNGParser.SDNGTimeParser(); - parse(data, timeZone, logs, sdngParser, sdngTimeParser); + parser = new SDNGParser(); + timeParser = new SDNGTimeParser(); break; case "gc": //Parse gc log - GCParser gcParser = new GCParser(); - GCTimeParser gcTimeParser = new GCParser.GCTimeParser(); - parse(data, timeZone, logs, gcParser, gcTimeParser); + parser = new GCParser(); + timeParser = new GCTimeParser(); break; case "top": //Parse top - TopParser topParser = new TopParser(logs, data); - topParser.configureTimeZone(timeZone); - parse(data, timeZone, logs, topParser, topParser); + parser = new TopParser(); + timeParser = new TopTimeParser(logs, data, timeZone); + break; default: throw new IllegalArgumentException( "Unknown parse mode! Availiable modes: sdng, gc, top. Requested mode: " + parseMode); } + parse(data, timeZone, logs, parser, timeParser); if (traceCheck){ System.out.print("Timestamp;Actions;Min;Mean;Stddev;50%%;95%%;99%%;99.9%%;Max;Errors\n"); @@ -101,7 +100,8 @@ private static void parse(HashMap data, String timeZone, if (time == 0){ continue; } - + + data.computeIfAbsent(time, k -> new DataSet()); dataParser.parseLine(line); } } diff --git a/src/main/java/ru/naumen/sd40/log/parser/GCParser.java b/src/main/java/ru/naumen/sd40/log/parser/GCParser.java index 4cd529d..405bff8 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/GCParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/GCParser.java @@ -3,41 +3,12 @@ import static ru.naumen.sd40.log.parser.NumberUtils.getSafeDouble; import static ru.naumen.sd40.log.parser.NumberUtils.roundToTwoPlaces; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; public class GCParser implements IDataParser{ - public final static class GCTimeParser implements ITimeParser{ - private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", - new Locale("ru", "RU")); - - private static final Pattern PATTERN = Pattern - .compile("^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}\\+\\d{4}).*"); - - public GCTimeParser(){ - DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); - } - - public GCTimeParser(String timeZone){ - DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(timeZone)); - } - - public long parseTime(String line) throws ParseException{ - Matcher matcher = PATTERN.matcher(line); - if (matcher.find()){ - Date parse = DATE_FORMAT.parse(matcher.group(1)); - return parse.getTime(); - } - return 0L; - } - } private DescriptiveStatistics ds = new DescriptiveStatistics(); diff --git a/src/main/java/ru/naumen/sd40/log/parser/GCTimeParser.java b/src/main/java/ru/naumen/sd40/log/parser/GCTimeParser.java new file mode 100644 index 0000000..5b6b116 --- /dev/null +++ b/src/main/java/ru/naumen/sd40/log/parser/GCTimeParser.java @@ -0,0 +1,34 @@ +package ru.naumen.sd40.log.parser; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class GCTimeParser implements ITimeParser{ + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", + new Locale("ru", "RU")); + + private static final Pattern PATTERN = Pattern + .compile("^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}\\+\\d{4}).*"); + + public GCTimeParser(){ + DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); + } + + public GCTimeParser(String timeZone){ + DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(timeZone)); + } + + public long parseTime(String line) throws ParseException{ + Matcher matcher = PATTERN.matcher(line); + if (matcher.find()){ + Date parse = DATE_FORMAT.parse(matcher.group(1)); + return parse.getTime(); + } + return 0L; + } +} \ No newline at end of file diff --git a/src/main/java/ru/naumen/sd40/log/parser/SDNGParser.java b/src/main/java/ru/naumen/sd40/log/parser/SDNGParser.java index 9e7e909..99a6e31 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/SDNGParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/SDNGParser.java @@ -1,44 +1,10 @@ package ru.naumen.sd40.log.parser; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.TimeZone; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * Created by doki on 22.10.16. */ public class SDNGParser implements IDataParser{ - public final static class SDNGTimeParser implements ITimeParser{ - private static final Pattern TIME_PATTERN = Pattern - .compile("^\\d+ \\[.*?\\] \\((\\d{2} .{3} \\d{4} \\d{2}:\\d{2}:\\d{2},\\d{3})\\)"); - private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd MMM yyyy HH:mm:ss,SSS", - new Locale("ru", "RU")); - - public SDNGTimeParser() - { - DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); - } - - public SDNGTimeParser(String zoneId) - { - DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(zoneId)); - } - - public long parseTime(String line) throws ParseException { - Matcher matcher = TIME_PATTERN.matcher(line); - - if (matcher.find()){ - String timeString = matcher.group(1); - Date recDate = DATE_FORMAT.parse(timeString); - return recDate.getTime(); - } - return 0L; - } - } private DataSet currentSet; diff --git a/src/main/java/ru/naumen/sd40/log/parser/SDNGTimeParser.java b/src/main/java/ru/naumen/sd40/log/parser/SDNGTimeParser.java new file mode 100644 index 0000000..3e971ef --- /dev/null +++ b/src/main/java/ru/naumen/sd40/log/parser/SDNGTimeParser.java @@ -0,0 +1,35 @@ +package ru.naumen.sd40.log.parser; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class SDNGTimeParser implements ITimeParser{ + private static final Pattern TIME_PATTERN = Pattern + .compile("^\\d+ \\[.*?\\] \\((\\d{2} .{3} \\d{4} \\d{2}:\\d{2}:\\d{2},\\d{3})\\)"); + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd MMM yyyy HH:mm:ss,SSS", + new Locale("ru", "RU")); + + public SDNGTimeParser(){ + DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); + } + + public SDNGTimeParser(String zoneId){ + DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(zoneId)); + } + + public long parseTime(String line) throws ParseException { + Matcher matcher = TIME_PATTERN.matcher(line); + + if (matcher.find()){ + String timeString = matcher.group(1); + Date recDate = DATE_FORMAT.parse(timeString); + return recDate.getTime(); + } + return 0L; + } +} \ No newline at end of file diff --git a/src/main/java/ru/naumen/sd40/log/parser/TopParser.java b/src/main/java/ru/naumen/sd40/log/parser/TopParser.java index c4b0784..c8f73c4 100644 --- a/src/main/java/ru/naumen/sd40/log/parser/TopParser.java +++ b/src/main/java/ru/naumen/sd40/log/parser/TopParser.java @@ -1,13 +1,6 @@ package ru.naumen.sd40.log.parser; -import org.springframework.web.multipart.MultipartFile; -import java.io.InputStreamReader; -import java.io.BufferedReader; -import java.io.IOException; import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Map; -import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -16,37 +9,12 @@ * @author dkolmogortsev * */ -public class TopParser implements IDataParser, ITimeParser{ - private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH:mm"); +public class TopParser implements IDataParser{ - private String dataDate; - private MultipartFile logs; - - private Map existing; - - private Pattern timeRegex = Pattern.compile("^_+ (\\S+)"); + private DataSet currentSet; private Pattern cpuAndMemPattren = Pattern .compile("^ *\\d+ \\S+ +\\S+ +\\S+ +\\S+ +\\S+ +\\S+ +\\S+ \\S+ +(\\S+) +(\\S+) +\\S+ java"); - - private DataSet currentSet; - - public TopParser(MultipartFile logs, Map existingDataSet) throws IllegalArgumentException{ - //Supports these masks in file name: YYYYmmdd, YYY-mm-dd i.e. 20161101, 2016-11-01 - Matcher matcher = Pattern.compile("\\d{8}|\\d{4}-\\d{2}-\\d{2}").matcher(logs.getOriginalFilename()); - if (!matcher.find()){ - throw new IllegalArgumentException(); - } - this.dataDate = matcher.group(0).replaceAll("-", ""); - this.logs = logs; - this.existing = existingDataSet; - sdf.setTimeZone(TimeZone.getTimeZone("GMT")); - } - - public void configureTimeZone(String timeZone){ - sdf.setTimeZone(TimeZone.getTimeZone(timeZone)); - } - public void parseLine(String line) throws ParseException{ //check time @@ -70,21 +38,4 @@ public void parseLine(String line) throws ParseException{ } } } - - private long prepareDate(long parsedDate){ - int min5 = 5 * 60 * 1000; - long count = parsedDate / min5; - return count * min5; - } - - public long parseTime(String line) throws ParseException { - long time; - Matcher matcher = Pattern.compile("\\d{8}|\\d{4}-\\d{2}-\\d{2}").matcher(logs.getOriginalFilename()); - if (matcher.find()){ - time = prepareDate(sdf.parse(dataDate + matcher.group(1)).getTime()); - currentSet = existing.computeIfAbsent(time, k -> new DataSet()); - return time; - } - return 0L; - } } diff --git a/src/main/java/ru/naumen/sd40/log/parser/TopTimeParser.java b/src/main/java/ru/naumen/sd40/log/parser/TopTimeParser.java new file mode 100644 index 0000000..8115dda --- /dev/null +++ b/src/main/java/ru/naumen/sd40/log/parser/TopTimeParser.java @@ -0,0 +1,49 @@ +package ru.naumen.sd40.log.parser; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Map; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.springframework.web.multipart.MultipartFile; + +public class TopTimeParser implements ITimeParser{ + private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH:mm"); + private String dataDate; + private MultipartFile logs; +// private Map existing; +// private Pattern timeRegex = Pattern.compile("^_+ (\\S+)"); + + public TopTimeParser(MultipartFile logs, Map existingDataSet, String timeZone) throws IllegalArgumentException{ + //Supports these masks in file name: YYYYmmdd, YYY-mm-dd i.e. 20161101, 2016-11-01 + Matcher matcher = Pattern.compile("\\d{8}|\\d{4}-\\d{2}-\\d{2}").matcher(logs.getOriginalFilename()); + if (!matcher.find()){ + throw new IllegalArgumentException(); + } + this.dataDate = matcher.group(0).replaceAll("-", ""); + this.logs = logs; + this.existing = existingDataSet; + configureTimeZone(timeZone); + } + public void configureTimeZone(String timeZone){ + sdf.setTimeZone(TimeZone.getTimeZone(timeZone)); + } + + public long parseTime(String line) throws ParseException { + long time; + Matcher matcher = Pattern.compile("\\d{8}|\\d{4}-\\d{2}-\\d{2}").matcher(logs.getOriginalFilename()); + if (matcher.find()){ + time = prepareDate(sdf.parse(dataDate + matcher.group(1)).getTime()); + return time; + } + return 0L; + } + + private long prepareDate(long parsedDate){ + int min5 = 5 * 60 * 1000; + long count = parsedDate / min5; + return count * min5; + } +} \ No newline at end of file