Web应用请求平均时间统计
2017-09-28 15:49
399 查看
使用Filter统计web应用平均请求时间:
使用两个Map分别存储请求时间和请求次数,当请求来临时,使用请求总时间/请求次数即可获取平均请求时间。
import java.io .IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import jxl.common.Logger;
public class RequestCostFilter implements Filter {
private Logger logger = Logger.getLogger(getClass());
private static Map<String,AtomicLong> reqTimes = new ConcurrentHashMap<>();
private static Map<String,BigDecimal> reqAvgTime = new ConcurrentHashMap<>();
private static ExecutorService executorService = Executors.newFixedThreadPool(20);
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String url = httpRequest.getServletPath();
if (checkUrl(url)) {
Date beginTime = new Date();
filterChain.doFilter(request, response); // 继续执行
Date endTime = new Date();
long i = (long) ((endTime.getTime() - beginTime.getTime()));
stat(url,i);
} else {
filterChain.doFilter(request, response); // 继续执行
}
}
/**
* 统计URL的平均请求时间
* @param url
* @param time
*/
private void stat(final String url,final long time){
executorService.submit(new Runnable(){
public void run(){
try {
if (reqTimes.get(url) == null) {
reqTimes.put(url, new AtomicLong(1L));
} else {
reqTimes.get(url).addAndGet(1L);
}
if (reqAvgTime.get(url) == null) {
reqAvgTime.put(url, new BigDecimal(time));
} else {
BigDecimal tt = reqAvgTime.get(url).add(new BigDecimal(time));
reqAvgTime.put(url, tt);
}
BigDecimal avgtime = reqAvgTime.get(url).divide(new BigDecimal(reqTimes.get(url).get()), 2, BigDecimal.ROUND_HALF_EVEN);
if (avgtime.longValue() > 500) {
logger.warn(">>>>>>>>>>>|请求平均耗时:" + avgtime + "ms|请求次数:" + reqTimes.get(url).get() + "|URL:" + url + "|");
}
}catch (Exception e){
logger.error("统计URL请求时间出错",e);
}
}
});
}
/**
* 一级验证
*/
private boolean checkUrl(String url) {
boolean isSucc = true;
try {
// 不拦截登录请求
if ("//login.jsp".equals(url)) {
return false;
}
int pointIndex = url.lastIndexOf(".");
if (pointIndex > 0) {
String relUrl = url.substring(pointIndex, url.length());
if (".css".equals(relUrl)) {
return false;
}
if (".jpg".equals(relUrl)) {
return false;
}
if (".gif".equals(relUrl)) {
return false;
}
if (".png".equals(relUrl)) {
return false;
}
if (".ico".equals(relUrl)) {
return false;
}
if (".js".equals(relUrl)) {
return false;
}
if (".jsp".equals(relUrl)) {
return false;
}
}
} catch (Exception e) {
logger.error("系统进行资源一级验证时错误!", e);
}
return isSucc;
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}在web.xml中配置filter:
<!-- 请求耗时过滤器 -->
<filter>
<filter-name>requestCostFilter</filter-name>
<filter-class>org.extremecomponents.table.filter.RequestCostFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestCostFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>打印日志如下:
Warning: >>>>>>>>>>>|请求平均耗时:532.34ms|请求次数:1467|URL:/servlet/UploadServlet|
Warning: >>>>>>>>>>>|请求平均耗时:949.64ms|请求次数:4407|URL:/leaderApproval!list.action|
使用两个Map分别存储请求时间和请求次数,当请求来临时,使用请求总时间/请求次数即可获取平均请求时间。
import java.io .IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import jxl.common.Logger;
public class RequestCostFilter implements Filter {
private Logger logger = Logger.getLogger(getClass());
private static Map<String,AtomicLong> reqTimes = new ConcurrentHashMap<>();
private static Map<String,BigDecimal> reqAvgTime = new ConcurrentHashMap<>();
private static ExecutorService executorService = Executors.newFixedThreadPool(20);
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String url = httpRequest.getServletPath();
if (checkUrl(url)) {
Date beginTime = new Date();
filterChain.doFilter(request, response); // 继续执行
Date endTime = new Date();
long i = (long) ((endTime.getTime() - beginTime.getTime()));
stat(url,i);
} else {
filterChain.doFilter(request, response); // 继续执行
}
}
/**
* 统计URL的平均请求时间
* @param url
* @param time
*/
private void stat(final String url,final long time){
executorService.submit(new Runnable(){
public void run(){
try {
if (reqTimes.get(url) == null) {
reqTimes.put(url, new AtomicLong(1L));
} else {
reqTimes.get(url).addAndGet(1L);
}
if (reqAvgTime.get(url) == null) {
reqAvgTime.put(url, new BigDecimal(time));
} else {
BigDecimal tt = reqAvgTime.get(url).add(new BigDecimal(time));
reqAvgTime.put(url, tt);
}
BigDecimal avgtime = reqAvgTime.get(url).divide(new BigDecimal(reqTimes.get(url).get()), 2, BigDecimal.ROUND_HALF_EVEN);
if (avgtime.longValue() > 500) {
logger.warn(">>>>>>>>>>>|请求平均耗时:" + avgtime + "ms|请求次数:" + reqTimes.get(url).get() + "|URL:" + url + "|");
}
}catch (Exception e){
logger.error("统计URL请求时间出错",e);
}
}
});
}
/**
* 一级验证
*/
private boolean checkUrl(String url) {
boolean isSucc = true;
try {
// 不拦截登录请求
if ("//login.jsp".equals(url)) {
return false;
}
int pointIndex = url.lastIndexOf(".");
if (pointIndex > 0) {
String relUrl = url.substring(pointIndex, url.length());
if (".css".equals(relUrl)) {
return false;
}
if (".jpg".equals(relUrl)) {
return false;
}
if (".gif".equals(relUrl)) {
return false;
}
if (".png".equals(relUrl)) {
return false;
}
if (".ico".equals(relUrl)) {
return false;
}
if (".js".equals(relUrl)) {
return false;
}
if (".jsp".equals(relUrl)) {
return false;
}
}
} catch (Exception e) {
logger.error("系统进行资源一级验证时错误!", e);
}
return isSucc;
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}在web.xml中配置filter:
<!-- 请求耗时过滤器 -->
<filter>
<filter-name>requestCostFilter</filter-name>
<filter-class>org.extremecomponents.table.filter.RequestCostFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestCostFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>打印日志如下:
Warning: >>>>>>>>>>>|请求平均耗时:532.34ms|请求次数:1467|URL:/servlet/UploadServlet|
Warning: >>>>>>>>>>>|请求平均耗时:949.64ms|请求次数:4407|URL:/leaderApproval!list.action|
相关文章推荐
- 使用Filter统计Java(J2EE)的web程序http请求响应时间
- 使用Filter统计Java(J2EE)的web程序http请求响应时间
- web 性能测试中的几个关键指标:并发用户数,QPS,用户平均请求等待时间
- awk 统计web日志平均响应时间
- web 性能测试中的几个关键指标:并发用户数,QPS,用户平均请求等待时间
- web 性能测试中的几个关键指标:并发用户数,QPS,用户平均请求等待时间
- 在Web应用中,会用到大量的Ajax请求,在Ajax请求中存在的一个问题就是如何判断session超时,在网上找到的一个java中处理此问题方法:
- ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件
- Web请求异步处理降低应用依赖风险
- 如何测量并报告ASP.NET Core Web API请求的响应时间
- Java Web应用中支持跨域请求
- 【转载】QPS,用户平均等待时间,服务器平均请求处理时间
- web应用请求限流控制
- EBS并发管理器请求汇总(按照并发消耗时间,等待时间,平均等待事件等汇总)
- 应用请求web服务器的过程详解
- awk 分析web日志(页面执行时间)(常见应用3)
- IOS请求WEB应用的方法
- nginx 反向代理web应用将https请求转成http请求时,必须注意事项
- python 统计发送请求到接收response的时间
- Web serviser请求通道在等待 00:00:59.6479648 以后答复时超时。增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能是更长超时的一部分。