jetty request统计 StatisticsHandler

本文介绍如何通过扩展Jetty的StatisticsHandler类来自定义并输出有用的统计信息,如请求数、活动请求数等,帮助监测服务器运行状态。

jetty的StatisticsHandler类可以让我们统计到:

1、所有请求数

2、当前活动请求数

3、最大活动请求数

4、最大请求处理时间

5、返回码为4XX,5XX的请求数等

这些有助于我们分析jetty运行状况,但是查看StatisticsHandler的这些统计有点麻烦,通过派生StatisticsHandler类可以很容易做到这点:

package stat;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.mortbay.jetty.handler.StatisticsHandler;

public class RequestStat extends StatisticsHandler {

private Thread t = new Thread() {

   @Override
   public void run() {
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    while (true) {
     try {
      sleep(20000);
     } catch (Exception e) {
    
     }
     System.out.println(df.format(new Date()) + " act:" + RequestStat.this.getRequestsActive()
        + ", requests:" + RequestStat.this.getRequests()
        + ", actMas:" + RequestStat.this.getRequestsActiveMax()
        + ", curReqs.size:" + RequestStat.this.curReqs.size()
        + ", curReqs:" + RequestStat.this.curReqs);
    }
   }
  
};
public RequestStat() {
   t.setDaemon(true);
   t.start();
}

Map<Thread, String> curReqs = new ConcurrentHashMap<Thread, String>();

public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException {
   try {
            synchronized(this) {
            curReqs.put(Thread.currentThread(), request.getRequestURI() + "?" + request.getQueryString());            }
           
            super.handle(target, request, response, dispatch);
        }
        finally {
        synchronized(this) {
           curReqs.remove(Thread.currentThread());
        }
       
        }
}
}

将上面的class打成jar包放到jetty/lib目录中

jetty.xml里加上如下:

<Set name="handler">
        <New class="stat.RequestStat">
    <Set name="handler">
      <New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
        <Set name="handlers">
         <Array type="org.mortbay.jetty.Handler">
           <Item>
             <New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection"/>
           </Item>
           <Item>
             <New id="DefaultHandler" class="org.mortbay.jetty.handler.DefaultHandler"/>
           </Item>
           <Item>
             <New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler"/>
           </Item>
         </Array>
        </Set>
      </New>
</Set>
      </New>
    </Set>

重启jetty,这样在jetty stderrout.log日志中就可以看到输出的统计信息

Jetty 中添加新的请求头可以通过配置 `HttpConfiguration` 并结合使用 `Handler` 或 `Filter` 来实现。具体步骤如下: 1. **通过 `HttpConfiguration` 设置默认的请求头** 如果希望为所有请求添加固定的请求头,可以在初始化 `HttpConfiguration` 时进行设置。例如: ```java HttpConfiguration httpConfig = new HttpConfiguration(); httpConfig.setSendServerVersion(true); // 示例:发送服务器版本号 httpConfig.setRequestHeaderSize(8192); // 设置请求头大小限制 ``` 2. **使用 `Handler` 添加自定义请求头** 可以创建一个自定义的 `Handler` 来拦截请求,并在其中添加新的请求头: ```java public class CustomRequestHeaderHandler extends HandlerWrapper { @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // 添加自定义请求头 ((Request) request).getMetaData().add(new HttpField("X-Custom-Header", "CustomValue")); // 继续处理请求 getNext().handle(target, baseRequest, request, response); } } ``` 然后将该 `Handler` 添加到 `Server` 实例中: ```java Server server = new Server(); // ... 其他配置 server.setHandler(new CustomRequestHeaderHandler()); ``` 3. **使用 `Filter` 添加请求头** 如果希望基于某些条件动态添加请求头,可以使用 `Filter` 实现: ```java public class CustomHeaderFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 添加自定义请求头 httpResponse.setHeader("X-Custom-Header", "CustomValue"); chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) {} @Override public void destroy() {} } ``` 然后在 `web.xml` 或通过编程方式注册该 `Filter`。 4. **通过 `RewriteHandler` 添加请求头** Jetty 提供了 `RewriteHandler` 支持修改请求和响应内容。可以利用其功能添加新的请求头: ```java RewriteHandler rewriteHandler = new RewriteHandler(); rewriteHandler.addRule(new HeaderPatternRule("X-Custom-Header", "CustomValue")); ``` 5. **确保配置正确生效** 确保上述配置已正确集成到 Jetty 的启动流程中,并且没有与其他配置冲突。如果旧版本的参数已失效,请参考新版本的命名规则调整相关配置 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值