improve monitor support

This commit is contained in:
wenshao
2013-08-17 22:36:21 +08:00
parent 8ab0219c4e
commit f9a06e7a85
7 changed files with 309 additions and 89 deletions
@@ -18,6 +18,7 @@ package com.alibaba.druid.support.monitor;
import static com.alibaba.druid.util.Utils.getBoolean;
import static com.alibaba.druid.util.Utils.getInteger;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -40,6 +41,7 @@ import com.alibaba.druid.support.monitor.dao.MonitorDao;
import com.alibaba.druid.support.spring.stat.SpringMethodStatValue;
import com.alibaba.druid.support.spring.stat.SpringStat;
import com.alibaba.druid.support.spring.stat.SpringStatManager;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.druid.util.Utils;
import com.alibaba.druid.wall.WallProviderStatValue;
@@ -63,7 +65,20 @@ public class MonitorClient {
private MonitorDao dao;
private String domain;
private String app;
private String cluster;
private String host;
private int pid;
public MonitorClient(){
String name = ManagementFactory.getRuntimeMXBean().getName();
String[] items = name.split("@");
pid = Integer.parseInt(items[0]);
host = items[1];
configFromPropety(System.getProperties());
}
@@ -128,10 +143,30 @@ public class MonitorClient {
this.setCollectWebURIEnable(value);
}
}
{
domain = properties.getProperty("druid.monitor.domain");
if (StringUtils.isEmpty(domain)) {
domain = "default";
}
}
{
app = properties.getProperty("druid.monitor.app");
if (StringUtils.isEmpty(app)) {
app = "default";
}
}
{
cluster = properties.getProperty("druid.monitor.cluster");
if (StringUtils.isEmpty(cluster)) {
cluster = "default";
}
}
}
public void stop() {
}
public void start() {
@@ -216,8 +251,14 @@ public class MonitorClient {
private MonitorContext createContext() {
MonitorContext ctx = new MonitorContext();
ctx.setDomain(domain);
ctx.setApp(app);
ctx.setCluster(cluster);
ctx.setCollectTime(new Date());
ctx.setPID(Utils.getPID());
ctx.setPID(pid);
ctx.setHost(host);
ctx.setCollectTime(Utils.getStartTime());
return ctx;
}
@@ -376,4 +417,44 @@ public class MonitorClient {
this.schedulerThreadSize = schedulerThreadSize;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String getApp() {
return app;
}
public void setApp(String app) {
this.app = app;
}
public String getCluster() {
return cluster;
}
public void setCluster(String cluster) {
this.cluster = cluster;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
}
@@ -21,17 +21,23 @@ import java.util.Map;
public class MonitorContext {
public static String DEFAULT_DOMAIN;
private final Map<String, Object> atrributes = new HashMap<String, Object>();
private String domainName = "default";
private String appName = "default";
private String clusterName = "default";
private String domain = "default";
private String app = "default";
private String cluster = "default";
private String host;
private int pid;
private Date collectTime;
private Date startTime;
public MonitorContext(){
}
public Date getCollectTime() {
return collectTime;
}
@@ -76,28 +82,28 @@ public class MonitorContext {
this.pid = pid;
}
public String getDomainName() {
return domainName;
public String getDomain() {
return domain;
}
public void setDomainName(String domainName) {
this.domainName = domainName;
public void setDomain(String domain) {
this.domain = domain;
}
public String getAppName() {
return appName;
public String getApp() {
return app;
}
public void setAppName(String appName) {
this.appName = appName;
public void setApp(String app) {
this.app = app;
}
public String getClusterName() {
return clusterName;
public String getCluster() {
return cluster;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
public void setCluster(String cluster) {
this.cluster = cluster;
}
}
@@ -44,11 +44,15 @@ import com.alibaba.druid.support.monitor.MonitorContext;
import com.alibaba.druid.support.monitor.annotation.AggregateType;
import com.alibaba.druid.support.monitor.annotation.MField;
import com.alibaba.druid.support.monitor.annotation.MTable;
import com.alibaba.druid.support.monitor.entity.MonitorApp;
import com.alibaba.druid.support.spring.stat.SpringMethodStatValue;
import com.alibaba.druid.util.JdbcUtils;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.druid.util.Utils;
import com.alibaba.druid.wall.WallFunctionStatValue;
import com.alibaba.druid.wall.WallProviderStatValue;
import com.alibaba.druid.wall.WallSqlStatValue;
import com.alibaba.druid.wall.WallTableStatValue;
public class MonitorDaoJdbcImpl implements MonitorDao {
@@ -62,6 +66,11 @@ public class MonitorDaoJdbcImpl implements MonitorDao {
private BeanInfo webURIStatBeanInfo = new BeanInfo(WebURIStatValue.class);
private BeanInfo webAppStatBeanInfo = new BeanInfo(WebAppStatValue.class);
private BeanInfo wallProviderStatBeanInfo = new BeanInfo(WallProviderStatValue.class);
private BeanInfo wallSqlStatBeanInfo = new BeanInfo(WallSqlStatValue.class);
private BeanInfo wallTableStatBeanInfo = new BeanInfo(WallTableStatValue.class);
private BeanInfo wallFunctionStatBeanInfo = new BeanInfo(WallFunctionStatValue.class);
public MonitorDaoJdbcImpl(){
}
@@ -72,7 +81,9 @@ public class MonitorDaoJdbcImpl implements MonitorDao {
"springmethod.sql", //
"sql.sql", //
"webapp.sql", //
"weburi.sql" };
"weburi.sql",
"wall.sql"
};
for (String item : resources) {
String path = "/support/monitor/" + dbType + "/" + item;
@@ -99,7 +110,7 @@ public class MonitorDaoJdbcImpl implements MonitorDao {
@Override
public void saveSql(MonitorContext ctx, List<DruidDataSourceStatValue> dataSourceList) {
save(dataSourceStatBeanInfo, ctx, dataSourceList);
for (DruidDataSourceStatValue dataSourceStatValue : dataSourceList) {
List<JdbcSqlStatValue> sqlList = dataSourceStatValue.getSqlList();
save(sqlStatBeanInfo, ctx, sqlList);
@@ -115,6 +126,19 @@ public class MonitorDaoJdbcImpl implements MonitorDao {
public void saveWebURI(MonitorContext ctx, List<WebURIStatValue> list) {
save(webURIStatBeanInfo, ctx, list);
}
@Override
public void saveSqlWall(MonitorContext ctx, List<WallProviderStatValue> statList) {
save(wallProviderStatBeanInfo, ctx, statList);
for (WallProviderStatValue providerStat : statList) {
save(wallSqlStatBeanInfo, ctx, providerStat.getWhiteList());
save(wallSqlStatBeanInfo, ctx, providerStat.getBlackList());
save(wallTableStatBeanInfo, ctx, providerStat.getTables());
save(wallFunctionStatBeanInfo, ctx, providerStat.getFunctions());
}
}
@Override
public void saveWebApp(MonitorContext ctx, List<WebAppStatValue> list) {
@@ -437,8 +461,8 @@ public class MonitorDaoJdbcImpl implements MonitorDao {
conn = dataSource.getConnection();
stmt = conn.prepareStatement(sql);
stmt.setString(1, ctx.getDomainName());
stmt.setString(2, ctx.getAppName());
stmt.setString(1, ctx.getDomain());
stmt.setString(2, ctx.getApp());
stmt.setString(3, hashType);
stmt.setLong(4, hash);
stmt.setString(5, value);
@@ -463,6 +487,10 @@ public class MonitorDaoJdbcImpl implements MonitorDao {
}
private void save(BeanInfo beanInfo, MonitorContext ctx, List<?> list) {
if (list.size() == 0) {
return;
}
for (FieldInfo hashField : beanInfo.getHashFields()) {
saveHash(hashField, ctx, list);
}
@@ -496,9 +524,9 @@ public class MonitorDaoJdbcImpl implements MonitorDao {
Object sqlStat) throws SQLException {
int paramIndex = 1;
setParam(stmt, paramIndex++, ctx.getDomainName());
setParam(stmt, paramIndex++, ctx.getAppName());
setParam(stmt, paramIndex++, ctx.getClusterName());
setParam(stmt, paramIndex++, ctx.getDomain());
setParam(stmt, paramIndex++, ctx.getApp());
setParam(stmt, paramIndex++, ctx.getCluster());
setParam(stmt, paramIndex++, ctx.getHost());
setParam(stmt, paramIndex++, ctx.getPID());
setParam(stmt, paramIndex++, ctx.getCollectTime());
@@ -518,8 +546,10 @@ public class MonitorDaoJdbcImpl implements MonitorDao {
setParam(stmt, paramIndex, (String) value);
} else if (fieldType.equals(Date.class)) {
setParam(stmt, paramIndex, (Date) value);
} else if (fieldType.equals(boolean.class) || fieldType.equals(Boolean.class)) {
setParam(stmt, paramIndex, (Boolean) value);
} else {
throw new UnsupportedOperationException();
throw new UnsupportedOperationException("not support type : " + fieldType);
}
paramIndex++;
@@ -585,6 +615,14 @@ public class MonitorDaoJdbcImpl implements MonitorDao {
stmt.setString(paramIndex, value);
}
}
static void setParam(PreparedStatement stmt, int paramIndex, Boolean value) throws SQLException {
if (value == null) {
stmt.setNull(paramIndex, Types.BOOLEAN);
} else {
stmt.setBoolean(paramIndex, value);
}
}
static void setParam(PreparedStatement stmt, int paramIndex, Long value) throws SQLException {
if (value == null || value == 0) {
@@ -755,8 +793,67 @@ public class MonitorDaoJdbcImpl implements MonitorDao {
}
}
@Override
public void saveSqlWall(MonitorContext ctx, List<WallProviderStatValue> statList) {
public void insertAppIfNotExits(String domain, String app) throws SQLException {
MonitorApp monitorApp = findApp(domain, app);
if (monitorApp != null) {
return;
}
String sql = "insert druid_app (domain, app) values (?, ?)";
JdbcUtils.execute(dataSource, sql, domain, app);
}
public List<MonitorApp> listApp(String domain) throws SQLException {
List<MonitorApp> list = new ArrayList<MonitorApp>();
String sql = "select id, domain, app from druid_app where domain = ? and app = ?";
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
if (rs.next()) {
list.add(readApp(rs));
}
return list;
} finally {
JdbcUtils.close(rs);
JdbcUtils.close(stmt);
JdbcUtils.close(conn);
}
}
public MonitorApp findApp(String domain, String app) throws SQLException {
String sql = "select id, domain, app from druid_app where domain = ? and app = ?";
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
if (rs.next()) {
return readApp(rs);
}
return null;
} finally {
JdbcUtils.close(rs);
JdbcUtils.close(stmt);
JdbcUtils.close(conn);
}
}
private MonitorApp readApp(ResultSet rs) throws SQLException {
MonitorApp app = new MonitorApp();
app.setId(rs.getLong(1));
app.setDomain(rs.getString(2));
app.setApp(rs.getString(3));
return app;
}
}
@@ -1,39 +0,0 @@
/*
* 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.support.monitor.entity;
public class MonitorDomain {
private long id;
private String domain;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
}
@@ -170,7 +170,7 @@ public class Utils {
}
return null;
}
public static Boolean getBoolean(GenericServlet servlet, String key) {
String property = servlet.getInitParameter(key);
if ("true".equals(property)) {
@@ -236,20 +236,6 @@ public class Utils {
}
}
private static int pid;
public final static int getPID() {
if (pid == 0) {
String name = ManagementFactory.getRuntimeMXBean().getName();
String[] items = name.split("@");
pid = Integer.parseInt(items[0]);
}
return pid;
}
private static Date startTime;
public final static Date getStartTime() {