Wir haben die Überwachung für die Netty-Ereignisschleifenwarteschlangen implementiert, um Probleme mit einigen unserer Netty-Module zu verstehen. Der Monitor verwendet die io.netty.util.concurrent.SingleThreadEventExecutor#pendingTasks
-Methode, die für die meisten Module funktioniert, aber für ein Modul, das einige tausend HTTP-Anfragen pro Sekunde verarbeitet, scheint es hängen zu bleiben oder sehr langsam. Ich erkenne jetzt, dass die Dokumente streng angeben, dass dies ein Problem sein kann, und ich fühle mich ziemlich lahm ... so suche ich nach einer anderen Möglichkeit, diesen Monitor zu implementieren.Überwachen der Größe der Netty-Ereignisschleifenwarteschlangen
Sie können den alten Code sehen hier: 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++;
}
}
}
Meine Frage ist, gibt es einen besseren Weg, um die Warteschlange Größen zu überwachen?
Dies kann eine ziemlich nützliche Metrik sein, da sie verwendet werden kann, um die Latenz zu verstehen, und in einigen Fällen auch für das Anlegen von Gegendruck verwendet werden kann.
Ich mag nicht die Idee, sich zu sehr auf interne Details zu verlassen. Was ich zu tun habe, ist, eine Aufgabe periodisch zu planen, um die Größe der Warteschlange innerhalb des Ereignisschleife-Threads zu überprüfen. Nicht so genau, aber gut für die Überwachung. –