improve springStat

This commit is contained in:
wenshao
2012-08-19 08:01:58 +08:00
parent 1673281dd2
commit 848838e55c
10 changed files with 215 additions and 36 deletions
@@ -118,6 +118,12 @@ public class JSONDruidStatService {
if (url.startsWith("/spring.json")) {
return returnJSONResult(RESULT_CODE_SUCCESS, getSpringStatDataList(parameters));
}
if (url.startsWith("/spring-detail.json")) {
String clazz = parameters.get("class");
String method = parameters.get("method");
return returnJSONResult(RESULT_CODE_SUCCESS, getSpringMethodStatData(clazz, method));
}
return returnJSONResult(RESULT_CODE_ERROR, "Do not support this request, please contact with administrator.");
}
@@ -139,6 +145,10 @@ public class JSONDruidStatService {
private Map<String, Object> getWebSessionStatData(String sessionId) {
return WebAppStatManager.getInstance().getSessionStat(sessionId);
}
private Map<String, Object> getSpringMethodStatData(String clazz, String method) {
return SpringStatManager.getInstance().getMethodStatData(clazz, method);
}
private List<Map<String, Object>> getWebSessionStatDataList(Map<String, String> parameters) {
List<Map<String, Object>> array = WebAppStatManager.getInstance().getSessionStatData();
@@ -421,6 +421,9 @@ public class WebStatFilter implements Filter {
SpringMethodStat springMethodStat = SpringMethodStat.current();
if (springMethodStat != null) {
springMethodStat.addJdbcExecuteTimeNano(nanos);
if (error != null) {
springMethodStat.incrementJdbcExecuteErrorCount();
}
}
}
@@ -7,39 +7,40 @@ import java.util.concurrent.atomic.AtomicLong;
public class SpringMethodStat {
private final static ThreadLocal<SpringMethodStat> currentLocal = new ThreadLocal<SpringMethodStat>();
private final static ThreadLocal<SpringMethodStat> currentLocal = new ThreadLocal<SpringMethodStat>();
private final SpringMethodInfo methodInfo;
private final SpringMethodInfo methodInfo;
private final AtomicInteger runningCount = new AtomicInteger();
private final AtomicInteger concurrentMax = new AtomicInteger();
private final AtomicLong executeCount = new AtomicLong(0);
private final AtomicLong executeErrorCount = new AtomicLong(0);
private final AtomicLong executeTimeNano = new AtomicLong();
private final AtomicInteger runningCount = new AtomicInteger();
private final AtomicInteger concurrentMax = new AtomicInteger();
private final AtomicLong executeCount = new AtomicLong(0);
private final AtomicLong executeErrorCount = new AtomicLong(0);
private final AtomicLong executeTimeNano = new AtomicLong();
private final AtomicLong jdbcFetchRowCount = new AtomicLong();
private final AtomicLong jdbcUpdateCount = new AtomicLong();
private final AtomicLong jdbcExecuteCount = new AtomicLong();
private final AtomicLong jdbcExecuteTimeNano = new AtomicLong();
private final AtomicLong jdbcFetchRowCount = new AtomicLong();
private final AtomicLong jdbcUpdateCount = new AtomicLong();
private final AtomicLong jdbcExecuteCount = new AtomicLong();
private final AtomicLong jdbcExecuteErrorCount = new AtomicLong();
private final AtomicLong jdbcExecuteTimeNano = new AtomicLong();
private final AtomicLong jdbcCommitCount = new AtomicLong();
private final AtomicLong jdbcRollbackCount = new AtomicLong();
private final AtomicLong jdbcCommitCount = new AtomicLong();
private final AtomicLong jdbcRollbackCount = new AtomicLong();
public SpringMethodStat(SpringMethodInfo methodInfo){
this.methodInfo = methodInfo;
}
public void reset() {
concurrentMax.set(0);
executeCount.set(0);
executeErrorCount.set(0);
executeTimeNano.set(0);
jdbcFetchRowCount.set(0);
jdbcUpdateCount.set(0);
jdbcExecuteCount.set(0);
jdbcExecuteTimeNano.set(0);
jdbcCommitCount.set(0);
jdbcRollbackCount.set(0);
}
@@ -137,6 +138,18 @@ public class SpringMethodStat {
public long getJdbcExecuteCount() {
return jdbcExecuteCount.get();
}
public long getJdbcExecuteErrorCount() {
return jdbcExecuteErrorCount.get();
}
public void addJdbcExecuteErrorCount(long executeCount) {
jdbcExecuteErrorCount.addAndGet(executeCount);
}
public void incrementJdbcExecuteErrorCount() {
jdbcExecuteErrorCount.incrementAndGet();
}
public long getJdbcExecuteTimeMillis() {
return getJdbcExecuteTimeNano() / (1000 * 1000);
@@ -176,7 +189,7 @@ public class SpringMethodStat {
public Map<String, Object> getStatData() {
Map<String, Object> data = new LinkedHashMap<String, Object>();
data.put("Class", this.getMethodInfo().getClassName());
data.put("Method", this.getMethodInfo().getSignature());
@@ -190,6 +203,7 @@ public class SpringMethodStat {
data.put("JdbcRollbackCount", this.getJdbcRollbackCount());
data.put("JdbcExecuteCount", this.getJdbcExecuteCount());
data.put("JdbcExecuteErrorCount", this.getJdbcExecuteErrorCount());
data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis());
data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount());
data.put("JdbcUpdateCount", this.getJdbcUpdateCount());
@@ -50,4 +50,15 @@ public class SpringStat {
}
return methodStatDataList;
}
public Map<String, Object> getMethodStatData(String clazz, String method) {
for (SpringMethodStat methodStat : this.methodStats.values()) {
SpringMethodInfo methodInfo = methodStat.getMethodInfo();
if (methodInfo.getClassName().equals(clazz) && methodInfo.getSignature().equals(method)) {
return methodStat.getStatData();
}
}
return null;
}
}
@@ -63,6 +63,19 @@ public class SpringStatManager {
return allMethodStatDataList;
}
public Map<String, Object> getMethodStatData(String clazz, String method) {
Set<Object> stats = getSpringStatSet();
for (Object stat : stats) {
Map<String, Object> statData = SpringStatUtils.getMethodStatData(stat, clazz, method);
if (statData != null) {
return statData;
}
}
return null;
}
public void resetStat() {
Set<Object> stats = getSpringStatSet();
@@ -26,6 +26,22 @@ public class SpringStatUtils {
return null;
}
}
@SuppressWarnings("unchecked")
public static Map<String, Object> getMethodStatData(Object methodStat, String clazz, String methodSignature) {
if (methodStat.getClass() == SpringStat.class) {
return ((SpringStat) methodStat).getMethodStatData(clazz, methodSignature);
}
try {
Method method = methodStat.getClass().getMethod("getMethodStatData", String.class, String.class);
Object obj = method.invoke(methodStat, clazz, methodSignature);
return (Map<String, Object>) obj;
} catch (Exception e) {
LOG.error("getMethodStatDataList error", e);
return null;
}
}
public static void reset(Object webStat) {
if (webStat.getClass() == SpringStat.class) {
@@ -0,0 +1,27 @@
function ajaxRequestForSqlInfo() {
var clazz = getUrlVar("class");
var method = getUrlVar("method");
xmlHttpForConnectionInfo = getRequestObject();
sendRequest(xmlHttpForConnectionInfo, 'spring-detail.json?class=' + clazz + '&method=' + method, ajaxResponseForSqlInfo)
}
function ajaxResponseForSqlInfo() {
var stat = getJSONResponseContent(xmlHttpForConnectionInfo);
if (stat == null)
return;
changeInnerHtml("Class", stat.Class);
changeInnerHtml("Method", stat.Method);
changeInnerHtml("ExecuteCount", stat.ExecuteCount);
changeInnerHtml("ExecuteErrorCount", stat.ExecuteErrorCount);
changeInnerHtml("ExecuteTimeMillis", stat.ExecuteTimeMillis);
changeInnerHtml("RunningCount", stat.RunningCount);
changeInnerHtml("ConcurrentMax", stat.ConcurrentMax);
changeInnerHtml("JdbcExecuteCount", stat.JdbcExecuteCount);
changeInnerHtml("JdbcExecuteErrorCount", stat.JdbcExecuteErrorCount);
changeInnerHtml("JdbcExecuteTimeMillis", stat.JdbcExecuteTimeMillis);
changeInnerHtml("JdbcCommitCount", stat.JdbcCommitCount);
changeInnerHtml("JdbcRollbackCount", stat.JdbcRollbackCount);
changeInnerHtml("JdbcFetchRowCount", stat.JdbcFetchRowCount);
changeInnerHtml("JdbcUpdateCount", stat.JdbcUpdateCount);
}
@@ -85,28 +85,29 @@ function subSqlString(sql, len) {
return sql.substr(0, len) + '...';
}
function ajaxResponseForDataSourceSqlStatInfo() {
var sqlStatList = getJSONResponseContent(xmlHttpForDataSourceSqlStatInfo);
if(sqlStatList==null) return;
var statList = getJSONResponseContent(xmlHttpForDataSourceSqlStatInfo);
if(statList==null) return;
var sqlStatTable = document.getElementById("SpringStatTable");
while (sqlStatTable.rows.length > 1) {
sqlStatTable.deleteRow(1);
}
for ( var i = 0; i < sqlStatList.length; i++) {
var sqlStat = sqlStatList[i];
for ( var i = 0; i < statList.length; i++) {
var stat = statList[i];
var newRow = sqlStatTable.insertRow(-1);
newRow.insertCell(-1).innerHTML = i+1;
newRow.insertCell(-1).innerHTML = sqlStat.Class;
newRow.insertCell(-1).innerHTML = sqlStat.Method;
newRow.insertCell(-1).innerHTML = sqlStat.ExecuteCount;
newRow.insertCell(-1).innerHTML = sqlStat.ExecuteTimeMillis;
newRow.insertCell(-1).innerHTML = sqlStat.RunningCount;
newRow.insertCell(-1).innerHTML = sqlStat.ConcurrentMax;
newRow.insertCell(-1).innerHTML = sqlStat.JdbcExecuteCount;
newRow.insertCell(-1).innerHTML = sqlStat.JdbcExecuteTimeMillis;
newRow.insertCell(-1).innerHTML = sqlStat.JdbcCommitCount;
newRow.insertCell(-1).innerHTML = sqlStat.JdbcRollbackCount;
newRow.insertCell(-1).innerHTML = sqlStat.JdbcFetchRowCount;
newRow.insertCell(-1).innerHTML = sqlStat.JdbcUpdateCount;
newRow.insertCell(-1).innerHTML = stat.Class;
newRow.insertCell(-1).innerHTML = '<a target="_blank" href="spring-detail.html?class=' + stat.Class + '&method=' + stat.Method + '">' + stat.Method + '</a>';
newRow.insertCell(-1).innerHTML = stat.ExecuteCount;
newRow.insertCell(-1).innerHTML = stat.ExecuteTimeMillis;
newRow.insertCell(-1).innerHTML = stat.RunningCount;
newRow.insertCell(-1).innerHTML = stat.ConcurrentMax;
newRow.insertCell(-1).innerHTML = stat.JdbcExecuteCount;
newRow.insertCell(-1).innerHTML = stat.JdbcExecuteTimeMillis;
newRow.insertCell(-1).innerHTML = stat.JdbcCommitCount;
newRow.insertCell(-1).innerHTML = stat.JdbcRollbackCount;
newRow.insertCell(-1).innerHTML = stat.JdbcFetchRowCount;
newRow.insertCell(-1).innerHTML = stat.JdbcUpdateCount;
}
}
@@ -0,0 +1,84 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Druid Spring Stat</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<link href="css/style.css" type="text/css" rel="stylesheet"/>
<script src="js/common.js" type="text/javascript" charset="utf8"></script>
<script src="js/spring-detail.js" type="text/javascript" charset="utf8"></script>
<script >
function init(){
ajaxRequestForSqlInfo();
var time3=setInterval("ajaxRequestForSqlInfo();",5000);
buildMenu();
buildFooter();
}
</script>
</head>
<body onload="init();">
<div id="main">
<br/>
<h2> Spring View</h2>
<br/>
<table cellpadding='5' cellspacing='1' width='99%'>
<tr>
<td class='td_lable' width='130'> Class</td>
<td id="Class"></td>
</tr>
<tr>
<td class='td_lable'> Method</td>
<td id="Method"></td>
</tr>
<tr>
<td class='td_lable'> ExecuteCount</td>
<td id="ExecuteCount"></td>
</tr>
<tr>
<td class='td_lable'> ExecuteErrorCount</td>
<td id="ExecuteErrorCount"></td>
</tr>
<tr>
<td class='td_lable'> ExecuteTimeMillis</td>
<td id="ExecuteTimeMillis"></td>
</tr>
<tr>
<td class='td_lable'> RunningCount</td>
<td id="RunningCount"></td>
</tr>
<tr>
<td class='td_lable'> ConcurrentMax</td>
<td id="ConcurrentMax"></td>
</tr>
<tr>
<td class='td_lable'> JdbcExecuteCount</td>
<td id="JdbcExecuteCount"></td>
</tr>
<tr>
<td class='td_lable'> JdbcExecuteErrorCount</td>
<td id="JdbcExecuteErrorCount"></td>
</tr>
<tr>
<td class='td_lable'> JdbcExecuteTimeMillis</td>
<td id="JdbcExecuteTimeMillis"></td>
</tr>
<tr>
<td class='td_lable'> JdbcCommitCount</td>
<td id="JdbcCommitCount"></td>
</tr>
<tr>
<td class='td_lable'> JdbcRollbackCount</td>
<td id="JdbcRollbackCount"></td>
</tr>
<tr>
<td class='td_lable'> JdbcFetchRowCount</td>
<td id="JdbcFetchRowCount"></td>
</tr>
<tr>
<td class='td_lable'> JdbcUpdateCount</td>
<td id="JdbcUpdateCount"></td>
</tr>
</table>
<br />
</div>
</body>
</html>
@@ -45,9 +45,9 @@ public class Case1 extends TestCase {
private int maxPoolSize = 50;
private int maxActive = 50;
private String validationQuery = "SELECT 1";
private int threadCount = 40;
private int threadCount = 2;
private int loopCount = 4;
final int LOOP_COUNT = 1000 * 100;
final int LOOP_COUNT = 1000 * 1000;
protected void setUp() throws Exception {
jdbcUrl = "jdbc:fake:dragoon_v25masterdb";
@@ -100,7 +100,7 @@ public class Case1 extends TestCase {
System.out.println();
}
public void f_test_2() throws Exception {
public void test_2() throws Exception {
BoneCPDataSource dataSource = new BoneCPDataSource();
// dataSource.(10);
// dataSource.setMaxActive(50);