use of javax.management.NotificationListener in project graylog2-server by Graylog2.
the class GarbageCollectionWarningThread method doRun.
@Override
public void doRun() {
for (final GarbageCollectorMXBean gc : garbageCollectors) {
switch(gc.getName()) {
case "ParNew":
case "ConcurrentMarkSweep":
LOG.debug("Skipping GC warning listener for concurrent collector {}.", gc.getName());
continue;
}
LOG.debug("Installing GC warning listener for collector {}, total runtime threshold is {}.", gc.getName(), gcWarningThreshold);
final NotificationEmitter emitter = (NotificationEmitter) gc;
final NotificationListener listener = new NotificationListener() {
@SuppressForbidden("Deliberate usage of GcInfo and GarbageCollectionNotificationInfo")
@Override
public void handleNotification(javax.management.Notification notification, Object handback) {
if (GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION.equals(notification.getType())) {
final GcInfo gcInfo = GarbageCollectionNotificationInfo.from((CompositeData) notification.getUserData()).getGcInfo();
final Duration duration = Duration.milliseconds(gcInfo.getDuration());
if (duration.compareTo(gcWarningThreshold) > 0) {
LOG.warn("Last GC run with {} took longer than {} (last duration={})", gc.getName(), gcWarningThreshold, duration);
final Notification systemNotification = notificationService.buildNow().addNode(nodeId.toString()).addTimestamp(Tools.nowUTC()).addSeverity(Notification.Severity.URGENT).addType(Notification.Type.GC_TOO_LONG).addDetail("gc_name", gc.getName()).addDetail("gc_duration_ms", duration.toMilliseconds()).addDetail("gc_threshold_ms", gcWarningThreshold.toMilliseconds()).addDetail("gc_collection_count", gc.getCollectionCount()).addDetail("gc_collection_time", gc.getCollectionTime());
if (!notificationService.publishIfFirst(systemNotification)) {
LOG.debug("Couldn't publish notification: {}", notification);
}
}
}
}
};
emitter.addNotificationListener(listener, null, null);
}
}
Aggregations