mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
add stat service
This commit is contained in:
@@ -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<JdbcSqlStat> sqlStats = dataSource.getDataSourceStat().getSqlStatMap().values();
|
||||
|
||||
List<SqlInfo> sqlStatInfoList = new ArrayList<SqlInfo>(sqlStats.size());
|
||||
Map<String, SqlInfo> sqlStatInfoMap = new HashMap<String, SqlInfo>(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<SqlInfo>(sqlStatInfoMap.values()));
|
||||
|
||||
dataSourceStatList.add(dataSourceStat);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user