add WebSessionStat support

This commit is contained in:
wenshao
2012-08-12 19:41:07 +08:00
parent 589947fed6
commit b679c084e4
7 changed files with 163 additions and 15 deletions
@@ -159,7 +159,7 @@ public class JSONDruidStatService {
Map<String, Object> dataMap = new LinkedHashMap<String, Object>();
dataMap.put("ResultCode", resultCode);
dataMap.put("Content", content);
return JSON.toJSONString(dataMap);
return JSON.toJSONStringWithDateFormat(dataMap, "yyyy-MM-dd hh:mm:ss");
}
}
@@ -18,9 +18,14 @@ import com.alibaba.druid.support.http.stat.WebAppStatManager;
import com.alibaba.druid.support.http.stat.WebRequestStat;
import com.alibaba.druid.support.http.stat.WebSessionStat;
import com.alibaba.druid.support.http.stat.WebURIStat;
import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;
import com.alibaba.druid.util.DruidWebUtils;
public class WebStatFilter implements Filter {
private final static Log LOG = LogFactory.getLog(WebStatFilter.class);
private WebAppStat webAppStat = null;
private WebStatFilterContextListener statFilterContextListener = new WebStatFilterContextListener();
@@ -39,6 +44,7 @@ public class WebStatFilter implements Filter {
}
long startNano = System.nanoTime();
long startMillis = System.currentTimeMillis();
WebRequestStat requestStat = new WebRequestStat(startNano);
WebRequestStat.set(requestStat);
@@ -48,6 +54,7 @@ public class WebStatFilter implements Filter {
// 第一次访问时,sessionId为null,如果缺省sessionCreate=false,sessionStat就为null。
if (sessionStat != null) {
sessionStat.beforeInvoke();
sessionStat.setLastAccessTimeMillis(startMillis);
}
try {
@@ -64,6 +71,7 @@ public class WebStatFilter implements Filter {
} else {
sessionStat = getSessionStat(httpRequest);
if (sessionStat != null) {
sessionStat.setLastAccessTimeMillis(startMillis);
sessionStat.reacord(nanoSpan);
}
}
@@ -72,13 +80,35 @@ public class WebStatFilter implements Filter {
}
}
public WebSessionStat getSessionStat(HttpServletRequest httpRequest) {
public WebSessionStat getSessionStat(HttpServletRequest request) {
WebSessionStat sessionStat = null;
String sessionId = getSessionId(httpRequest);
String sessionId = getSessionId(request);
if (sessionId != null) {
sessionStat = webAppStat.getSessionStat(sessionId);
}
if (sessionStat != null) {
if (sessionStat.getCreateTimeMillis() == -1L) {
HttpSession session = request.getSession(false);
if (session != null) {
sessionStat.setCreateTimeMillis(session.getCreationTime());
} else {
sessionStat.setCreateTimeMillis(System.currentTimeMillis());
}
}
String ip = DruidWebUtils.getRemoteAddr(request);
int addressCount = sessionStat.getRemoteAddresses().size();
if (addressCount < 10) {
sessionStat.addRemoteAddress(ip);
} else {
if (!sessionStat.getRemoteAddress().contains(ip)) {
LOG.error("sessoin ip change too many");
}
}
}
return sessionStat;
}
@@ -174,6 +204,10 @@ public class WebStatFilter implements Filter {
@Override
public void executeAfter(String sql, long nanoSpan, Throwable error) {
WebRequestStat localStat = WebRequestStat.current();
if (localStat != null) {
localStat.addJdbcExecuteNano(nanoSpan);
}
}
@Override
@@ -114,7 +114,9 @@ public class WebAppStat {
WebSessionStat uriStat = sessionStatMap.get(sessionId);
if (uriStat == null) {
sessionStatMap.putIfAbsent(sessionId, new WebSessionStat(sessionId));
WebSessionStat newStat = new WebSessionStat(sessionId);
sessionStatMap.putIfAbsent(sessionId, newStat);
uriStat = sessionStatMap.get(sessionId);
}
@@ -9,6 +9,7 @@ public class WebRequestStat {
private long jdbcExecuteCount;
private long jdbcUpdateCount;
private long jdbcFetchRowCount;
private long jdbcExecuteNano;
public WebRequestStat(){
@@ -60,6 +61,14 @@ public class WebRequestStat {
return jdbcExecuteCount;
}
public long getJdbcExecuteNano() {
return jdbcExecuteNano;
}
public void addJdbcExecuteNano(long nano) {
jdbcExecuteNano += nano;
}
public long getJdbcUpdateCount() {
return jdbcUpdateCount;
}
@@ -1,7 +1,10 @@
package com.alibaba.druid.support.http.stat;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
@@ -9,18 +12,24 @@ public class WebSessionStat {
private final String sessionId;
private final AtomicInteger runningCount = new AtomicInteger();
private final AtomicInteger concurrentMax = new AtomicInteger();
private final AtomicLong requestCount = new AtomicLong(0);
private final AtomicInteger runningCount = new AtomicInteger();
private final AtomicInteger concurrentMax = new AtomicInteger();
private final AtomicLong requestCount = new AtomicLong(0);
private final AtomicLong jdbcFetchRowCount = new AtomicLong();
private final AtomicLong jdbcUpdateCount = new AtomicLong();
private final AtomicLong jdbcExecuteCount = 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 jdbcCommitCount = new AtomicLong();
private final AtomicLong jdbcRollbackCount = new AtomicLong();
private final AtomicLong jdbcCommitCount = new AtomicLong();
private final AtomicLong jdbcRollbackCount = new AtomicLong();
private final AtomicLong requestTimeNano = new AtomicLong();
private final AtomicLong requestTimeNano = new AtomicLong();
private long createTimeMillis = -1L;
private long lastAccessTimeMillis = -1L;
private Set<String> remoteAddresses = new HashSet<String>();
public WebSessionStat(String sessionId){
super();
@@ -31,6 +40,62 @@ public class WebSessionStat {
return sessionId;
}
public long getCreateTimeMillis() {
return createTimeMillis;
}
public Date getCreateTime() {
if (createTimeMillis == -1L) {
return null;
}
return new Date(createTimeMillis);
}
public void setCreateTimeMillis(long createTimeMillis) {
this.createTimeMillis = createTimeMillis;
}
public long getLastAccessTimeMillis() {
return lastAccessTimeMillis;
}
public Date getLastAccessTime() {
if (lastAccessTimeMillis == -1L) {
return null;
}
return new Date(lastAccessTimeMillis);
}
public Set<String> getRemoteAddresses() {
return remoteAddresses;
}
public String getRemoteAddress() {
if (remoteAddresses.size() == 0) {
return null;
}
if (remoteAddresses.size() == 1) {
return remoteAddresses.iterator().next();
}
StringBuilder buf = new StringBuilder();
for (String item : remoteAddresses) {
if (buf.length() != 0) {
buf.append(",");
}
buf.append(item);
}
return buf.toString();
}
public void setLastAccessTimeMillis(long lastAccessTimeMillis) {
this.lastAccessTimeMillis = lastAccessTimeMillis;
}
public void beforeInvoke() {
int running = runningCount.incrementAndGet();
@@ -66,9 +131,14 @@ public class WebSessionStat {
this.addJdbcUpdateCount(requestStat.getJdbcUpdateCount());
this.addJdbcCommitCount(requestStat.getJdbcCommitCount());
this.addJdbcRollbackCount(requestStat.getJdbcRollbackCount());
this.addJdbcExecuteTimeNano(requestStat.getJdbcExecuteNano());
}
}
public void addRemoteAddress(String ip) {
this.remoteAddresses.add(ip);
}
public int getRunningCount() {
return this.runningCount.get();
}
@@ -81,6 +151,14 @@ public class WebSessionStat {
return requestCount.get();
}
public long getRequestTimeNano() {
return requestTimeNano.get();
}
public long getRequestTimeMillis() {
return getRequestTimeNano() / (1000 * 1000);
}
public void addJdbcFetchRowCount(long delta) {
this.jdbcFetchRowCount.addAndGet(delta);
}
@@ -109,6 +187,18 @@ public class WebSessionStat {
return jdbcExecuteCount.get();
}
public long getJdbcExecuteTimeMillis() {
return getJdbcExecuteTimeNano() / (1000 * 1000);
}
public long getJdbcExecuteTimeNano() {
return jdbcExecuteTimeNano.get();
}
public void addJdbcExecuteTimeNano(long nano) {
jdbcExecuteTimeNano.addAndGet(nano);
}
public void incrementJdbcCommitCount() {
jdbcCommitCount.incrementAndGet();
}
@@ -128,11 +218,11 @@ public class WebSessionStat {
public long getJdbcRollbackCount() {
return jdbcRollbackCount.get();
}
public void addJdbcRollbackCount(long rollbackCount) {
this.jdbcRollbackCount.addAndGet(rollbackCount);
}
public Map<String, Object> getStatData() {
Map<String, Object> data = new LinkedHashMap<String, Object>();
@@ -140,11 +230,16 @@ public class WebSessionStat {
data.put("RunningCount", this.getRunningCount());
data.put("ConcurrentMax", this.getConcurrentMax());
data.put("RequestCount", this.getRequestCount());
data.put("RequestTimeMillisTotal", this.getRequestTimeMillis());
data.put("CreateTime", this.getCreateTime());
data.put("LastAccessTime", this.getLastAccessTime());
data.put("RemoteAddress", this.getRemoteAddress());
data.put("JdbcCommitCount", this.getJdbcCommitCount());
data.put("JdbcRollbackCount", this.getJdbcRollbackCount());
data.put("JdbcExecuteCount", this.getJdbcExecuteCount());
data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis());
data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount());
data.put("JdbcUpdateCount", this.getJdbcUpdateCount());
@@ -96,10 +96,14 @@ function ajaxResponseForDataSourceSqlStatInfo() {
var newRow = sqlStatTable.insertRow(-1);
newRow.insertCell(-1).innerHTML = i+1;
newRow.insertCell(-1).innerHTML = sqlStat.SESSIONID;
newRow.insertCell(-1).innerHTML = sqlStat.CreateTime;
newRow.insertCell(-1).innerHTML = sqlStat.RemoteAddress;
newRow.insertCell(-1).innerHTML = sqlStat.RequestCount;
newRow.insertCell(-1).innerHTML = sqlStat.RequestTimeMillisTotal;
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;
@@ -25,10 +25,14 @@
<tr>
<th class="td_lable">N--</th>
<th class="td_lable"><a id="SESSIONID" href="javascript:void(0)" onclick="setOrderBy('SESSIONID');">SESSIONID</a></th>
<th class="td_lable" width="50"><a id="CreateTime" href="javascript:void(0)" onclick="setOrderBy('CreateTime');">CreateTime</a></th>
<th class="td_lable" width="50"><a id="RemoteAddress" href="javascript:void(0)" onclick="setOrderBy('RemoteAddress');">RemoteAddress</a></th>
<th class="td_lable" width="50"><a id="RequestCount" href="javascript:void(0)" onclick="setOrderBy('RequestCount');">Request Count</a></th>
<th class="td_lable" width="50"><a id="RequestTimeMillisTotal" href="javascript:void(0)" onclick="setOrderBy('RequestTimeMillisTotal=');" title="RequestTimeMillisTotal">RequestTime</a></th>
<th class="td_lable" width="50"><a id="th-RunningCount" href="javascript:void(0)" onclick="setOrderBy('RunningCount');">Running Count</a></th>
<th class="td_lable" width="80"><a id="th-ConcurrentMax" href="javascript:void(0)" onclick="setOrderBy('ConcurrentMax');">Concurrent Max</a></th>
<th class="td_lable" width="80"><a id="th-JdbcExecuteCount" href="javascript:void(0)" onclick="setOrderBy('JdbcExecuteCount');">JdbcExecuteCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcExecuteTimeMillis" href="javascript:void(0)" onclick="setOrderBy('JdbcExecuteTimeMillis');" title="JdbcExecuteTimeMillis">JdbcExecuteTime</a></th>
<th class="td_lable" width="80"><a id="th-JdbcCommitCount" href="javascript:void(0)" onclick="setOrderBy('JdbcCommitCount');">JdbcCommitCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcRollbackCount" href="javascript:void(0)" onclick="setOrderBy('JdbcRollbackCount');">JdbcRollbackCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcFetchRowCount" href="javascript:void(0)" onclick="setOrderBy('JdbcFetchRowCount');">JdbcFetchRowCount</a></th>