Мы реализовали мониторинг очередей циклов событий Netty, чтобы понять проблемы с некоторыми из наших модулей Netty. Монитор использует метод io.netty.util.concurrent.SingleThreadEventExecutor#pendingTasks
, который работает для большинства модулей, но для модуля, который обрабатывает несколько тысяч HTTP-запросов в секунду, кажется, что он висел или очень медленный. Теперь я понимаю, что документы строго указывают, что это может быть проблемой, и я чувствую себя довольно хромой ... поэтому я ищу другой способ реализовать этот монитор.Контроль размера очередей цикла событий Netty
Вы можете увидеть старый код здесь: 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++;
}
}
}
Мой вопрос, есть лучший способ контролировать размеры очередей?
Это может быть весьма полезной метрикой, так как ее можно использовать для понимания латентности, а также для использования в некоторых случаях для обеспечения противодавления.
Мне не нравится идея слишком полагаться на внутренние детали. Я думаю, что я буду периодически планировать задачу, чтобы проверить размер очереди из потока потока событий. Не так точно, но отлично подходит для мониторинга. –