1 package org.openjdk.jmc.flightrecorder.rules.jdk.exceptions; 2 3 import java.util.Collection; 4 import java.util.Collections; 5 import java.util.concurrent.Callable; 6 import java.util.concurrent.FutureTask; 7 import java.util.concurrent.RunnableFuture; 8 9 import org.openjdk.jmc.common.item.IItemCollection; 10 import org.openjdk.jmc.common.item.IItemFilter; 11 import org.openjdk.jmc.common.item.ItemFilters; 12 import org.openjdk.jmc.common.util.IPreferenceValueProvider; 13 import org.openjdk.jmc.common.util.TypedPreference; 14 import org.openjdk.jmc.flightrecorder.jdk.JdkAttributes; 15 import org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs; 16 import org.openjdk.jmc.flightrecorder.rules.IRule; 17 import org.openjdk.jmc.flightrecorder.rules.Result; 18 import org.openjdk.jmc.flightrecorder.rules.jdk.messages.internal.Messages; 19 import org.openjdk.jmc.flightrecorder.rules.util.JfrRuleTopics; 20 import org.openjdk.jmc.flightrecorder.rules.util.RulesToolkit; 21 import org.openjdk.jmc.flightrecorder.rules.util.RulesToolkit.EventAvailability; 22 23 public class FatalErrorRule implements IRule { 24 25 private static final String RESULT_ID = "Fatal Errors"; //$NON-NLS-1$ 26 27 private static final String ERROR_REASON = "VM Error"; //$NON-NLS-1$ 28 29 private FutureTask<Result> evaluationTask; 30 31 @Override 32 public RunnableFuture<Result> evaluate(final IItemCollection items, final IPreferenceValueProvider valueProvider) { 33 evaluationTask = new FutureTask<>(new Callable<Result>() { 34 @Override 35 public Result call() throws Exception { 36 return getResult(items, valueProvider); 37 } 38 }); 39 return evaluationTask; 40 } 41 42 private Result getResult(IItemCollection items, IPreferenceValueProvider valueProvider) { 43 EventAvailability eventAvailability = RulesToolkit.getEventAvailability(items, JdkTypeIDs.VM_SHUTDOWN); 44 if (eventAvailability != EventAvailability.AVAILABLE) { 45 return RulesToolkit.getEventAvailabilityResult(this, items, eventAvailability, JdkTypeIDs.VM_SHUTDOWN); 46 } 47 48 IItemFilter fatalErrorFilter = ItemFilters.type(JdkTypeIDs.VM_SHUTDOWN); 49 IItemCollection errorItems = items.apply(fatalErrorFilter); 50 51 if (errorItems.hasItems()) { 52 // Check the type of VM Shutdown, if it was a VM Error we should report it. 53 if (errorItems.apply(ItemFilters.contains(JdkAttributes.SHUTDOWN_REASON, ERROR_REASON)).hasItems()) { 54 String message = Messages.getString(Messages.FatalErrorRule_TEXT_WARN); 55 return new Result(this, 100, message); 56 } 57 } 58 59 return new Result(this, 0, Messages.getString(Messages.FatalErrorRule_TEXT_OK)); 60 } 61 62 @Override 63 public Collection<TypedPreference<?>> getConfigurationAttributes() { 64 return Collections.emptyList(); 65 } 66 67 @Override 68 public String getId() { 69 return RESULT_ID; 70 } 71 72 @Override 73 public String getName() { 74 return Messages.getString(Messages.FatalErrorRule_RULE_NAME); 75 } 76 77 @Override 78 public String getTopic() { 79 return JfrRuleTopics.JVM_INFORMATION_TOPIC; 80 } 81 }