* * Licensed under the Apache License, Version 2.0 (the "License");\r
* * you may not use this file except in compliance with the License.\r
* * You may obtain a copy of the License at\r
- * * \r
+ * *\r
* * http://www.apache.org/licenses/LICENSE-2.0\r
- * * \r
+ * *\r
* * Unless required by applicable law or agreed to in writing, software\r
* * distributed under the License is distributed on an "AS IS" BASIS,\r
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
* @version $Id: DailyLatencyReport.java,v 1.2 2013/11/06 16:23:54 eby Exp $\r
*/\r
public class DailyLatencyReport extends ReportBase {\r
- private static final String SELECT_SQL =\r
- "select EVENT_TIME, TYPE, PUBLISH_ID, FEED_FILEID, FEEDID, CONTENT_LENGTH from LOG_RECORDS" +\r
- " where EVENT_TIME >= ? and EVENT_TIME <= ?";\r
+ private static final String SELECT_SQL =\r
+ "select EVENT_TIME, TYPE, PUBLISH_ID, FEED_FILEID, FEEDID, CONTENT_LENGTH from LOG_RECORDS" +\r
+ " where EVENT_TIME >= ? and EVENT_TIME <= ?";\r
+\r
+ private class Job {\r
+ public long pubtime = 0;\r
+ public long clen = 0;\r
+ public List<Long> deltime = new ArrayList<Long>();\r
+ public long minLatency() {\r
+ long n = deltime.isEmpty() ? 0 : Long.MAX_VALUE;\r
+ for (Long l : deltime)\r
+ n = Math.min(n, l-pubtime);\r
+ return n;\r
+ }\r
+ public long maxLatency() {\r
+ long n = 0;\r
+ for (Long l : deltime)\r
+ n = Math.max(n, l-pubtime);\r
+ return n;\r
+ }\r
+ public long totalLatency() {\r
+ long n = 0;\r
+ for (Long l : deltime)\r
+ n += (l-pubtime);\r
+ return n;\r
+ }\r
+ }\r
+ private class Counters {\r
+ public final String date;\r
+ public final int feedid;\r
+ public final Map<String, Job> jobs;\r
+ public Counters(String d, int fid) {\r
+ date = d;\r
+ feedid = fid;\r
+ jobs = new HashMap<String, Job>();\r
+ }\r
+ public void addEvent(long etime, String type, String id, String fid, long clen) {\r
+ Job j = jobs.get(id);\r
+ if (j == null) {\r
+ j = new Job();\r
+ jobs.put(id, j);\r
+ }\r
+ if (type.equals("pub")) {\r
+ j.pubtime = getPstart(id);\r
+ j.clen = clen;\r
+ } else if (type.equals("del")) {\r
+ j.deltime.add(etime);\r
+ }\r
+ }\r
+ @Override\r
+ public String toString() {\r
+ long minsize = Long.MAX_VALUE, maxsize = 0, avgsize = 0;\r
+ long minl = Long.MAX_VALUE, maxl = 0;\r
+ long fanout = 0, totall = 0, totaln = 0;\r
+ for (Job j : jobs.values()) {\r
+ minsize = Math.min(minsize, j.clen);\r
+ maxsize = Math.max(maxsize, j.clen);\r
+ avgsize += j.clen;\r
+ minl = Math.min(minl, j.minLatency());\r
+ maxl = Math.max(maxl, j.maxLatency());\r
+ totall += j.totalLatency();\r
+ totaln += j.deltime.size();\r
+ fanout += j.deltime.size();\r
+ }\r
+ if (jobs.size() > 0) {\r
+ avgsize /= jobs.size();\r
+ fanout /= jobs.size();\r
+ }\r
+ long avgl = (totaln > 0) ? (totall / totaln) : 0;\r
+ return date + "," + feedid + "," + minsize + "," + maxsize + "," + avgsize + "," + minl + "," + maxl + "," + avgl + "," + fanout;\r
+ }\r
+ }\r
+ private long getPstart(String t) {\r
+ if (t.indexOf('.') > 0)\r
+ t = t.substring(0, t.indexOf('.'));\r
+ return Long.parseLong(t);\r
+ }\r
\r
- private class Job {\r
- public long pubtime = 0;\r
- public long clen = 0;\r
- public List<Long> deltime = new ArrayList<Long>();\r
- public long minLatency() {\r
- long n = deltime.isEmpty() ? 0 : Long.MAX_VALUE;\r
- for (Long l : deltime)\r
- n = Math.min(n, l-pubtime);\r
- return n;\r
- }\r
- public long maxLatency() {\r
- long n = 0;\r
- for (Long l : deltime)\r
- n = Math.max(n, l-pubtime);\r
- return n;\r
- }\r
- public long totalLatency() {\r
- long n = 0;\r
- for (Long l : deltime)\r
- n += (l-pubtime);\r
- return n;\r
- }\r
- }\r
- private class Counters {\r
- public final String date;\r
- public final int feedid;\r
- public final Map<String, Job> jobs;\r
- public Counters(String d, int fid) {\r
- date = d;\r
- feedid = fid;\r
- jobs = new HashMap<String, Job>();\r
- }\r
- public void addEvent(long etime, String type, String id, String fid, long clen) {\r
- Job j = jobs.get(id);\r
- if (j == null) {\r
- j = new Job();\r
- jobs.put(id, j);\r
- }\r
- if (type.equals("pub")) {\r
- j.pubtime = getPstart(id);\r
- j.clen = clen;\r
- } else if (type.equals("del")) {\r
- j.deltime.add(etime);\r
- }\r
- }\r
- @Override\r
- public String toString() {\r
- long minsize = Long.MAX_VALUE, maxsize = 0, avgsize = 0;\r
- long minl = Long.MAX_VALUE, maxl = 0;\r
- long fanout = 0, totall = 0, totaln = 0;\r
- for (Job j : jobs.values()) {\r
- minsize = Math.min(minsize, j.clen);\r
- maxsize = Math.max(maxsize, j.clen);\r
- avgsize += j.clen;\r
- minl = Math.min(minl, j.minLatency());\r
- maxl = Math.max(maxl, j.maxLatency());\r
- totall += j.totalLatency();\r
- totaln += j.deltime.size();\r
- fanout += j.deltime.size();\r
- }\r
- if (jobs.size() > 0) {\r
- avgsize /= jobs.size();\r
- fanout /= jobs.size();\r
- }\r
- long avgl = (totaln > 0) ? (totall / totaln) : 0;\r
- return date + "," + feedid + "," + minsize + "," + maxsize + "," + avgsize + "," + minl + "," + maxl + "," + avgl + "," + fanout;\r
- }\r
- }\r
- private long getPstart(String t) {\r
- if (t.indexOf('.') > 0)\r
- t = t.substring(0, t.indexOf('.'));\r
- return Long.parseLong(t);\r
- }\r
+ @Override\r
+ public void run() {\r
+ Map<String, Counters> map = new HashMap<String, Counters>();\r
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");\r
+ long start = System.currentTimeMillis();\r
+ try {\r
+ DB db = new DB();\r
+ @SuppressWarnings("resource")\r
+ Connection conn = db.getConnection();\r
+ try(PreparedStatement ps = conn.prepareStatement(SELECT_SQL)) {\r
+ ps.setLong(1, from);\r
+ ps.setLong(2, to);\r
+ try(ResultSet rs = ps.executeQuery()) {\r
+ while (rs.next()) {\r
+ String id = rs.getString("PUBLISH_ID");\r
+ int feed = rs.getInt("FEEDID");\r
+ long etime = rs.getLong("EVENT_TIME");\r
+ String type = rs.getString("TYPE");\r
+ String fid = rs.getString("FEED_FILEID");\r
+ long clen = rs.getLong("CONTENT_LENGTH");\r
+ String date = sdf.format(new Date(getPstart(id)));\r
+ String key = date + "," + feed;\r
+ Counters c = map.get(key);\r
+ if (c == null) {\r
+ c = new Counters(date, feed);\r
+ map.put(key, c);\r
+ }\r
+ c.addEvent(etime, type, id, fid, clen);\r
+ }\r
+ }\r
\r
- @Override\r
- public void run() {\r
- Map<String, Counters> map = new HashMap<String, Counters>();\r
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");\r
- long start = System.currentTimeMillis();\r
- try {\r
- DB db = new DB();\r
- @SuppressWarnings("resource")\r
- Connection conn = db.getConnection();\r
- PreparedStatement ps = conn.prepareStatement(SELECT_SQL);\r
- ps.setLong(1, from);\r
- ps.setLong(2, to);\r
- ResultSet rs = ps.executeQuery();\r
- while (rs.next()) {\r
- String id = rs.getString("PUBLISH_ID");\r
- int feed = rs.getInt("FEEDID");\r
- long etime = rs.getLong("EVENT_TIME");\r
- String type = rs.getString("TYPE");\r
- String fid = rs.getString("FEED_FILEID");\r
- long clen = rs.getLong("CONTENT_LENGTH");\r
- String date = sdf.format(new Date(getPstart(id)));\r
- String key = date + "," + feed;\r
- Counters c = map.get(key);\r
- if (c == null) {\r
- c = new Counters(date, feed);\r
- map.put(key, c);\r
- }\r
- c.addEvent(etime, type, id, fid, clen);\r
- }\r
- rs.close();\r
- ps.close();\r
- db.release(conn);\r
- } catch (SQLException e) {\r
- e.printStackTrace();\r
- }\r
- logger.debug("Query time: " + (System.currentTimeMillis()-start) + " ms");\r
- try {\r
- PrintWriter os = new PrintWriter(outfile);\r
- os.println("date,feedid,minsize,maxsize,avgsize,minlat,maxlat,avglat,fanout");\r
- for (String key : new TreeSet<String>(map.keySet())) {\r
- Counters c = map.get(key);\r
- os.println(c.toString());\r
- }\r
- os.close();\r
- } catch (FileNotFoundException e) {\r
- System.err.println("File cannot be written: "+outfile);\r
- }\r
- }\r
+ db.release(conn);\r
+ }\r
+ } catch (SQLException e) {\r
+ e.printStackTrace();\r
+ }\r
+ logger.debug("Query time: " + (System.currentTimeMillis()-start) + " ms");\r
+ try (PrintWriter os = new PrintWriter(outfile)){\r
+ os.println("date,feedid,minsize,maxsize,avgsize,minlat,maxlat,avglat,fanout");\r
+ for (String key : new TreeSet<String>(map.keySet())) {\r
+ Counters c = map.get(key);\r
+ os.println(c.toString());\r
+ }\r
+ } catch (FileNotFoundException e) {\r
+ System.err.println("File cannot be written: "+outfile);\r
+ }\r
+ }\r
}\r