添加处理程序以捕获Netty客户端-服务器中的响应时间

时间:2019-07-31 21:09:12

标签: netty netty-socketio

我想添加一个metricsHandler来衡量请求-响应周期所花费的时间。

@Sharable
public class MetricCalcHandler extends ChannelDuplexHandler {

private static final AttributeKey<Long> TIME_TAKEN = AttributeKey.newInstance("time");

@Override
public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
        ctx.channel().attr(TIME_TAKEN).set(System.currentTimeMillis());
        ctx.fireChannelRegistered();
    }

@Override
public void deregister(ChannelHandlerContext ctx, ChannelPromise promise) throws Exception {

        Long ms = System.currentTimeMillis() - ctx.channel().attr(TIME_TAKEN).get());
        log.info("time taken " + ms);
        ctx.deregister(promise);
    }
}


public class MyInitializer extends ChannelInitializer<SocketChannel> {

@Override
    public void initChannel(SocketChannel ch) {
        ChannelPipeline p = ch.pipeline();
        p.addLast(new MetricCalcHandler());
        p.addLast(new LoggingHandler(LogLevel.INFO));

        p.addLast(new HttpServerCodec());
        p.addLast(new HttpObjectAggregator(1024 * 1024, true));
        p.addLast(new Handler1());
        p.addLast(new Handler2());

 }
}

现在我的问题是

  1. 我添加了@Sharable,但维护了频道的状态(按请求)。这是正确的吗?由于单个频道可在多个请求中共享,因此不会发生冲突/数据损坏。
  2. 我在ChannelRegistered中计算了处理开始时间,并在deregister中完成了处理。那是正确的地方吗?或使用channelActive()/channelInActive()方法?
  3. Netty是否针对这些用例提供了任何开箱即用的处理程序?
  4. 我要先添加MetricCalcHandler,然后再添加MyInitializer中的其他处理程序。以便首先调用处理程序。正确吗?

谢谢

0 个答案:

没有答案