package proj.zoie.perf.reports; import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.OutputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.deepak.performance.PerformanceManager; import org.deepak.util.FilePlotData; import org.deepak.util.GenericStatisticsUtil; import org.deepak.util.PlotGraphs; import org.jfree.chart.ChartUtilities; public class ZoieClientLogProcessor { private static String timePatternString = "^(\\w+ \\d{1,2}, \\d{4} \\d{1,2}:\\d{1,2}:\\d{1,2} \\w{2}).* subTransaction\\d+"; private static String patternString = "^INFO: TIME-TAKEN: \\w+:(.*): (\\d+) : (\\d+)"; private static Pattern _pattern = Pattern.compile(patternString); private static Pattern _timePattern = Pattern.compile(timePatternString); private static DateFormat _tdf = new SimpleDateFormat("MMM d, yyyy h:mm:ss aaa"); private static DateFormat _df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); private static DateFormat _dfPlot = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); private Map _map = new HashMap(); private Map _avgMap = new HashMap(); private FilePlotData _fpd = null; private FilePlotData _avgFpd = null; public String _fileName = null; private static int _imageHeight = 300; private static int _imageWidth = 500; private static String[] _additionalInfo = new String[] { "Total Transactions", "Execution Time", "Transaction Per Second", "Transaction Per Minute", "Total Executions", "Total Successful Executions", "Total Errors" }; private long totalTransasctions = -1; private long totalExecutions = -1; private long totalErrors = -1; private long totalSuccess = -1; private float totalRunTime = -1; private boolean _isProcessed = false; public ZoieClientLogProcessor(String fileName) { _fileName = fileName; process(); } public void process() { System.out.println("Processing..."); if (_isProcessed) { return; } try { _isProcessed = true; BufferedReader br = new BufferedReader(new FileReader(new File(_fileName))); String line = null; int cnt = 0; Date date = null; while ((line = br.readLine()) != null) { Matcher dateMatcher = _timePattern.matcher(line); if (dateMatcher.matches()) { date = _dfPlot.parse(_dfPlot.format(_tdf.parse(dateMatcher.group(1)))); } else { Matcher matcher = _pattern.matcher(line); if (matcher.matches()) { cnt++; String queryStr = matcher.group(1).trim(); long resultcnt = Long.parseLong(matcher.group(2).trim()); long tmtaken = Long.parseLong(matcher.group(3).trim()); if (date != null) { if (_avgMap.containsKey(date)) { ZoieClientLogData tmp = (ZoieClientLogData) _avgMap.get(date); tmp.add(resultcnt, tmtaken); } else { _avgMap.put(date, new ZoieClientLogData(date, queryStr, resultcnt, tmtaken)); } ZoieClientLogData zd = new ZoieClientLogData(date, queryStr, resultcnt, tmtaken); _map.put(new Integer(cnt), zd); date = null; } } else { if (line.startsWith("INFO: TOTAL ")) { if (line.startsWith("INFO: TOTAL TRANSACTIONS:")) { totalTransasctions = Long.parseLong(line.substring(line.lastIndexOf(" ")).trim()); } else if (line.startsWith("INFO: TOTAL EXECUTIONS:")) { totalExecutions = Long.parseLong(line.substring(line.lastIndexOf(" ")).trim()); } else if (line.startsWith("INFO: TOTAL SUCCESSFUL EXECUTIONS:")) { totalSuccess = Long.parseLong(line.substring(line.lastIndexOf(" ")).trim()); } else if (line.startsWith("INFO: TOTAL FAILED EXECUTIONS:")) { totalErrors = Long.parseLong(line.substring(line.lastIndexOf(" ")).trim()); } else if (line.startsWith("INFO: TOTAL RUNTIME IN MINS:")) { totalRunTime = Float.parseFloat(line.substring(line.lastIndexOf(" ")).trim()); } } } } } _map = new TreeMap(_map); _avgMap = new TreeMap(_avgMap); br.close(); Iterator itr = _map.keySet().iterator(); StringBuffer plotStr = new StringBuffer(""); while (itr.hasNext()) { plotStr.append(((ZoieClientLogData) _map.get(itr.next())).toString() + "\n"); } _fpd = new FilePlotData(plotStr.toString(), true); Iterator itr1 = _avgMap.keySet().iterator(); StringBuffer plotStr1 = new StringBuffer(""); if (itr1.hasNext()) { while (itr1.hasNext()) { plotStr1.append(((ZoieClientLogData) _avgMap.get(itr1.next())).averagedString() + "\n"); } _avgFpd = new FilePlotData(plotStr1.toString(), true); } } catch (Exception e) { e.printStackTrace(); } } public static String getTableHtml(ZoieClientLogProcessor zp, boolean addGraphs, String outputDir, String subFolderForOutput, int imgWidth, int imgHeight, int numGraphsPerRow) throws Exception { if (zp._fpd == null) { zp.process(); } String[] scenarios = new String[] { "Search Time (ms)", "Number Of Results Returned" }; String itemKey = "Item"; GenericStatisticsUtil[] utils = new GenericStatisticsUtil[2]; utils[0] = new GenericStatisticsUtil(zp._fpd.getNonNumericNthColumn(2)); utils[0].process(); utils[1] = new GenericStatisticsUtil(zp._fpd.getNonNumericNthColumn(3)); utils[1].process(); String tab = ZoieHtmlCreator.getSimpleTableHtmlString(itemKey, scenarios, utils, null); if (addGraphs) { tab = tab + "<br><br>\n" + getTableHtmlForGraphs(zp, outputDir, subFolderForOutput, "Series", imgWidth, imgHeight, true, false, "center", numGraphsPerRow); } return tab; } public static String getTableHtml(ZoieClientLogProcessor zp) throws Exception { if (!zp._isProcessed) { zp.process(); } if (zp._fpd == null) { return ""; } String[] scenarios = new String[] { "Search Time (ms)", "Number Of Results" }; String itemKey = "Item"; GenericStatisticsUtil[] utils = new GenericStatisticsUtil[3]; utils[0] = new GenericStatisticsUtil(zp._fpd.getNonNumericNthColumn(2)); utils[0].process(); utils[1] = new GenericStatisticsUtil(zp._fpd.getNonNumericNthColumn(3)); utils[1].process(); String tab = ZoieHtmlCreator.getSimpleTableHtmlString(itemKey, scenarios, utils, null); return tab; } public static String getTableHtmlForGraphs(ZoieClientLogProcessor zp, String outputDir, String subFolderForOutput, String seriesDescription, int imgWidth, int imgHeight, boolean useTimeStamp, boolean useAbsFilePath, String alignment, int numGraphsPerRow) throws Exception { int number = 2; if (numGraphsPerRow > 0) { number = numGraphsPerRow; } if (!zp._isProcessed) { zp.process(); } if (zp._avgFpd == null) { return ""; } String subFolder = ""; if ((subFolderForOutput != null) && (!"".equals(subFolderForOutput.trim()))) { subFolder = subFolder + File.separator; } int imageWidth = imgWidth; int imageHeight = imgHeight; if ((imageWidth <= 0) || (imageHeight <= 0)) { imageHeight = _imageHeight; imageWidth = _imageWidth; } Map<Integer, String> inMap = new HashMap<Integer, String>(); inMap.put(new Integer(2), "Search Time (ms)"); inMap.put(new Integer(3), "Number Of Results"); inMap = new TreeMap<Integer, String>(inMap); Iterator<Integer> itr = inMap.keySet().iterator(); int cnt = 2; List list = new ArrayList(); while (itr.hasNext()) { Integer key = itr.next(); String yTitle = (String) inMap.get(key); int indexVal = key.intValue(); String chartTitle = yTitle + " Vs. Time"; BufferedImage image = PlotGraphs.createXYTimeImage(zp._avgFpd, 1, new int[] { indexVal }, chartTitle, "Time", yTitle, new String[] { seriesDescription }, _dfPlot, imageWidth, imageHeight); String tmpAdd = ""; if (useTimeStamp) { tmpAdd = "_" + ZoieHtmlCreator.getTimeStamp(); } String fileName = outputDir + File.separator + subFolder + "ZoieClientImage_" + (cnt - 1) + tmpAdd + ".png"; File pngFile = new File(fileName); if (useAbsFilePath) { list.add(pngFile.getAbsolutePath()); } else { list.add(subFolder + pngFile.getName()); } OutputStream ost = new BufferedOutputStream(new FileOutputStream(pngFile, false)); ChartUtilities.writeBufferedImageAsPNG(ost, image); System.out.println("Image " + (cnt - 1) + " : " + fileName); cnt++; } String[] graphs = new String[list.size()]; Iterator itr1 = list.iterator(); for (int i = 0; i < graphs.length; i++) { graphs[i] = (String) itr1.next(); } String tab = ZoieHtmlCreator.getSimpleTableHtmlStringForGraphs(graphs, alignment, number); return tab; } public static String getTableHtmlForAdditionalData(ZoieClientLogProcessor zp) throws Exception { String tab = ""; if (zp._fpd == null) { zp.process(); } if (zp.totalTransasctions > 0) { if (zp.totalRunTime <= 0) { return ""; } double qps = PerformanceManager.truncateNumber((zp.totalTransasctions) / (zp.totalRunTime * 60), 3); double qpm = PerformanceManager.truncateNumber((zp.totalTransasctions) / (zp.totalRunTime), 3); String[] vals = new String[_additionalInfo.length]; vals[0] = zp.totalTransasctions + ""; vals[1] = zp.totalRunTime + ""; vals[2] = qps + ""; vals[3] = qpm + ""; if (zp.totalExecutions > 0) { vals[4] = zp.totalTransasctions + ""; } else { vals[4] = "Unknown"; } if (zp.totalSuccess > 0) { vals[5] = zp.totalSuccess + ""; } else { vals[5] = "Unknown"; } if (zp.totalErrors >= 0) { vals[6] = zp.totalErrors + ""; } else { vals[6] = "Unknown"; } tab = ZoieHtmlCreator.getSimpleTableHtmlString(_additionalInfo, vals); } else { return ""; } return tab; } public static class ZoieClientLogData { private Date _date = null; private String _query = null; private long _results = -1; private long _timeTaken = -1; private int count = 1; public ZoieClientLogData(Date date, String key, long results, long timetaken) { _date = date; _query = key; _results = results; _timeTaken = timetaken; } public void add(long results, long timetaken) { _results = _results + results; _timeTaken = _timeTaken + timetaken; count++; } public String averagedString() { String result = _dfPlot.format(_date) + "\t" + (_timeTaken / (double) count) + "\t" + (_results / (double) count); return result; } public String toString() { String result = _dfPlot.format(_date) + "\t" + _timeTaken + "\t" + _results; return result; } } }