support call statement & add stat service

This commit is contained in:
wenshao
2012-08-03 18:57:38 +08:00
parent 4b01b65e13
commit d12ff9d4b4
10 changed files with 280 additions and 0 deletions
@@ -0,0 +1,81 @@
package com.alibaba.druid.stat.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.stat.DruidDataSourceStatManager;
import com.alibaba.druid.stat.JdbcSqlStat;
import com.alibaba.druid.stat.service.dto.DataSourceInfo;
import com.alibaba.druid.stat.service.dto.SqlInfo;
import com.alibaba.druid.stat.service.impl.DruidStatMemoryStore;
public class DruidStatService {
private ScheduledExecutorService scheduler;
private ScheduledFuture<?> collectPlan;
private int collectPeriodSeconds = 60 * 5;
private DruidStatStore store;
public synchronized void start() {
if (store != null) {
store = new DruidStatMemoryStore();
}
scheduler = Executors.newSingleThreadScheduledExecutor();
collectPlan = scheduler.scheduleAtFixedRate(new CollectTask(), collectPeriodSeconds, collectPeriodSeconds,
TimeUnit.SECONDS);
}
public synchronized void stop() {
if (collectPlan == null) {
collectPlan.cancel(true);
}
if (scheduler != null) {
scheduler.shutdown();
}
}
public void collect() {
final long timeMillis = System.currentTimeMillis();
List<DataSourceInfo> dataSourceStatList = new ArrayList<DataSourceInfo>();
for (DruidDataSource dataSource : DruidDataSourceStatManager.getDruidDataSourceInstances()) {
DataSourceInfo dataSourceStat = new DataSourceInfo();
dataSourceStat.setUrl(dataSource.getUrl());
dataSourceStat.setDbType(dataSource.getDbType());
dataSourceStatList.add(dataSourceStat);
Collection<JdbcSqlStat> sqlStats = dataSource.getDataSourceStat().getSqlStatMap().values();
List<SqlInfo> sqlStatInfoList = new ArrayList<SqlInfo>(sqlStats.size());
for (JdbcSqlStat sqlStat : dataSource.getDataSourceStat().getSqlStatMap().values()) {
SqlInfo sqlStatInfo = new SqlInfo();
sqlStatInfo.setSql(sqlStat.getSql());
sqlStatInfoList.add(sqlStatInfo);
}
}
store.saveDataSource(timeMillis, dataSourceStatList);
}
private final class CollectTask implements Runnable {
public void run() {
collect();
}
}
}
@@ -0,0 +1,13 @@
package com.alibaba.druid.stat.service;
import java.util.List;
import com.alibaba.druid.stat.service.dto.DataSourceInfo;
import com.alibaba.druid.stat.service.dto.SqlInfo;
public interface DruidStatStore {
void saveSql(long timeMillis, List<SqlInfo> sqlList);
void saveDataSource(long timeMillis, List<DataSourceInfo> dataSourceList);
}
@@ -0,0 +1,36 @@
package com.alibaba.druid.stat.service.dto;
import java.util.List;
public class DataSourceInfo {
private String url;
private String dbType;
private List<SqlInfo> sqlList;
public String getDbType() {
return dbType;
}
public void setDbType(String dbType) {
this.dbType = dbType;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public List<SqlInfo> getSqlList() {
return sqlList;
}
public void setSqlList(List<SqlInfo> sqlList) {
this.sqlList = sqlList;
}
}
@@ -0,0 +1,83 @@
package com.alibaba.druid.stat.service.dto;
public class SqlInfo {
private String sql;
private int executeCount;
private int runningCount;
private int concurrentMax;
private int executeErrorCount;
private int inTransactionCount;
private long fetchRowCount;
private long updateCount;
public SqlInfo(){
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public int getExecuteCount() {
return executeCount;
}
public void setExecuteCount(int executeCount) {
this.executeCount = executeCount;
}
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 int getExecuteErrorCount() {
return executeErrorCount;
}
public void setExecuteErrorCount(int executeErrorCount) {
this.executeErrorCount = executeErrorCount;
}
public int getInTransactionCount() {
return inTransactionCount;
}
public void setInTransactionCount(int inTransactionCount) {
this.inTransactionCount = inTransactionCount;
}
public long getFetchRowCount() {
return fetchRowCount;
}
public void setFetchRowCount(long fetchRowCount) {
this.fetchRowCount = fetchRowCount;
}
public long getUpdateCount() {
return updateCount;
}
public void setUpdateCount(long updateCount) {
this.updateCount = updateCount;
}
}
@@ -0,0 +1,22 @@
package com.alibaba.druid.stat.service.impl;
import java.util.List;
import com.alibaba.druid.stat.service.DruidStatStore;
import com.alibaba.druid.stat.service.dto.DataSourceInfo;
import com.alibaba.druid.stat.service.dto.SqlInfo;
public class DruidStatMemoryStore implements DruidStatStore {
@Override
public void saveSql(long timeMillis, List<SqlInfo> sqlList) {
}
@Override
public void saveDataSource(long timeMillis, List<DataSourceInfo> dataSourceList) {
}
}
@@ -11,6 +11,7 @@ public class WallConfig implements WallConfigMBean {
private boolean noneBaseStatementAllow = false;
private boolean callAllow = true;
private boolean selelctAllow = true;
private boolean selectIntoAllow = true;
private boolean selectIntoOutfileAllow = false;
@@ -319,4 +320,13 @@ public class WallConfig implements WallConfigMBean {
name = WallVisitorUtils.form(name);
return this.permitFunctions.contains(name);
}
public boolean isCallAllow() {
return callAllow;
}
public void setCallAllow(boolean callAllow) {
this.callAllow = callAllow;
}
}
@@ -13,6 +13,7 @@ import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
@@ -232,6 +233,8 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
} else if (x instanceof SQLDeleteStatement) {
} else if (x instanceof SQLUpdateStatement) {
} else if (x instanceof SQLCallStatement) {
} else if (x instanceof SQLTruncateStatement) {
if (!config.isTruncateAllow()) {
@@ -12,6 +12,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLInListExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
@@ -167,6 +168,7 @@ public class OracleWallVisitor extends OracleASTVisitorAdapter implements WallVi
} else if (x instanceof SQLUpdateStatement) {
} else if (x instanceof OracleMultiInsertStatement) {
} else if (x instanceof OracleMergeStatement) {
} else if (x instanceof SQLCallStatement) {
} else if (x instanceof SQLTruncateStatement) {
if (!config.isTruncateAllow()) {
violations.add(new IllegalSQLObjectViolation(toSQL(x)));
@@ -13,6 +13,7 @@ import com.alibaba.druid.sql.ast.expr.SQLInListExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
@@ -147,6 +148,8 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements
} else if (x instanceof SQLDeleteStatement) {
} else if (x instanceof SQLUpdateStatement) {
} else if (x instanceof SQLCallStatement) {
} else if (x instanceof SQLTruncateStatement) {
if (!config.isTruncateAllow()) {
violations.add(new IllegalSQLObjectViolation(toSQL(x)));