From 5aa3d51128a3e261ebf3a82f084f9cc40e063b93 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 14 Aug 2013 13:49:55 +0800 Subject: [PATCH] monitor support --- .../druid/stat/DruidStatManagerFacade.java | 37 +- .../druid/support/http/stat/WebAppStat.java | 202 +++--- .../support/http/stat/WebAppStatValue.java | 683 ++++++++++++++++++ .../support/http/stat/WebSessionStat.java | 80 +- .../http/stat/WebSessionStatValue.java | 255 +++++++ .../druid/support/monitor/MonitorContext.java | 50 +- .../druid/support/monitor/MonitorService.java | 87 +++ .../druid/support/monitor/dao/MonitorDao.java | 22 +- .../monitor/dao/MonitorDaoJdbcImpl.java | 25 +- .../druid/support/spring/stat/SpringStat.java | 16 + .../java/com/alibaba/druid/util/IOUtils.java | 25 + 11 files changed, 1311 insertions(+), 171 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/support/http/stat/WebAppStatValue.java create mode 100644 src/main/java/com/alibaba/druid/support/http/stat/WebSessionStatValue.java diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java index 7eb98a517a..f2a6c16b81 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -15,12 +15,10 @@ */ package com.alibaba.druid.stat; -import java.lang.management.ManagementFactory; import java.sql.Driver; import java.sql.DriverManager; import java.util.ArrayList; import java.util.Collection; -import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; @@ -36,6 +34,7 @@ import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.support.http.stat.WebAppStatManager; import com.alibaba.druid.support.spring.stat.SpringStatManager; import com.alibaba.druid.util.DruidDataSourceUtils; +import com.alibaba.druid.util.IOUtils; import com.alibaba.druid.util.JdbcSqlStatUtils; import com.alibaba.druid.util.StringUtils; @@ -167,7 +166,7 @@ public final class DruidStatManagerFacade { if (dataSourceId == null) { Map map = new HashMap(); - + for (Object datasource : dataSources) { Map wallStat = DruidDataSourceUtils.getWallStatMap(datasource); map = mergWallStat(map, wallStat); @@ -185,50 +184,50 @@ public final class DruidStatManagerFacade { } return new HashMap(); - // + // } - + @SuppressWarnings({ "rawtypes", "unchecked" }) public static Map mergWallStat(Map mapA, Map mapB) { if (mapA == null || mapA.size() == 0) { return mapB; } - + if (mapB == null || mapB.size() == 0) { return mapA; } - + Map newMap = new LinkedHashMap(); for (Object item : mapB.entrySet()) { - Map.Entry entry = (Map.Entry) item; + Map.Entry entry = (Map.Entry) item; String key = (String) entry.getKey(); Object valueB = entry.getValue(); Object valueA = mapA.get(key); - + if (valueA == null) { newMap.put(key, valueB); } else if (valueB == null) { newMap.put(key, valueA); } else if ("blackList".equals(key)) { Map> newSet = new HashMap>(); - + Collection> collectionA = (Collection>) valueA; for (Map blackItem : collectionA) { if (newSet.size() >= 1000) { break; } - + String sql = (String) blackItem.get("sql"); Map oldItem = newSet.get(sql); newSet.put(sql, mergWallStat(oldItem, blackItem)); } - + Collection> collectionB = (Collection>) valueB; for (Map blackItem : collectionB) { if (newSet.size() >= 1000) { break; } - + String sql = (String) blackItem.get("sql"); Map oldItem = newSet.get(sql); newSet.put(sql, mergWallStat(oldItem, blackItem)); @@ -236,7 +235,7 @@ public final class DruidStatManagerFacade { newMap.put(key, newSet.values()); } else { if (valueA instanceof Map && valueB instanceof Map) { - Object newValue = mergWallStat((Map)valueA, (Map)valueB); + Object newValue = mergWallStat((Map) valueA, (Map) valueB); newMap.put(key, newValue); } else if (valueA instanceof Set && valueB instanceof Set) { Set set = new HashSet(); @@ -254,7 +253,7 @@ public final class DruidStatManagerFacade { } } } - + return newMap; } @@ -266,17 +265,17 @@ public final class DruidStatManagerFacade { String name = (String) map.get("name"); mapped.put(name, map); } - + List> mergedList = new ArrayList>(); for (Object item : (List) listB) { Map mapB = (Map) item; String name = (String) mapB.get("name"); Map mapA = mapped.get(name); - + Map mergedMap = mergWallStat(mapA, mapB); mergedList.add(mergedMap); } - + return mergedList; } @@ -345,7 +344,7 @@ public final class DruidStatManagerFacade { dataMap.put("JavaVMName", System.getProperty("java.vm.name")); dataMap.put("JavaVersion", System.getProperty("java.version")); dataMap.put("JavaClassPath", System.getProperty("java.class.path")); - dataMap.put("StartTime", new Date(ManagementFactory.getRuntimeMXBean().getStartTime())); + dataMap.put("StartTime", IOUtils.getStartTime()); return dataMap; } diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java index 8e0fb541ab..91ab08e8de 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java @@ -15,9 +15,10 @@ */ package com.alibaba.druid.support.http.stat; +import static com.alibaba.druid.util.JdbcSqlStatUtils.get; + import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -56,7 +57,10 @@ public class WebAppStat { private final AtomicLong jdbcCommitCount = new AtomicLong(); private final AtomicLong jdbcRollbackCount = new AtomicLong(); - private final ConcurrentMap uriStatMap = new ConcurrentHashMap(16, 0.75f, 1); + private final ConcurrentMap uriStatMap = new ConcurrentHashMap( + 16, + 0.75f, + 1); private final LRUCache sessionStatMap; private final ReadWriteLock sessionStatLock = new ReentrantReadWriteLock(); @@ -136,7 +140,7 @@ public class WebAppStat { requestCount.set(0); requestCount.set(0); sessionCount.set(0); - + jdbcFetchRowCount.set(0); jdbcUpdateCount.set(0); jdbcExecuteCount.set(0); @@ -354,7 +358,7 @@ public class WebAppStat { public void afterInvoke(Throwable error, long nanoSpan) { runningCount.decrementAndGet(); currentLocal.set(null); - + WebRequestStat requestStat = WebRequestStat.current(); if (requestStat != null) { this.addJdbcExecuteCount(requestStat.getJdbcExecuteCount()); @@ -365,15 +369,15 @@ public class WebAppStat { this.addJdbcExecuteTimeNano(requestStat.getJdbcExecuteTimeNano()); } } - + public void incrementSessionCount() { sessionCount.incrementAndGet(); } - + public long getSessionCount() { return sessionCount.get(); } - + public void addJdbcFetchRowCount(long delta) { this.jdbcFetchRowCount.addAndGet(delta); } @@ -402,10 +406,6 @@ public class WebAppStat { return jdbcExecuteCount.get(); } - public long getJdbcExecuteTimeMillis() { - return getJdbcExecuteTimeNano() / (1000 * 1000); - } - public long getJdbcExecuteTimeNano() { return jdbcExecuteTimeNano.get(); } @@ -467,81 +467,22 @@ public class WebAppStat { } public Map getStatData() { - Map data = new LinkedHashMap(); - - data.put("ContextPath", this.getContextPath()); - data.put("RunningCount", this.getRunningCount()); - data.put("ConcurrentMax", this.getConcurrentMax()); - data.put("RequestCount", this.getRequestCount()); - data.put("SessionCount", this.getSessionCount()); + return getStatValue(false).getStatData(); + } + + public List getURIStatValueList(boolean reset) { + List list = new ArrayList(this.uriStatMap.size()); - data.put("JdbcCommitCount", this.getJdbcCommitCount()); - data.put("JdbcRollbackCount", this.getJdbcRollbackCount()); - - data.put("JdbcExecuteCount", this.getJdbcExecuteCount()); - data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis()); - data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount()); - data.put("JdbcUpdateCount", this.getJdbcUpdateCount()); - - data.put("OSMacOSXCount", this.getOSMacOSXCount()); - data.put("OSWindowsCount", this.getOSWindowsCount()); - data.put("OSLinuxCount", this.getOSLinuxCount()); - data.put("OSSymbianCount", this.getOSSymbianCount()); - data.put("OSFreeBSDCount", this.getOSFreeBSDCount()); - data.put("OSOpenBSDCount", this.getOSOpenBSDCount()); - data.put("OSAndroidCount", this.getOSAndroidCount()); - data.put("OSWindows98Count", this.getOSWindows98Count()); - data.put("OSWindowsXPCount", this.getOSWindowsXPCount()); - data.put("OSWindows2000Count", this.getOSWindows2000Count()); - data.put("OSWindowsVistaCount", this.getOSWindowsVistaCount()); - data.put("OSWindows7Count", this.getOSWindows7Count()); - data.put("OSWindows8Count", this.getOSWindows8Count()); - - data.put("OSAndroid15Count", this.getOSAndroid15Count()); - data.put("OSAndroid16Count", this.getOSAndroid16Count()); - data.put("OSAndroid20Count", this.getOSAndroid20Count()); - data.put("OSAndroid21Count", this.getOSAndroid21Count()); - data.put("OSAndroid22Count", this.getOSAndroid22Count()); - data.put("OSAndroid23Count", this.getOSAndroid23Count()); - data.put("OSAndroid30Count", this.getOSAndroid30Count()); - data.put("OSAndroid31Count", this.getOSAndroid31Count()); - data.put("OSAndroid32Count", this.getOSAndroid32Count()); - data.put("OSAndroid40Count", this.getOSAndroid40Count()); - data.put("OSAndroid41Count", this.getOSAndroid41Count()); - data.put("OSAndroid42Count", this.getOSAndroid42Count()); - data.put("OSAndroid43Count", this.getOSAndroid43Count()); - data.put("OSLinuxUbuntuCount", this.getOSLinuxUbuntuCount()); - - data.put("BrowserIECount", this.getBrowserIECount()); - data.put("BrowserFirefoxCount", this.getBrowserFirefoxCount()); - data.put("BrowserChromeCount", this.getBrowserChromeCount()); - data.put("BrowserSafariCount", this.getBrowserSafariCount()); - data.put("BrowserOperaCount", this.getBrowserOperaCount()); - - data.put("BrowserIE5Count", this.getBrowserIE5Count()); - data.put("BrowserIE6Count", this.getBrowserIE6Count()); - data.put("BrowserIE7Count", this.getBrowserIE7Count()); - data.put("BrowserIE8Count", this.getBrowserIE8Count()); - data.put("BrowserIE9Count", this.getBrowserIE9Count()); - data.put("BrowserIE10Count", this.getBrowserIE10Count()); - - data.put("Browser360SECount", this.getBrowser360SECount()); - data.put("DeviceAndroidCount", this.getDeviceAndroidCount()); - data.put("DeviceIpadCount", this.getDeviceIpadCount()); - data.put("DeviceIphoneCount", this.getDeviceIphoneCount()); - data.put("DeviceWindowsPhoneCount", this.getDeviceWindowsPhoneCount()); - - data.put("BotCount", this.getBotCount()); - data.put("BotBaiduCount", this.getBotBaiduCount()); - data.put("BotYoudaoCount", this.getBotYoudaoCount()); - data.put("BotGoogleCount", this.getBotGoogleCount()); - data.put("BotMsnCount", this.getBotMsnCount()); - data.put("BotBingCount", this.getBotBingCount()); - data.put("BotSosoCount", this.getBotSosoCount()); - data.put("BotSogouCount", this.getBotSogouCount()); - data.put("BotYahooCount", this.getBotYahooCount()); - - return data; + for (WebURIStat uriStat : this.uriStatMap.values()) { + WebURIStatValue statValue = uriStat.getValue(reset); + + if (statValue.getRunningCount() == 0 && statValue.getRequestCount() == 0) { + continue; + } + list.add(statValue); + } + + return list; } public List> getURIStatDataList() { @@ -871,7 +812,7 @@ public class WebAppStat { } else if (userAgent.startsWith("Windows NT 6.1", 13)) { osWindows7Count.incrementAndGet(); - + } else if (userAgent.startsWith("Windows NT 6.2", 13)) { osWindows8Count.incrementAndGet(); @@ -913,11 +854,11 @@ public class WebAppStat { isAndroid = userAgent.startsWith("Android", 20); toffset = 28; } - + if (isAndroid) { osAndroidCount.incrementAndGet(); deviceAndroidCount.incrementAndGet(); - + if (userAgent.startsWith("1.5", toffset)) { osAndroid15Count.incrementAndGet(); } else if (userAgent.startsWith("1.6", toffset)) { @@ -1001,7 +942,7 @@ public class WebAppStat { public long getOSWindows7Count() { return osWindows7Count.get(); } - + public long getOSWindows8Count() { return osWindows8Count.get(); } @@ -1045,15 +986,15 @@ public class WebAppStat { public long getOSAndroid40Count() { return osAndroid40Count.get(); } - + public long getOSAndroid41Count() { return osAndroid41Count.get(); } - + public long getOSAndroid42Count() { return osAndroid42Count.get(); } - + public long getOSAndroid43Count() { return osAndroid43Count.get(); } @@ -1162,4 +1103,81 @@ public class WebAppStat { return botYahooCount.get(); } + public WebAppStatValue getStatValue(boolean reset) { + WebAppStatValue val = new WebAppStatValue(); + val.setContextPath(contextPath); + + val.setRunningCount(getRunningCount()); + val.concurrentMax = get(concurrentMax, reset); + val.requestCount = get(requestCount, reset); + val.sessionCount = get(sessionCount, reset); + val.jdbcFetchRowCount = get(jdbcFetchRowCount, reset); + val.jdbcUpdateCount = get(jdbcUpdateCount, reset); + val.jdbcExecuteCount = get(jdbcExecuteCount, reset); + val.jdbcExecuteTimeNano = get(jdbcExecuteTimeNano, reset); + val.jdbcCommitCount = get(jdbcCommitCount, reset); + val.jdbcRollbackCount = get(jdbcRollbackCount, reset); + + val.osMacOSXCount = get(osMacOSXCount, reset); + val.osWindowsCount = get(osWindowsCount, reset); + val.osLinuxCount = get(osLinuxCount, reset); + val.osSymbianCount = get(osSymbianCount, reset); + val.osFreeBSDCount = get(osFreeBSDCount, reset); + val.osOpenBSDCount = get(osOpenBSDCount, reset); + val.osAndroidCount = get(osAndroidCount, reset); + + val.osWindows98Count = get(osWindows98Count, reset); + val.osWindowsXPCount = get(osWindowsXPCount, reset); + val.osWindows2000Count = get(osWindows2000Count, reset); + val.osWindowsVistaCount = get(osWindowsVistaCount, reset); + val.osWindows7Count = get(osWindows7Count, reset); + val.osWindows8Count = get(osWindows8Count, reset); + + val.osAndroid15Count = get(osAndroid15Count, reset); + val.osAndroid16Count = get(osAndroid16Count, reset); + val.osAndroid20Count = get(osAndroid20Count, reset); + val.osAndroid21Count = get(osAndroid21Count, reset); + val.osAndroid22Count = get(osAndroid22Count, reset); + val.osAndroid23Count = get(osAndroid23Count, reset); + val.osAndroid30Count = get(osAndroid30Count, reset); + val.osAndroid31Count = get(osAndroid31Count, reset); + val.osAndroid32Count = get(osAndroid32Count, reset); + val.osAndroid40Count = get(osAndroid40Count, reset); + val.osAndroid41Count = get(osAndroid41Count, reset); + val.osAndroid42Count = get(osAndroid42Count, reset); + val.osAndroid43Count = get(osAndroid43Count, reset); + + val.osLinuxUbuntuCount = get(osLinuxUbuntuCount, reset); + + val.browserIECount = get(browserIECount, reset); + val.browserFirefoxCount = get(browserFirefoxCount, reset); + val.browserChromeCount = get(browserChromeCount, reset); + val.browserSafariCount = get(browserSafariCount, reset); + val.browserOperaCount = get(browserOperaCount, reset); + + val.browserIE5Count = get(browserIE5Count, reset); + val.browserIE6Count = get(browserIE6Count, reset); + val.browserIE7Count = get(browserIE7Count, reset); + val.browserIE8Count = get(browserIE8Count, reset); + val.browserIE9Count = get(browserIE9Count, reset); + val.browserIE10Count = get(browserIE10Count, reset); + + val.browser360SECount = get(browser360SECount, reset); + val.deviceAndroidCount = get(deviceAndroidCount, reset); + val.deviceIpadCount = get(deviceIpadCount, reset); + val.deviceIphoneCount = get(deviceIphoneCount, reset); + val.deviceWindowsPhoneCount = get(deviceWindowsPhoneCount, reset); + + val.botCount = get(botCount, reset); + val.botBaiduCount = get(botBaiduCount, reset); + val.botYoudaoCount = get(botYoudaoCount, reset); + val.botGoogleCount = get(botGoogleCount, reset); + val.botMsnCount = get(botMsnCount, reset); + val.botBingCount = get(botBingCount, reset); + val.botSosoCount = get(botSosoCount, reset); + val.botSogouCount = get(botSogouCount, reset); + val.botYahooCount = get(botYahooCount, reset); + + return val; + } } diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatValue.java b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatValue.java new file mode 100644 index 0000000000..50dde9f616 --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatValue.java @@ -0,0 +1,683 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.support.http.stat; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class WebAppStatValue { + + String contextPath; + + int runningCount; + int concurrentMax; + long requestCount; + long sessionCount; + + long jdbcFetchRowCount; + long jdbcUpdateCount; + long jdbcExecuteCount; + long jdbcExecuteTimeNano; + long jdbcCommitCount; + long jdbcRollbackCount; + + long osMacOSXCount; + long osWindowsCount; + long osLinuxCount; + long osSymbianCount; + long osFreeBSDCount; + long osOpenBSDCount; + long osAndroidCount; + + long osWindows98Count; + long osWindowsXPCount; + long osWindows2000Count; + long osWindowsVistaCount; + long osWindows7Count; + long osWindows8Count; + + long osAndroid15Count; + long osAndroid16Count; + long osAndroid20Count; + long osAndroid21Count; + long osAndroid22Count; + long osAndroid23Count; + long osAndroid30Count; + long osAndroid31Count; + long osAndroid32Count; + long osAndroid40Count; + long osAndroid41Count; + long osAndroid42Count; + long osAndroid43Count; + + long osLinuxUbuntuCount; + + long browserIECount; + long browserFirefoxCount; + long browserChromeCount; + long browserSafariCount; + long browserOperaCount; + + long browserIE5Count; + long browserIE6Count; + long browserIE7Count; + long browserIE8Count; + long browserIE9Count; + long browserIE10Count; + + long browser360SECount; + long deviceAndroidCount; + long deviceIpadCount; + long deviceIphoneCount; + long deviceWindowsPhoneCount; + + long botCount; + long botBaiduCount; + long botYoudaoCount; + long botGoogleCount; + long botMsnCount; + long botBingCount; + long botSosoCount; + long botSogouCount; + long botYahooCount; + + public String getContextPath() { + return contextPath; + } + + public void setContextPath(String contextPath) { + this.contextPath = contextPath; + } + + public int getRunningCount() { + return runningCount; + } + + public void setRunningCount(int runningCount) { + this.runningCount = runningCount; + } + + public int getConcurrentMax() { + return concurrentMax; + } + + public void setConcurrentMax(int concurrentMax) { + this.concurrentMax = concurrentMax; + } + + public long getRequestCount() { + return requestCount; + } + + public void setRequestCount(long requestCount) { + this.requestCount = requestCount; + } + + public long getSessionCount() { + return sessionCount; + } + + public void setSessionCount(long sessionCount) { + this.sessionCount = sessionCount; + } + + public long getJdbcFetchRowCount() { + return jdbcFetchRowCount; + } + + public void setJdbcFetchRowCount(long jdbcFetchRowCount) { + this.jdbcFetchRowCount = jdbcFetchRowCount; + } + + public long getJdbcUpdateCount() { + return jdbcUpdateCount; + } + + public void setJdbcUpdateCount(long jdbcUpdateCount) { + this.jdbcUpdateCount = jdbcUpdateCount; + } + + public long getJdbcExecuteCount() { + return jdbcExecuteCount; + } + + public void setJdbcExecuteCount(long jdbcExecuteCount) { + this.jdbcExecuteCount = jdbcExecuteCount; + } + + public long getJdbcExecuteTimeNano() { + return jdbcExecuteTimeNano; + } + + public void setJdbcExecuteTimeNano(long jdbcExecuteTimeNano) { + this.jdbcExecuteTimeNano = jdbcExecuteTimeNano; + } + + public long getJdbcCommitCount() { + return jdbcCommitCount; + } + + public void setJdbcCommitCount(long jdbcCommitCount) { + this.jdbcCommitCount = jdbcCommitCount; + } + + public long getJdbcRollbackCount() { + return jdbcRollbackCount; + } + + public void setJdbcRollbackCount(long jdbcRollbackCount) { + this.jdbcRollbackCount = jdbcRollbackCount; + } + + public long getOsMacOSXCount() { + return osMacOSXCount; + } + + public void setOsMacOSXCount(long osMacOSXCount) { + this.osMacOSXCount = osMacOSXCount; + } + + public long getOsWindowsCount() { + return osWindowsCount; + } + + public void setOsWindowsCount(long osWindowsCount) { + this.osWindowsCount = osWindowsCount; + } + + public long getOsLinuxCount() { + return osLinuxCount; + } + + public void setOsLinuxCount(long osLinuxCount) { + this.osLinuxCount = osLinuxCount; + } + + public long getOsSymbianCount() { + return osSymbianCount; + } + + public void setOsSymbianCount(long osSymbianCount) { + this.osSymbianCount = osSymbianCount; + } + + public long getOsFreeBSDCount() { + return osFreeBSDCount; + } + + public void setOsFreeBSDCount(long osFreeBSDCount) { + this.osFreeBSDCount = osFreeBSDCount; + } + + public long getOsOpenBSDCount() { + return osOpenBSDCount; + } + + public void setOsOpenBSDCount(long osOpenBSDCount) { + this.osOpenBSDCount = osOpenBSDCount; + } + + public long getOsAndroidCount() { + return osAndroidCount; + } + + public void setOsAndroidCount(long osAndroidCount) { + this.osAndroidCount = osAndroidCount; + } + + public long getOsWindows98Count() { + return osWindows98Count; + } + + public void setOsWindows98Count(long osWindows98Count) { + this.osWindows98Count = osWindows98Count; + } + + public long getOsWindowsXPCount() { + return osWindowsXPCount; + } + + public void setOsWindowsXPCount(long osWindowsXPCount) { + this.osWindowsXPCount = osWindowsXPCount; + } + + public long getOsWindows2000Count() { + return osWindows2000Count; + } + + public void setOsWindows2000Count(long osWindows2000Count) { + this.osWindows2000Count = osWindows2000Count; + } + + public long getOsWindowsVistaCount() { + return osWindowsVistaCount; + } + + public void setOsWindowsVistaCount(long osWindowsVistaCount) { + this.osWindowsVistaCount = osWindowsVistaCount; + } + + public long getOsWindows7Count() { + return osWindows7Count; + } + + public void setOsWindows7Count(long osWindows7Count) { + this.osWindows7Count = osWindows7Count; + } + + public long getOsWindows8Count() { + return osWindows8Count; + } + + public void setOsWindows8Count(long osWindows8Count) { + this.osWindows8Count = osWindows8Count; + } + + public long getOsAndroid15Count() { + return osAndroid15Count; + } + + public void setOsAndroid15Count(long osAndroid15Count) { + this.osAndroid15Count = osAndroid15Count; + } + + public long getOsAndroid16Count() { + return osAndroid16Count; + } + + public void setOsAndroid16Count(long osAndroid16Count) { + this.osAndroid16Count = osAndroid16Count; + } + + public long getOsAndroid20Count() { + return osAndroid20Count; + } + + public void setOsAndroid20Count(long osAndroid20Count) { + this.osAndroid20Count = osAndroid20Count; + } + + public long getOsAndroid21Count() { + return osAndroid21Count; + } + + public void setOsAndroid21Count(long osAndroid21Count) { + this.osAndroid21Count = osAndroid21Count; + } + + public long getOsAndroid22Count() { + return osAndroid22Count; + } + + public void setOsAndroid22Count(long osAndroid22Count) { + this.osAndroid22Count = osAndroid22Count; + } + + public long getOsAndroid23Count() { + return osAndroid23Count; + } + + public void setOsAndroid23Count(long osAndroid23Count) { + this.osAndroid23Count = osAndroid23Count; + } + + public long getOsAndroid30Count() { + return osAndroid30Count; + } + + public void setOsAndroid30Count(long osAndroid30Count) { + this.osAndroid30Count = osAndroid30Count; + } + + public long getOsAndroid31Count() { + return osAndroid31Count; + } + + public void setOsAndroid31Count(long osAndroid31Count) { + this.osAndroid31Count = osAndroid31Count; + } + + public long getOsAndroid32Count() { + return osAndroid32Count; + } + + public void setOsAndroid32Count(long osAndroid32Count) { + this.osAndroid32Count = osAndroid32Count; + } + + public long getOsAndroid40Count() { + return osAndroid40Count; + } + + public void setOsAndroid40Count(long osAndroid40Count) { + this.osAndroid40Count = osAndroid40Count; + } + + public long getOsAndroid41Count() { + return osAndroid41Count; + } + + public void setOsAndroid41Count(long osAndroid41Count) { + this.osAndroid41Count = osAndroid41Count; + } + + public long getOsAndroid42Count() { + return osAndroid42Count; + } + + public void setOsAndroid42Count(long osAndroid42Count) { + this.osAndroid42Count = osAndroid42Count; + } + + public long getOsAndroid43Count() { + return osAndroid43Count; + } + + public void setOsAndroid43Count(long osAndroid43Count) { + this.osAndroid43Count = osAndroid43Count; + } + + public long getOsLinuxUbuntuCount() { + return osLinuxUbuntuCount; + } + + public void setOsLinuxUbuntuCount(long osLinuxUbuntuCount) { + this.osLinuxUbuntuCount = osLinuxUbuntuCount; + } + + public long getBrowserIECount() { + return browserIECount; + } + + public void setBrowserIECount(long browserIECount) { + this.browserIECount = browserIECount; + } + + public long getBrowserFirefoxCount() { + return browserFirefoxCount; + } + + public void setBrowserFirefoxCount(long browserFirefoxCount) { + this.browserFirefoxCount = browserFirefoxCount; + } + + public long getBrowserChromeCount() { + return browserChromeCount; + } + + public void setBrowserChromeCount(long browserChromeCount) { + this.browserChromeCount = browserChromeCount; + } + + public long getBrowserSafariCount() { + return browserSafariCount; + } + + public void setBrowserSafariCount(long browserSafariCount) { + this.browserSafariCount = browserSafariCount; + } + + public long getBrowserOperaCount() { + return browserOperaCount; + } + + public void setBrowserOperaCount(long browserOperaCount) { + this.browserOperaCount = browserOperaCount; + } + + public long getBrowserIE5Count() { + return browserIE5Count; + } + + public void setBrowserIE5Count(long browserIE5Count) { + this.browserIE5Count = browserIE5Count; + } + + public long getBrowserIE6Count() { + return browserIE6Count; + } + + public void setBrowserIE6Count(long browserIE6Count) { + this.browserIE6Count = browserIE6Count; + } + + public long getBrowserIE7Count() { + return browserIE7Count; + } + + public void setBrowserIE7Count(long browserIE7Count) { + this.browserIE7Count = browserIE7Count; + } + + public long getBrowserIE8Count() { + return browserIE8Count; + } + + public void setBrowserIE8Count(long browserIE8Count) { + this.browserIE8Count = browserIE8Count; + } + + public long getBrowserIE9Count() { + return browserIE9Count; + } + + public void setBrowserIE9Count(long browserIE9Count) { + this.browserIE9Count = browserIE9Count; + } + + public long getBrowserIE10Count() { + return browserIE10Count; + } + + public void setBrowserIE10Count(long browserIE10Count) { + this.browserIE10Count = browserIE10Count; + } + + public long getBrowser360SECount() { + return browser360SECount; + } + + public void setBrowser360SECount(long browser360seCount) { + browser360SECount = browser360seCount; + } + + public long getDeviceAndroidCount() { + return deviceAndroidCount; + } + + public void setDeviceAndroidCount(long deviceAndroidCount) { + this.deviceAndroidCount = deviceAndroidCount; + } + + public long getDeviceIpadCount() { + return deviceIpadCount; + } + + public void setDeviceIpadCount(long deviceIpadCount) { + this.deviceIpadCount = deviceIpadCount; + } + + public long getDeviceIphoneCount() { + return deviceIphoneCount; + } + + public void setDeviceIphoneCount(long deviceIphoneCount) { + this.deviceIphoneCount = deviceIphoneCount; + } + + public long getDeviceWindowsPhoneCount() { + return deviceWindowsPhoneCount; + } + + public void setDeviceWindowsPhoneCount(long deviceWindowsPhoneCount) { + this.deviceWindowsPhoneCount = deviceWindowsPhoneCount; + } + + public long getBotCount() { + return botCount; + } + + public void setBotCount(long botCount) { + this.botCount = botCount; + } + + public long getBotBaiduCount() { + return botBaiduCount; + } + + public void setBotBaiduCount(long botBaiduCount) { + this.botBaiduCount = botBaiduCount; + } + + public long getBotYoudaoCount() { + return botYoudaoCount; + } + + public void setBotYoudaoCount(long botYoudaoCount) { + this.botYoudaoCount = botYoudaoCount; + } + + public long getBotGoogleCount() { + return botGoogleCount; + } + + public void setBotGoogleCount(long botGoogleCount) { + this.botGoogleCount = botGoogleCount; + } + + public long getBotMsnCount() { + return botMsnCount; + } + + public void setBotMsnCount(long botMsnCount) { + this.botMsnCount = botMsnCount; + } + + public long getBotBingCount() { + return botBingCount; + } + + public void setBotBingCount(long botBingCount) { + this.botBingCount = botBingCount; + } + + public long getBotSosoCount() { + return botSosoCount; + } + + public void setBotSosoCount(long botSosoCount) { + this.botSosoCount = botSosoCount; + } + + public long getBotSogouCount() { + return botSogouCount; + } + + public void setBotSogouCount(long botSogouCount) { + this.botSogouCount = botSogouCount; + } + + public long getBotYahooCount() { + return botYahooCount; + } + + public void setBotYahooCount(long botYahooCount) { + this.botYahooCount = botYahooCount; + } + + public long getJdbcExecuteTimeMillis() { + return getJdbcExecuteTimeNano() / (1000 * 1000); + } + + public Map getStatData() { + Map data = new LinkedHashMap(); + + data.put("ContextPath", this.getContextPath()); + data.put("RunningCount", this.getRunningCount()); + data.put("ConcurrentMax", this.getConcurrentMax()); + data.put("RequestCount", this.getRequestCount()); + data.put("SessionCount", this.getSessionCount()); + + data.put("JdbcCommitCount", this.getJdbcCommitCount()); + data.put("JdbcRollbackCount", this.getJdbcRollbackCount()); + + data.put("JdbcExecuteCount", this.getJdbcExecuteCount()); + data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis()); + data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount()); + data.put("JdbcUpdateCount", this.getJdbcUpdateCount()); + + data.put("OSMacOSXCount", this.getOsMacOSXCount()); + data.put("OSWindowsCount", this.getOsWindowsCount()); + data.put("OSLinuxCount", this.getOsLinuxCount()); + data.put("OSSymbianCount", this.getOsSymbianCount()); + data.put("OSFreeBSDCount", this.getOsFreeBSDCount()); + data.put("OSOpenBSDCount", this.getOsOpenBSDCount()); + data.put("OSAndroidCount", this.getOsAndroidCount()); + data.put("OSWindows98Count", this.getOsWindows98Count()); + data.put("OSWindowsXPCount", this.getOsWindowsXPCount()); + data.put("OSWindows2000Count", this.getOsWindows2000Count()); + data.put("OSWindowsVistaCount", this.getOsWindowsVistaCount()); + data.put("OSWindows7Count", this.getOsWindows7Count()); + data.put("OSWindows8Count", this.getOsWindows8Count()); + + data.put("OSAndroid15Count", this.getOsAndroid15Count()); + data.put("OSAndroid16Count", this.getOsAndroid16Count()); + data.put("OSAndroid20Count", this.getOsAndroid20Count()); + data.put("OSAndroid21Count", this.getOsAndroid21Count()); + data.put("OSAndroid22Count", this.getOsAndroid22Count()); + data.put("OSAndroid23Count", this.getOsAndroid23Count()); + data.put("OSAndroid30Count", this.getOsAndroid30Count()); + data.put("OSAndroid31Count", this.getOsAndroid31Count()); + data.put("OSAndroid32Count", this.getOsAndroid32Count()); + data.put("OSAndroid40Count", this.getOsAndroid40Count()); + data.put("OSAndroid41Count", this.getOsAndroid41Count()); + data.put("OSAndroid42Count", this.getOsAndroid42Count()); + data.put("OSAndroid43Count", this.getOsAndroid43Count()); + data.put("OSLinuxUbuntuCount", this.getOsLinuxUbuntuCount()); + + data.put("BrowserIECount", this.getBrowserIECount()); + data.put("BrowserFirefoxCount", this.getBrowserFirefoxCount()); + data.put("BrowserChromeCount", this.getBrowserChromeCount()); + data.put("BrowserSafariCount", this.getBrowserSafariCount()); + data.put("BrowserOperaCount", this.getBrowserOperaCount()); + + data.put("BrowserIE5Count", this.getBrowserIE5Count()); + data.put("BrowserIE6Count", this.getBrowserIE6Count()); + data.put("BrowserIE7Count", this.getBrowserIE7Count()); + data.put("BrowserIE8Count", this.getBrowserIE8Count()); + data.put("BrowserIE9Count", this.getBrowserIE9Count()); + data.put("BrowserIE10Count", this.getBrowserIE10Count()); + + data.put("Browser360SECount", this.getBrowser360SECount()); + data.put("DeviceAndroidCount", this.getDeviceAndroidCount()); + data.put("DeviceIpadCount", this.getDeviceIpadCount()); + data.put("DeviceIphoneCount", this.getDeviceIphoneCount()); + data.put("DeviceWindowsPhoneCount", this.getDeviceWindowsPhoneCount()); + + data.put("BotCount", this.getBotCount()); + data.put("BotBaiduCount", this.getBotBaiduCount()); + data.put("BotYoudaoCount", this.getBotYoudaoCount()); + data.put("BotGoogleCount", this.getBotGoogleCount()); + data.put("BotMsnCount", this.getBotMsnCount()); + data.put("BotBingCount", this.getBotBingCount()); + data.put("BotSosoCount", this.getBotSosoCount()); + data.put("BotSogouCount", this.getBotSogouCount()); + data.put("BotYahooCount", this.getBotYahooCount()); + + return data; + } + +} diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java index 0a5fc3eaa3..60a9fb372a 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java @@ -15,8 +15,8 @@ */ package com.alibaba.druid.support.http.stat; -import java.util.Date; -import java.util.LinkedHashMap; +import static com.alibaba.druid.util.JdbcSqlStatUtils.get; + import java.util.Map; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.atomic.AtomicLongFieldUpdater; @@ -154,14 +154,6 @@ public class WebSessionStat { return createTimeMillis; } - public Date getCreateTime() { - if (createTimeMillis == -1L) { - return null; - } - - return new Date(createTimeMillis); - } - public String getPrincipal() { return principal; } @@ -178,14 +170,6 @@ public class WebSessionStat { return lastAccessTimeMillis; } - public Date getLastAccessTime() { - if (lastAccessTimeMillis < 0L) { - return null; - } - - return new Date(lastAccessTimeMillis); - } - public String getRemoteAddress() { return remoteAddresses; } @@ -307,10 +291,6 @@ public class WebSessionStat { return requestTimeNano; } - public long getRequestTimeMillis() { - return getRequestTimeNano() / (1000 * 1000); - } - public void addJdbcFetchRowCount(long delta) { jdbcFetchRowCountUpdater.addAndGet(this, delta); } @@ -339,10 +319,6 @@ public class WebSessionStat { return jdbcExecuteCount; } - public long getJdbcExecuteTimeMillis() { - return getJdbcExecuteTimeNano() / (1000 * 1000); - } - public long getJdbcExecuteTimeNano() { return jdbcExecuteTimeNano; } @@ -391,30 +367,40 @@ public class WebSessionStat { } public Map getStatData() { - Map data = new LinkedHashMap(); + return getValue(false).getStatData(); + } - data.put("SESSIONID", this.getSessionId()); - data.put("Principal", this.getPrincipal()); - data.put("RunningCount", this.getRunningCount()); - data.put("ConcurrentMax", this.getConcurrentMax()); - data.put("RequestCount", this.getRequestCount()); - data.put("RequestTimeMillisTotal", this.getRequestTimeMillis()); - data.put("CreateTime", this.getCreateTime()); - data.put("LastAccessTime", this.getLastAccessTime()); - data.put("RemoteAddress", this.getRemoteAddress()); - data.put("Principal", this.getPrincipal()); + public WebSessionStatValue getValue(boolean reset) { + WebSessionStatValue val = new WebSessionStatValue(); - data.put("JdbcCommitCount", this.getJdbcCommitCount()); - data.put("JdbcRollbackCount", this.getJdbcRollbackCount()); + val.sessionId = sessionId; + val.runningCount = this.getRunningCount(); + val.concurrentMax = get(this, concurrentMaxUpdater, reset); + val.requestErrorCount = get(this, requestErrorCountUpdater, reset); + val.requestTimeNano = get(this, requestTimeNanoUpdater, reset); + val.jdbcFetchRowCount = get(this, jdbcFetchRowCountUpdater, reset); + val.jdbcUpdateCount = get(this, jdbcUpdateCountUpdater, reset); + val.jdbcExecuteCount = get(this, jdbcExecuteCountUpdater, reset); + val.jdbcExecuteTimeNano = get(this, jdbcExecuteTimeNanoUpdater, reset); + val.jdbcCommitCount = get(this, jdbcCommitCountUpdater, reset); + val.jdbcRollbackCount = get(this, jdbcRollbackCountUpdater, reset); + val.createTimeMillis = createTimeMillis; + val.lastAccessTimeMillis = lastAccessTimeMillis; + val.remoteAddresse = remoteAddresses; + val.principal = principal; + val.userAgent = userAgent; - data.put("JdbcExecuteCount", this.getJdbcExecuteCount()); - data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis()); - data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount()); - data.put("JdbcUpdateCount", this.getJdbcUpdateCount()); + val.requestIntervalHistogram_0_1 = get(this, requestIntervalHistogram_0_1_Updater, reset); + val.requestIntervalHistogram_1_10 = get(this, requestIntervalHistogram_1_10_Updater, reset); + val.requestIntervalHistogram_10_100 = get(this, requestIntervalHistogram_10_100_Updater, reset); + val.requestIntervalHistogram_100_1000 = get(this, requestIntervalHistogram_100_1000_Updater, reset); + val.requestIntervalHistogram_1000_10000 = get(this, requestIntervalHistogram_1000_10000_Updater, reset); + val.requestIntervalHistogram_10000_100000 = get(this, requestIntervalHistogram_10000_100000_Updater, reset); + val.requestIntervalHistogram_100000_1000000 = get(this, requestIntervalHistogram_100000_1000000_Updater, reset); + val.requestIntervalHistogram_1000000_10000000 = get(this, requestIntervalHistogram_1000000_10000000_Updater, + reset); + val.requestIntervalHistogram_10000000_more = get(this, requestIntervalHistogram_10000000_more_Updater, reset); - data.put("UserAgent", this.getUserAgent()); - data.put("RequestInterval", this.getRequestInterval()); - - return data; + return val; } } diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStatValue.java b/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStatValue.java new file mode 100644 index 0000000000..4fff026ebc --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStatValue.java @@ -0,0 +1,255 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.support.http.stat; + +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.Map; + +public class WebSessionStatValue { + + String sessionId; + + int runningCount; + int concurrentMax; + long requestCount; + long requestErrorCount; + long requestTimeNano; + long jdbcFetchRowCount; + long jdbcUpdateCount; + long jdbcExecuteCount; + long jdbcExecuteTimeNano; + long jdbcCommitCount; + long jdbcRollbackCount; + long createTimeMillis; + long lastAccessTimeMillis; + String remoteAddresse; + String principal; + String userAgent; + + int requestIntervalHistogram_0_1; + int requestIntervalHistogram_1_10; + int requestIntervalHistogram_10_100; + int requestIntervalHistogram_100_1000; + int requestIntervalHistogram_1000_10000; + int requestIntervalHistogram_10000_100000; + int requestIntervalHistogram_100000_1000000; + int requestIntervalHistogram_1000000_10000000; + int requestIntervalHistogram_10000000_more; + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public int getRunningCount() { + return runningCount; + } + + public void setRunningCount(int runningCount) { + this.runningCount = runningCount; + } + + public int getConcurrentMax() { + return concurrentMax; + } + + public void setConcurrentMax(int concurrentMax) { + this.concurrentMax = concurrentMax; + } + + public long getRequestCount() { + return requestCount; + } + + public void setRequestCount(long requestCount) { + this.requestCount = requestCount; + } + + public long getRequestErrorCount() { + return requestErrorCount; + } + + public void setRequestErrorCount(long requestErrorCount) { + this.requestErrorCount = requestErrorCount; + } + + public long getRequestTimeNano() { + return requestTimeNano; + } + + public void setRequestTimeNano(long requestTimeNano) { + this.requestTimeNano = requestTimeNano; + } + + public long getJdbcFetchRowCount() { + return jdbcFetchRowCount; + } + + public void setJdbcFetchRowCount(long jdbcFetchRowCount) { + this.jdbcFetchRowCount = jdbcFetchRowCount; + } + + public long getJdbcUpdateCount() { + return jdbcUpdateCount; + } + + public void setJdbcUpdateCount(long jdbcUpdateCount) { + this.jdbcUpdateCount = jdbcUpdateCount; + } + + public long getJdbcExecuteCount() { + return jdbcExecuteCount; + } + + public void setJdbcExecuteCount(long jdbcExecuteCount) { + this.jdbcExecuteCount = jdbcExecuteCount; + } + + public long getJdbcExecuteTimeNano() { + return jdbcExecuteTimeNano; + } + + public void setJdbcExecuteTimeNano(long jdbcExecuteTimeNano) { + this.jdbcExecuteTimeNano = jdbcExecuteTimeNano; + } + + public long getJdbcCommitCount() { + return jdbcCommitCount; + } + + public void setJdbcCommitCount(long jdbcCommitCount) { + this.jdbcCommitCount = jdbcCommitCount; + } + + public long getJdbcRollbackCount() { + return jdbcRollbackCount; + } + + public void setJdbcRollbackCount(long jdbcRollbackCount) { + this.jdbcRollbackCount = jdbcRollbackCount; + } + + public long getCreateTimeMillis() { + return createTimeMillis; + } + + public void setCreateTimeMillis(long createTimeMillis) { + this.createTimeMillis = createTimeMillis; + } + + public long getLastAccessTimeMillis() { + return lastAccessTimeMillis; + } + + public void setLastAccessTimeMillis(long lastAccessTimeMillis) { + this.lastAccessTimeMillis = lastAccessTimeMillis; + } + + public String getRemoteAddresse() { + return remoteAddresse; + } + + public void setRemoteAddresse(String remoteAddresses) { + this.remoteAddresse = remoteAddresses; + } + + public String getPrincipal() { + return principal; + } + + public void setPrincipal(String principal) { + this.principal = principal; + } + + public String getUserAgent() { + return userAgent; + } + + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + } + + public long getRequestTimeMillis() { + return getRequestTimeNano() / (1000 * 1000); + } + + public Date getCreateTime() { + if (createTimeMillis == -1L) { + return null; + } + + return new Date(createTimeMillis); + } + + public Date getLastAccessTime() { + if (lastAccessTimeMillis < 0L) { + return null; + } + + return new Date(lastAccessTimeMillis); + } + + public long getJdbcExecuteTimeMillis() { + return getJdbcExecuteTimeNano() / (1000 * 1000); + } + + public long[] getRequestInterval() { + return new long[] { + // + requestIntervalHistogram_0_1, // + requestIntervalHistogram_1_10, // + requestIntervalHistogram_10_100, // + requestIntervalHistogram_100_1000, // + requestIntervalHistogram_1000_10000, // + requestIntervalHistogram_10000_100000, // + requestIntervalHistogram_100000_1000000, // + requestIntervalHistogram_1000000_10000000, // + requestIntervalHistogram_10000000_more // + }; + } + + public Map getStatData() { + Map data = new LinkedHashMap(); + + data.put("SESSIONID", this.getSessionId()); + data.put("Principal", this.getPrincipal()); + data.put("RunningCount", this.getRunningCount()); + data.put("ConcurrentMax", this.getConcurrentMax()); + data.put("RequestCount", this.getRequestCount()); + data.put("RequestTimeMillisTotal", this.getRequestTimeMillis()); + data.put("CreateTime", this.getCreateTime()); + data.put("LastAccessTime", this.getLastAccessTime()); + data.put("RemoteAddress", this.getRemoteAddresse()); + data.put("Principal", this.getPrincipal()); + + data.put("JdbcCommitCount", this.getJdbcCommitCount()); + data.put("JdbcRollbackCount", this.getJdbcRollbackCount()); + + data.put("JdbcExecuteCount", this.getJdbcExecuteCount()); + data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis()); + data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount()); + data.put("JdbcUpdateCount", this.getJdbcUpdateCount()); + + data.put("UserAgent", this.getUserAgent()); + data.put("RequestInterval", this.getRequestInterval()); + + return data; + } +} diff --git a/src/main/java/com/alibaba/druid/support/monitor/MonitorContext.java b/src/main/java/com/alibaba/druid/support/monitor/MonitorContext.java index ec9e1b9842..1f8654d8ca 100644 --- a/src/main/java/com/alibaba/druid/support/monitor/MonitorContext.java +++ b/src/main/java/com/alibaba/druid/support/monitor/MonitorContext.java @@ -1,19 +1,31 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.alibaba.druid.support.monitor; import java.util.Date; +import java.util.HashMap; +import java.util.Map; public class MonitorContext { - private String appName; - private Date collectTime; + private final Map atrributes = new HashMap(); - public String getAppName() { - return appName; - } - - public void setAppName(String appName) { - this.appName = appName; - } + private Date collectTime; + private int pid; + private Date startTime; public Date getCollectTime() { return collectTime; @@ -23,4 +35,24 @@ public class MonitorContext { this.collectTime = collectTime; } + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Map getAtrributes() { + return atrributes; + } + + public int getPID() { + return pid; + } + + public void setPID(int pid) { + this.pid = pid; + } + } diff --git a/src/main/java/com/alibaba/druid/support/monitor/MonitorService.java b/src/main/java/com/alibaba/druid/support/monitor/MonitorService.java index b97685a463..e4bbc56116 100644 --- a/src/main/java/com/alibaba/druid/support/monitor/MonitorService.java +++ b/src/main/java/com/alibaba/druid/support/monitor/MonitorService.java @@ -1,10 +1,40 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.alibaba.druid.support.monitor; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidDataSourceStatValue; +import com.alibaba.druid.stat.DruidDataSourceStatManager; +import com.alibaba.druid.support.http.stat.WebAppStat; +import com.alibaba.druid.support.http.stat.WebAppStatManager; +import com.alibaba.druid.support.http.stat.WebAppStatValue; +import com.alibaba.druid.support.http.stat.WebURIStatValue; import com.alibaba.druid.support.monitor.dao.MonitorDao; +import com.alibaba.druid.support.spring.stat.SpringMethodStatValue; +import com.alibaba.druid.support.spring.stat.SpringStat; +import com.alibaba.druid.support.spring.stat.SpringStatManager; +import com.alibaba.druid.util.IOUtils; public class MonitorService { @@ -26,6 +56,7 @@ public class MonitorService { } scheduler.scheduleAtFixedRate(new Runnable() { + @Override public void run() { collectSql(); @@ -33,6 +64,7 @@ public class MonitorService { }, timeBeetweenSqlCollect, timeBeetweenSqlCollect, timeUnit); scheduler.scheduleAtFixedRate(new Runnable() { + @Override public void run() { collectSpringMethod(); @@ -40,6 +72,7 @@ public class MonitorService { }, timeBeetweenSpringCollect, timeBeetweenSpringCollect, timeUnit); scheduler.scheduleAtFixedRate(new Runnable() { + @Override public void run() { collectWebURI(); @@ -55,16 +88,70 @@ public class MonitorService { this.scheduler = scheduler; } + @SuppressWarnings("resource") private void collectSql() { + Set dataSources = DruidDataSourceStatManager.getInstances().keySet(); + List statValueList = new ArrayList(dataSources.size()); + + for (Object item : dataSources) { + if (!(item instanceof DruidDataSource)) { + continue; + } + + DruidDataSource dataSource = (DruidDataSource) item; + DruidDataSourceStatValue statValue = dataSource.getStatValueAndReset(); + statValueList.add(statValue); + } + + MonitorContext ctx = createContext(); + dao.saveSql(ctx, statValueList); + } + + private MonitorContext createContext() { + MonitorContext ctx = new MonitorContext(); + ctx.setCollectTime(new Date()); + ctx.setPID(IOUtils.getPID()); + ctx.setCollectTime(IOUtils.getStartTime()); + return ctx; } private void collectSpringMethod() { + List statValueList = new ArrayList(); + Set stats = SpringStatManager.getInstance().getSpringStatSet(); + + for (Object item : stats) { + if (!(item instanceof SpringStat)) { + continue; + } + + SpringStat sprintStat = (SpringStat) item; + statValueList.addAll(sprintStat.getStatList(true)); + } + + MonitorContext ctx = createContext(); + dao.saveSpringMethod(ctx, statValueList); } private void collectWebURI() { + List webURIValueList = new ArrayList(); + List webAppStatValueList = new ArrayList(); + Set stats = WebAppStatManager.getInstance().getWebAppStatSet(); + + for (Object item : stats) { + if (!(item instanceof WebAppStat)) { + continue; + } + + WebAppStat webAppStat = (WebAppStat) item; + webURIValueList.addAll(webAppStat.getURIStatValueList(true)); + } + + MonitorContext ctx = createContext(); + dao.saveWebURI(ctx, webURIValueList); + dao.saveWebApp(ctx, webAppStatValueList); } public MonitorDao getDao() { diff --git a/src/main/java/com/alibaba/druid/support/monitor/dao/MonitorDao.java b/src/main/java/com/alibaba/druid/support/monitor/dao/MonitorDao.java index b50751e9b9..6de46f3551 100644 --- a/src/main/java/com/alibaba/druid/support/monitor/dao/MonitorDao.java +++ b/src/main/java/com/alibaba/druid/support/monitor/dao/MonitorDao.java @@ -1,17 +1,35 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.alibaba.druid.support.monitor.dao; import java.util.List; -import com.alibaba.druid.stat.JdbcSqlStatValue; +import com.alibaba.druid.pool.DruidDataSourceStatValue; +import com.alibaba.druid.support.http.stat.WebAppStatValue; import com.alibaba.druid.support.http.stat.WebURIStatValue; import com.alibaba.druid.support.monitor.MonitorContext; import com.alibaba.druid.support.spring.stat.SpringMethodStatValue; public interface MonitorDao { - void saveSql(MonitorContext ctx, List sqlList); + void saveSql(MonitorContext ctx, List statList); void saveSpringMethod(MonitorContext ctx, List methodList); void saveWebURI(MonitorContext ctx, List uriList); + + void saveWebApp(MonitorContext ctx, List uriList); } diff --git a/src/main/java/com/alibaba/druid/support/monitor/dao/MonitorDaoJdbcImpl.java b/src/main/java/com/alibaba/druid/support/monitor/dao/MonitorDaoJdbcImpl.java index 1a1683eed2..fa91e8526c 100644 --- a/src/main/java/com/alibaba/druid/support/monitor/dao/MonitorDaoJdbcImpl.java +++ b/src/main/java/com/alibaba/druid/support/monitor/dao/MonitorDaoJdbcImpl.java @@ -1,8 +1,24 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.alibaba.druid.support.monitor.dao; import java.util.List; -import com.alibaba.druid.stat.JdbcSqlStatValue; +import com.alibaba.druid.pool.DruidDataSourceStatValue; +import com.alibaba.druid.support.http.stat.WebAppStatValue; import com.alibaba.druid.support.http.stat.WebURIStatValue; import com.alibaba.druid.support.monitor.MonitorContext; import com.alibaba.druid.support.spring.stat.SpringMethodStatValue; @@ -10,7 +26,7 @@ import com.alibaba.druid.support.spring.stat.SpringMethodStatValue; public class MonitorDaoJdbcImpl implements MonitorDao { @Override - public void saveSql(MonitorContext ctx, List sqlList) { + public void saveSql(MonitorContext ctx, List dataSourceList) { } @@ -24,4 +40,9 @@ public class MonitorDaoJdbcImpl implements MonitorDao { } + @Override + public void saveWebApp(MonitorContext ctx, List uriList) { + + } + } diff --git a/src/main/java/com/alibaba/druid/support/spring/stat/SpringStat.java b/src/main/java/com/alibaba/druid/support/spring/stat/SpringStat.java index 7c6bd20358..fbe169f983 100644 --- a/src/main/java/com/alibaba/druid/support/spring/stat/SpringStat.java +++ b/src/main/java/com/alibaba/druid/support/spring/stat/SpringStat.java @@ -48,6 +48,22 @@ public class SpringStat { return methodStat; } + + public List getStatList(boolean reset) { + List statValueList = new ArrayList(this.methodStats.size()); + + for (SpringMethodStat methodStat : this.methodStats.values()) { + SpringMethodStatValue statValue = methodStat.getStatValue(reset); + + if (statValue.getRunningCount() == 0 && statValue.getExecuteCount() == 0) { + continue; + } + + statValueList.add(statValue); + } + + return statValueList; + } public List> getMethodStatDataList() { List> methodStatDataList = new ArrayList>(this.methodStats.size()); diff --git a/src/main/java/com/alibaba/druid/util/IOUtils.java b/src/main/java/com/alibaba/druid/util/IOUtils.java index 187c4eed9f..67875f3720 100644 --- a/src/main/java/com/alibaba/druid/util/IOUtils.java +++ b/src/main/java/com/alibaba/druid/util/IOUtils.java @@ -24,7 +24,9 @@ import java.io.PrintWriter; import java.io.Reader; import java.io.StringWriter; import java.io.UnsupportedEncodingException; +import java.lang.management.ManagementFactory; import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Properties; public class IOUtils { @@ -221,4 +223,27 @@ public class IOUtils { return null; } } + + private static int pid; + + public final static int getPID() { + if (pid == 0) { + String name = ManagementFactory.getRuntimeMXBean().getName(); + + String[] items = name.split("@"); + + pid = Integer.parseInt(items[0]); + } + + return pid; + } + + private static Date startTime; + + public final static Date getStartTime() { + if (startTime == null) { + startTime = new Date(ManagementFactory.getRuntimeMXBean().getStartTime()); + } + return startTime; + } }