Era*_*rel 14 java monitoring event-loop netty
我们已经实现了对Netty事件循环队列的监控,以便了解我们的一些Netty模块的问题.监视器使用的io.netty.util.concurrent.SingleThreadEventExecutor#pendingTasks方法适用于大多数模块,但对于每秒处理几千个HTTP请求的模块,它似乎挂起或非常慢.我现在意识到文档严格规定这可能是一个问题,我觉得很蹩脚......所以我正在寻找另一种方法来实现这个监视器.
你可以在这里看到旧代码:https: //github.com/outbrain/ob1k/blob/6364187b30cab5b79d64835131d9168c754f3c09/ob1k-core/src/main/java/com/outbrain/ob1k/common/metrics/NettyQueuesGaugeBuilder.java
public static void registerQueueGauges(final MetricFactory factory, final EventLoopGroup elg, final String componentName) {
int index = 0;
for (final EventExecutor eventExecutor : elg) {
if (eventExecutor instanceof SingleThreadEventExecutor) {
final SingleThreadEventExecutor singleExecutor = (SingleThreadEventExecutor) eventExecutor;
factory.registerGauge("EventLoopGroup-" + componentName, "EventLoop-" + index, new Gauge<Integer>() {
@Override
public Integer getValue() {
return singleExecutor.pendingTasks();
}
});
index++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否有更好的方法来监控队列大小?
这可能是一个非常有用的指标,因为它可用于理解延迟,并且在某些情况下也可用于施加背压.
您可能需要跟踪在SingleThreadEventExecutor实例中添加和删除任务时的更改。
为此,您可以创建一个包装和/或扩展的类SingleThreadEventExecutor。然后,您将拥有一个每次添加新任务以及每次删除/完成任务时都会java.util.concurrent.atomic.AtomicInteger调用的函数。incrementAndGet()decrementAndGet()
然后,该 AtomicInteger 将为您提供当前待处理任务的数量。您可能可以重写pendingTasks()以使用该值(尽管要小心 - 我不是 100% 不会有副作用)。
它会给正在执行的每个任务增加一点开销,但会使检索待处理任务的数量接近恒定速度。
当然,这样做的缺点是它比您目前所做的更具侵入性,因为您需要配置应用程序以使用不同的事件执行器。
注意。这只是关于如何解决该问题的建议 - 我没有专门使用 Netty 完成此操作。尽管我过去曾用其他代码做过类似的事情。