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