mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
support call statement & add stat service
This commit is contained in:
@@ -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)));
|
||||
|
||||
Reference in New Issue
Block a user