From 6a9ff3898496338fae4d6ced39fa0418ad5ef5ab Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 17 Oct 2012 10:19:32 +0800 Subject: [PATCH] monitor support --- .../druid/stat/DruidStatManagerFacade.java | 64 ++++++---- .../druid/support/monitor/PushService.java | 62 ++++++++++ .../alibaba/druid/pool/ConcurrentTest2.java | 113 ++++++++++++++++++ 3 files changed, 215 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/support/monitor/PushService.java create mode 100644 src/test/java/com/alibaba/druid/pool/ConcurrentTest2.java diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java index 848c8c4979..59ba9b58fd 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -61,7 +61,7 @@ public final class DruidStatManagerFacade { private Set getDruidDataSourceInstances() { return DruidDataSourceStatManager.getInstances().keySet(); } - + public Object getDruidDataSourceByName(String name) { for (Object o : this.getDruidDataSourceInstances()) { String itemName = DruidDataSourceUtils.getName(o); @@ -69,7 +69,7 @@ public final class DruidStatManagerFacade { return o; } } - + return null; } @@ -85,7 +85,7 @@ public final class DruidStatManagerFacade { if (!isResetEnable()) { return; } - + SpringStatManager.getInstance().resetStat(); WebAppStatManager.getInstance().resetStat(); resetSqlStat(); @@ -117,7 +117,7 @@ public final class DruidStatManagerFacade { } Object datasource = getDruidDataSourceById(id); - return datasource == null ? null : dataSourceToMapData(datasource); + return datasource == null ? null : dataSourceToMapData(datasource, false); } public Object getDruidDataSourceById(Integer identity) { @@ -134,26 +134,32 @@ public final class DruidStatManagerFacade { } public List> getSqlStatDataList(Integer dataSourceId) { - List> result = new ArrayList>(); for (Object datasource : getDruidDataSourceInstances()) { if (dataSourceId != null && dataSourceId.intValue() != System.identityHashCode(datasource)) { continue; } - - for (Object sqlStat : DruidDataSourceUtils.getSqlStatMap(datasource).values()) { - Map data = JdbcSqlStatUtils.getData(sqlStat); - - long executeCount = (Long) data.get("ExecuteCount"); - long runningCount = (Long) data.get("RunningCount"); - - if (executeCount == 0 && runningCount == 0) { - continue; - } - - result.add(data); - } + return getSqlStatDataList(datasource); } + + return new ArrayList>(); + } + + public List> getSqlStatDataList(Object datasource) { + List> result = new ArrayList>(); + for (Object sqlStat : DruidDataSourceUtils.getSqlStatMap(datasource).values()) { + Map data = JdbcSqlStatUtils.getData(sqlStat); + + long executeCount = (Long) data.get("ExecuteCount"); + long runningCount = (Long) data.get("RunningCount"); + + if (executeCount == 0 && runningCount == 0) { + continue; + } + + result.add(data); + } + return result; } @@ -172,9 +178,13 @@ public final class DruidStatManagerFacade { } public List> getDataSourceStatDataList() { + return getDataSourceStatDataList(false); + } + + public List> getDataSourceStatDataList(boolean includeSqlList) { List> datasourceList = new ArrayList>(); for (Object dataSource : getDruidDataSourceInstances()) { - datasourceList.add(dataSourceToMapData(dataSource)); + datasourceList.add(dataSourceToMapData(dataSource, includeSqlList)); } return datasourceList; } @@ -183,9 +193,9 @@ public final class DruidStatManagerFacade { List> traceList = new ArrayList>(); for (Object dataSource : getDruidDataSourceInstances()) { List stacks = ((DruidDataSource) dataSource).getActiveConnectionStackTrace(); - if (stacks.size() > 0 ) { - traceList.add(stacks); - } + if (stacks.size() > 0) { + traceList.add(stacks); + } } return traceList; } @@ -236,8 +246,14 @@ public final class DruidStatManagerFacade { return DruidDataSourceUtils.getActiveConnectionStackTrace(datasource); } - private Map dataSourceToMapData(Object dataSource) { + private Map dataSourceToMapData(Object dataSource, boolean includeSql) { + Map map = DruidDataSourceUtils.getStatData(dataSource); - return DruidDataSourceUtils.getStatData(dataSource); + if (includeSql) { + List> sqlList = getSqlStatDataList(dataSource); + map.put("SQL", sqlList); + } + + return map; } } diff --git a/src/main/java/com/alibaba/druid/support/monitor/PushService.java b/src/main/java/com/alibaba/druid/support/monitor/PushService.java new file mode 100644 index 0000000000..90d36c5f2a --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/monitor/PushService.java @@ -0,0 +1,62 @@ +package com.alibaba.druid.support.monitor; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.alibaba.druid.stat.DruidStatManagerFacade; +import com.alibaba.druid.support.http.stat.WebAppStatManager; +import com.alibaba.druid.support.json.JSONUtils; +import com.alibaba.druid.support.spring.stat.SpringStatManager; + +public class PushService { + + private final DruidStatManagerFacade statManagerFacade = DruidStatManagerFacade.getInstance(); + + private String serverUrl; + + private boolean includeSql = true; + + private boolean includeWebApp = true; + private boolean includeWebUri = true; + private boolean includeWebSession = true; + private boolean includeSpring = true; + + public void collect() { + Map data = new HashMap(); + + if (includeSql) { + List> dataSources = statManagerFacade.getDataSourceStatDataList(true); + + data.put("DataSources", dataSources); + } + + if (includeWebApp) { + List> list = WebAppStatManager.getInstance().getWebAppStatData(); + data.put("WebApp", list); + } + + if (includeWebUri) { + List> list = WebAppStatManager.getInstance().getURIStatData(); + + data.put("WebURI", list); + } + + if (includeWebSession) { + List> list = WebAppStatManager.getInstance().getSessionStatData(); + + data.put("WebSession", list); + } + + if (includeSpring) { + List> list = SpringStatManager.getInstance().getMethodStatData(); + + data.put("Spring", list); + } + } + + protected void push(Map data) { + String json = JSONUtils.toJSONString(data); + //TODO URL Connection Post + } +} diff --git a/src/test/java/com/alibaba/druid/pool/ConcurrentTest2.java b/src/test/java/com/alibaba/druid/pool/ConcurrentTest2.java new file mode 100644 index 0000000000..35d94e2329 --- /dev/null +++ b/src/test/java/com/alibaba/druid/pool/ConcurrentTest2.java @@ -0,0 +1,113 @@ +/* + * 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.pool; + +import java.sql.Connection; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.TimeUnit; + +import junit.framework.TestCase; + +import org.junit.Assert; + +public class ConcurrentTest2 extends TestCase { + + private String jdbcUrl; + private String user; + private String password; + private String driverClass; + private int minPoolSize = 1; + private int maxPoolSize = 8; + private int maxActive = 500; + + protected void setUp() throws Exception { + // jdbcUrl = + // "jdbc:mysql://10.20.129.146/dragoon_v25masterdb?useUnicode=true&characterEncoding=UTF-8"; + // user = "dragoon25"; + // password = "dragoon25"; + // driverClass = "com.mysql.jdbc.Driver"; + + jdbcUrl = "jdbc:fake:dragoon_v25masterdb"; + user = "dragoon25"; + password = "dragoon25"; + driverClass = "com.alibaba.druid.mock.MockDriver"; + } + + public void test_concurrent_2() throws Exception { + final DruidDataSource dataSource = new DruidDataSource(); + + Class.forName("com.alibaba.druid.mock.MockDriver"); + + dataSource.setInitialSize(10); + dataSource.setMaxActive(maxActive); + dataSource.setMinIdle(minPoolSize); + dataSource.setMaxIdle(maxPoolSize); + dataSource.setPoolPreparedStatements(true); + dataSource.setDriverClassName(driverClass); + dataSource.setUrl(jdbcUrl); + dataSource.setPoolPreparedStatements(true); + dataSource.setUsername(user); + dataSource.setPassword(password); + dataSource.setMaxWait(1000 * 60 * 1); + + final int THREAD_COUNT = 50; + final int LOOP_COUNT = 1000 * 10; + + final CountDownLatch startLatch = new CountDownLatch(1); + final CountDownLatch endLatch = new CountDownLatch(THREAD_COUNT); + + final CyclicBarrier barrier = new CyclicBarrier(5, new Runnable() { + + @Override + public void run() { + dataSource.shrink(); + } + }); + + for (int threadIndex = 0; threadIndex < THREAD_COUNT; ++threadIndex) { + Thread thread = new Thread() { + + public void run() { + try { + startLatch.await(); + + for (int i = 0; i < LOOP_COUNT; ++i) { + Connection conn = dataSource.getConnection(); + conn.close(); + + barrier.await(10, TimeUnit.SECONDS); + } + } catch (Throwable e) { + e.printStackTrace(); + } finally { + endLatch.countDown(); + } + } + }; + thread.start(); + } + + startLatch.countDown(); + endLatch.await(); + System.out.println("connectCount : " + dataSource.getConnectCount()); + +// Assert.assertEquals(THREAD_COUNT * LOOP_COUNT, dataSource.getConnectCount()); +// Assert.assertEquals(THREAD_COUNT * LOOP_COUNT, dataSource.getCloseCount()); +// Assert.assertEquals(0, dataSource.getConnectErrorCount()); +// Assert.assertEquals(0, dataSource.getActiveCount()); + } +}