61
62 public class ClassLoadingRule implements IRule {
63
64 private static final String RESULT_ID = "ClassLoading"; //$NON-NLS-1$
65 public static final TypedPreference<IQuantity> MAX_DURATION_LIMIT = new TypedPreference<>(
66 "classloading.duration.max.limit", //$NON-NLS-1$
67 Messages.getString(Messages.ClassLoadingRule_CONFIG_DURATION_LIMIT),
68 Messages.getString(Messages.ClassLoadingRule_CONFIG_DURATION_LIMIT_LONG), UnitLookup.TIMESPAN,
69 UnitLookup.MILLISECOND.quantity(1000L));
70 public static final TypedPreference<IQuantity> RATIO_OF_TOTAL_LIMIT = new TypedPreference<>(
71 "classloading.ratio-to-total.limit", //$NON-NLS-1$
72 Messages.getString(Messages.ClassLoadingRule_CONFIG_RATIO_LIMIT),
73 Messages.getString(Messages.ClassLoadingRule_CONFIG_RATIO_LIMIT_LONG), UnitLookup.NUMBER,
74 UnitLookup.NUMBER_UNITY.quantity(0.10));
75
76 private static final List<TypedPreference<?>> CONFIG_ATTRIBUTES = Arrays
77 .<TypedPreference<?>> asList(MAX_DURATION_LIMIT, RATIO_OF_TOTAL_LIMIT);
78
79 private Result getResult(IItemCollection items, IPreferenceValueProvider valueProvider) {
80 EventAvailability eventAvailability = RulesToolkit.getEventAvailability(items, JdkTypeIDs.CLASS_LOAD);
81 if (eventAvailability == EventAvailability.UNAVAILABLE || eventAvailability == EventAvailability.DISABLED) {
82 return RulesToolkit.getEventAvailabilityResult(this, items, eventAvailability, JdkTypeIDs.CLASS_LOAD);
83 }
84
85 IQuantity maxDurationLimit = valueProvider.getPreferenceValue(MAX_DURATION_LIMIT);
86 IQuantity ratioOfTotalLimit = valueProvider.getPreferenceValue(RATIO_OF_TOTAL_LIMIT);
87
88 IItemCollection events = items.apply(JdkFilters.CLASS_LOAD);
89
90 IQuantity startTime = events.getAggregate(JdkAggregators.FIRST_ITEM_START);
91 IQuantity endTime = events.getAggregate(JdkAggregators.LAST_ITEM_END);
92 if (startTime != null && endTime != null) {
93 IQuantity totalTime = endTime.subtract(startTime);
94 IQuantity max = events.getAggregate(Aggregators.max(JfrAttributes.DURATION));
95 IQuantity sum = events.getAggregate(Aggregators.sum(JfrAttributes.DURATION));
96 // FIXME: Consider using a score function instead of set value.
97 if ((max.compareTo(maxDurationLimit) > 0) || (sum.ratioTo(totalTime) > ratioOfTotalLimit.doubleValue())) {
98 String totalTimeString = sum.displayUsing(IDisplayable.AUTO);
99 String maxTimeString = max.displayUsing(IDisplayable.AUTO);
100 String loadCountString = events.getAggregate(Aggregators.count()).displayUsing(IDisplayable.AUTO);
101 return new Result(this, 50,
|
61
62 public class ClassLoadingRule implements IRule {
63
64 private static final String RESULT_ID = "ClassLoading"; //$NON-NLS-1$
65 public static final TypedPreference<IQuantity> MAX_DURATION_LIMIT = new TypedPreference<>(
66 "classloading.duration.max.limit", //$NON-NLS-1$
67 Messages.getString(Messages.ClassLoadingRule_CONFIG_DURATION_LIMIT),
68 Messages.getString(Messages.ClassLoadingRule_CONFIG_DURATION_LIMIT_LONG), UnitLookup.TIMESPAN,
69 UnitLookup.MILLISECOND.quantity(1000L));
70 public static final TypedPreference<IQuantity> RATIO_OF_TOTAL_LIMIT = new TypedPreference<>(
71 "classloading.ratio-to-total.limit", //$NON-NLS-1$
72 Messages.getString(Messages.ClassLoadingRule_CONFIG_RATIO_LIMIT),
73 Messages.getString(Messages.ClassLoadingRule_CONFIG_RATIO_LIMIT_LONG), UnitLookup.NUMBER,
74 UnitLookup.NUMBER_UNITY.quantity(0.10));
75
76 private static final List<TypedPreference<?>> CONFIG_ATTRIBUTES = Arrays
77 .<TypedPreference<?>> asList(MAX_DURATION_LIMIT, RATIO_OF_TOTAL_LIMIT);
78
79 private Result getResult(IItemCollection items, IPreferenceValueProvider valueProvider) {
80 EventAvailability eventAvailability = RulesToolkit.getEventAvailability(items, JdkTypeIDs.CLASS_LOAD);
81 if (eventAvailability == EventAvailability.UNKNOWN || eventAvailability == EventAvailability.DISABLED) {
82 return RulesToolkit.getEventAvailabilityResult(this, items, eventAvailability, JdkTypeIDs.CLASS_LOAD);
83 }
84
85 IQuantity maxDurationLimit = valueProvider.getPreferenceValue(MAX_DURATION_LIMIT);
86 IQuantity ratioOfTotalLimit = valueProvider.getPreferenceValue(RATIO_OF_TOTAL_LIMIT);
87
88 IItemCollection events = items.apply(JdkFilters.CLASS_LOAD);
89
90 IQuantity startTime = events.getAggregate(JdkAggregators.FIRST_ITEM_START);
91 IQuantity endTime = events.getAggregate(JdkAggregators.LAST_ITEM_END);
92 if (startTime != null && endTime != null) {
93 IQuantity totalTime = endTime.subtract(startTime);
94 IQuantity max = events.getAggregate(Aggregators.max(JfrAttributes.DURATION));
95 IQuantity sum = events.getAggregate(Aggregators.sum(JfrAttributes.DURATION));
96 // FIXME: Consider using a score function instead of set value.
97 if ((max.compareTo(maxDurationLimit) > 0) || (sum.ratioTo(totalTime) > ratioOfTotalLimit.doubleValue())) {
98 String totalTimeString = sum.displayUsing(IDisplayable.AUTO);
99 String maxTimeString = max.displayUsing(IDisplayable.AUTO);
100 String loadCountString = events.getAggregate(Aggregators.count()).displayUsing(IDisplayable.AUTO);
101 return new Result(this, 50,
|