Мы реализовали мониторинг очередей циклов событий 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++;
}
}
}
Мой вопрос, есть ли лучший способ контролировать размеры очереди?
Это может быть весьма полезной метрикой, поскольку ее можно использовать для понимания латентности, а также для использования в некоторых случаях обратного давления.