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