From 60f7f2fc4b93c6e89ed0a34c5e02549ecd3a4db6 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 3 Aug 2012 23:32:52 +0800 Subject: [PATCH] add stat service --- .../druid/stat/service/DruidStatService.java | 27 ++-- .../stat/service/DruidStatServiceUtils.java | 40 ++++++ .../druid/stat/service/dto/SqlInfo.java | 130 ++++++++++++++++++ .../druid/bvt/statService/SqlInfoTest.java | 14 ++ 4 files changed, 197 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/stat/service/DruidStatServiceUtils.java create mode 100644 src/test/java/com/alibaba/druid/bvt/statService/SqlInfoTest.java diff --git a/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java b/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java index 0177f2e4ee..33e58815f8 100644 --- a/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java +++ b/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java @@ -2,7 +2,9 @@ package com.alibaba.druid.stat.service; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -68,27 +70,24 @@ public class DruidStatService { Collection sqlStats = dataSource.getDataSourceStat().getSqlStatMap().values(); - List sqlStatInfoList = new ArrayList(sqlStats.size()); + Map sqlStatInfoMap = new HashMap(sqlStats.size()); for (JdbcSqlStat sqlStat : dataSource.getDataSourceStat().getSqlStatMap().values()) { - SqlInfo sqlStatInfo = new SqlInfo(); if (sqlStat.getExecuteCount() == 0 && sqlStat.getRunningCount() == 0) { continue; } - - sqlStatInfo.setSql(sqlStat.getSql()); - sqlStatInfo.setExecuteCount((int) sqlStat.getExecuteCount()); - sqlStatInfo.setRunningCount((int) sqlStat.getRunningCount()); - sqlStatInfo.setConcurrentMax((int) sqlStat.getConcurrentMax()); - sqlStatInfo.setErrorCount((int) sqlStat.getErrorCount()); - sqlStatInfo.setInTransactionCount((int) sqlStat.getInTransactionCount()); - sqlStatInfo.setFetchRowCount(sqlStat.getFetchRowCount()); - sqlStatInfo.setUpdateCount(sqlStat.getUpdateCount()); - - sqlStatInfoList.add(sqlStatInfo); + + SqlInfo sqlStatInfo = DruidStatServiceUtils.createSqlInfo(sqlStat); + + SqlInfo oldsqlStatInfo = sqlStatInfoMap.get(sqlStatInfo.getSql()); + if (oldsqlStatInfo != null) { + oldsqlStatInfo.merge(sqlStatInfo); + } else { + sqlStatInfoMap.put(sqlStatInfo.getSql(), sqlStatInfo); + } } - dataSourceStat.setSqlList(sqlStatInfoList); + dataSourceStat.setSqlList(new ArrayList(sqlStatInfoMap.values())); dataSourceStatList.add(dataSourceStat); } diff --git a/src/main/java/com/alibaba/druid/stat/service/DruidStatServiceUtils.java b/src/main/java/com/alibaba/druid/stat/service/DruidStatServiceUtils.java new file mode 100644 index 0000000000..3ce0a6948d --- /dev/null +++ b/src/main/java/com/alibaba/druid/stat/service/DruidStatServiceUtils.java @@ -0,0 +1,40 @@ +package com.alibaba.druid.stat.service; + +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; +import com.alibaba.druid.stat.JdbcSqlStat; +import com.alibaba.druid.stat.service.dto.SqlInfo; +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; + +public class DruidStatServiceUtils { + + private final static Log LOG = LogFactory.getLog(DruidStatServiceUtils.class); + + public static SqlInfo createSqlInfo(JdbcSqlStat sqlStat) { + SqlInfo info = new SqlInfo(); + + String sql = sqlStat.getSql(); + try { + sql = ParameterizedOutputVisitorUtils.parameterize(sql, sqlStat.getDbType()); + } catch (Exception e) { + LOG.error("merge sql error", e); + } + + info.setSql(sql); + info.setExecuteCount((int) sqlStat.getExecuteCount()); + info.setRunningCount((int) sqlStat.getRunningCount()); + info.setConcurrentMax((int) sqlStat.getConcurrentMax()); + info.setErrorCount((int) sqlStat.getErrorCount()); + info.setInTransactionCount((int) sqlStat.getInTransactionCount()); + info.setFetchRowCount(sqlStat.getFetchRowCount()); + info.setUpdateCount(sqlStat.getUpdateCount()); + info.setResultSetHoldTimeMilis(sqlStat.getResultSetHoldTimeMilis()); + + info.setHisogram(sqlStat.getHistogram().toArray()); + info.setExecuteAndResultHoldTimeHistogram(sqlStat.getExecuteAndResultHoldTimeHistogram().toArray()); + info.setFetchRowCountHistogram(sqlStat.getFetchRowCountHistogram().toArray()); + info.setUpdateCountHistogram(sqlStat.getUpdateCountHistogram().toArray()); + + return info; + } +} diff --git a/src/main/java/com/alibaba/druid/stat/service/dto/SqlInfo.java b/src/main/java/com/alibaba/druid/stat/service/dto/SqlInfo.java index f7ee9be82d..17b70b128f 100644 --- a/src/main/java/com/alibaba/druid/stat/service/dto/SqlInfo.java +++ b/src/main/java/com/alibaba/druid/stat/service/dto/SqlInfo.java @@ -12,10 +12,129 @@ public class SqlInfo { private long fetchRowCount; private long updateCount; + private long resultSetHoldTimeMilis; + + // 使用字段而不是数组为了节省内存空间 + private int histogram_0; + private int histogram_1; + private int histogram_2; + private int histogram_3; + private int histogram_4; + private int histogram_5; + private int histogram_6; + private int histogram_7; + + private int executeAndResultHoldTimeHistogram_0; + private int executeAndResultHoldTimeHistogram_1; + private int executeAndResultHoldTimeHistogram_2; + private int executeAndResultHoldTimeHistogram_3; + private int executeAndResultHoldTimeHistogram_4; + private int executeAndResultHoldTimeHistogram_5; + private int executeAndResultHoldTimeHistogram_6; + private int executeAndResultHoldTimeHistogram_7; + + private int updateCountHistogram_0; + private int updateCountHistogram_1; + private int updateCountHistogram_2; + private int updateCountHistogram_3; + private int updateCountHistogram_4; + private int updateCountHistogram_5; + + private int fetchRowCountHistogram_0; + private int fetchRowCountHistogram_1; + private int fetchRowCountHistogram_2; + private int fetchRowCountHistogram_3; + private int fetchRowCountHistogram_4; + private int fetchRowCountHistogram_5; + public SqlInfo(){ } + public void setExecuteAndResultHoldTimeHistogram(long[] values) { + executeAndResultHoldTimeHistogram_0 = (int) values[0]; + executeAndResultHoldTimeHistogram_1 = (int) values[1]; + executeAndResultHoldTimeHistogram_2 = (int) values[2]; + executeAndResultHoldTimeHistogram_3 = (int) values[3]; + executeAndResultHoldTimeHistogram_4 = (int) values[4]; + executeAndResultHoldTimeHistogram_5 = (int) values[5]; + executeAndResultHoldTimeHistogram_6 = (int) values[6]; + executeAndResultHoldTimeHistogram_7 = (int) values[7]; + } + + public int[] getExecuteAndResultHoldTimeHistogram() { + return new int[] { executeAndResultHoldTimeHistogram_0, // + executeAndResultHoldTimeHistogram_1, // + executeAndResultHoldTimeHistogram_2, // + executeAndResultHoldTimeHistogram_3, // + executeAndResultHoldTimeHistogram_4, // + executeAndResultHoldTimeHistogram_5, // + executeAndResultHoldTimeHistogram_6, // + executeAndResultHoldTimeHistogram_7, // + }; + } + + public void setFetchRowCountHistogram(long[] values) { + fetchRowCountHistogram_0 = (int) values[0]; + fetchRowCountHistogram_1 = (int) values[1]; + fetchRowCountHistogram_2 = (int) values[2]; + fetchRowCountHistogram_3 = (int) values[3]; + fetchRowCountHistogram_4 = (int) values[4]; + fetchRowCountHistogram_5 = (int) values[5]; + } + + public int[] getFetchRowCountHistogram() { + return new int[] { fetchRowCountHistogram_0, // + fetchRowCountHistogram_1, // + fetchRowCountHistogram_2, // + fetchRowCountHistogram_3, // + fetchRowCountHistogram_4, // + fetchRowCountHistogram_5, // + }; + } + + public void setUpdateCountHistogram(long[] values) { + updateCountHistogram_0 = (int) values[0]; + updateCountHistogram_1 = (int) values[1]; + updateCountHistogram_2 = (int) values[2]; + updateCountHistogram_3 = (int) values[3]; + updateCountHistogram_4 = (int) values[4]; + updateCountHistogram_5 = (int) values[5]; + } + + public int[] getUpdateCountHistogram() { + return new int[] { updateCountHistogram_0, // + updateCountHistogram_1, // + updateCountHistogram_2, // + updateCountHistogram_3, // + updateCountHistogram_4, // + updateCountHistogram_5, // + }; + } + + public void setHisogram(long[] values) { + histogram_0 = (int) values[0]; + histogram_1 = (int) values[1]; + histogram_2 = (int) values[2]; + histogram_3 = (int) values[3]; + histogram_4 = (int) values[4]; + histogram_5 = (int) values[5]; + histogram_6 = (int) values[6]; + histogram_7 = (int) values[7]; + } + + public int[] getHistogram() { + return new int[] { histogram_0, // + histogram_1, // + histogram_2, // + histogram_3, // + histogram_4, // + histogram_5, // + histogram_6, // + histogram_7, // + }; + } + public String getSql() { return sql; } @@ -80,4 +199,15 @@ public class SqlInfo { this.updateCount = updateCount; } + public long getResultSetHoldTimeMilis() { + return resultSetHoldTimeMilis; + } + + public void setResultSetHoldTimeMilis(long resultSetHoldTimeMilis) { + this.resultSetHoldTimeMilis = resultSetHoldTimeMilis; + } + + public void merge(SqlInfo sqlInfo) { + + } } diff --git a/src/test/java/com/alibaba/druid/bvt/statService/SqlInfoTest.java b/src/test/java/com/alibaba/druid/bvt/statService/SqlInfoTest.java new file mode 100644 index 0000000000..42ab5b24c8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/statService/SqlInfoTest.java @@ -0,0 +1,14 @@ +package com.alibaba.druid.bvt.statService; + +import junit.framework.TestCase; + +import com.alibaba.druid.stat.JdbcSqlStat; +import com.alibaba.druid.stat.service.DruidStatServiceUtils; + +public class SqlInfoTest extends TestCase { + public void test_0 () throws Exception { + JdbcSqlStat sqlStat = new JdbcSqlStat("select 1"); + + DruidStatServiceUtils.createSqlInfo(sqlStat); + } +}