1 /* 2 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. 3 * 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * The contents of this file are subject to the terms of either the Universal Permissive License 7 * v 1.0 as shown at http://oss.oracle.com/licenses/upl 8 * 9 * or the following license: 10 * 11 * Redistribution and use in source and binary forms, with or without modification, are permitted 12 * provided that the following conditions are met: 13 * 14 * 1. Redistributions of source code must retain the above copyright notice, this list of conditions 15 * and the following disclaimer. 16 * 17 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of 18 * conditions and the following disclaimer in the documentation and/or other materials provided with 19 * the distribution. 20 * 21 * 3. Neither the name of the copyright holder nor the names of its contributors may be used to 22 * endorse or promote products derived from this software without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 26 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 27 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 30 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY 31 * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 package org.openjdk.jmc.flightrecorder.jdk; 34 35 import static org.openjdk.jmc.common.item.Aggregators.avg; 36 import static org.openjdk.jmc.common.item.Aggregators.distinctAsString; 37 import static org.openjdk.jmc.common.item.Aggregators.filter; 38 import static org.openjdk.jmc.common.item.Aggregators.max; 39 import static org.openjdk.jmc.common.item.Aggregators.min; 40 import static org.openjdk.jmc.common.item.Aggregators.or; 41 import static org.openjdk.jmc.common.item.Aggregators.sum; 42 import static org.openjdk.jmc.flightrecorder.JfrAttributes.DURATION; 43 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.CONCURRENT_GC_THREADS; 44 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.FLAG_NAME; 45 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.FLAG_VALUE_BOOLEAN; 46 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.FLAG_VALUE_NUMBER; 47 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.GC_TIME_RATIO; 48 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.HEAP_ADDRESS_SIZE; 49 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.HEAP_INITIAL_SIZE; 50 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.HEAP_MAX_SIZE; 51 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.HEAP_MIN_SIZE; 52 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.HEAP_OBJECT_ALIGNMENT; 53 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.HEAP_TOTAL; 54 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.HEAP_USED; 55 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.HW_THREADS; 56 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.IO_ADDRESS; 57 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.IO_FILE_BYTES_READ; 58 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.IO_FILE_BYTES_WRITTEN; 59 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.IO_HOST; 60 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.IO_PORT; 61 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.IO_SOCKET_BYTES_READ; 62 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.IO_SOCKET_BYTES_WRITTEN; 63 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.NEW_RATIO; 64 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.NUMBER_OF_CORES; 65 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.NUMBER_OF_SOCKETS; 66 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.PARALLEL_GC_THREADS; 67 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.TENURING_THRESHOLD_INITIAL; 68 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.TENURING_THRESHOLD_MAXIMUM; 69 import static org.openjdk.jmc.flightrecorder.jdk.JdkAttributes.TLAB_REFILL_WASTE_LIMIT; 70 import static org.openjdk.jmc.flightrecorder.jdk.JdkFilters.AFTER_GC; 71 import static org.openjdk.jmc.flightrecorder.jdk.JdkFilters.ALLOC_INSIDE_TLAB; 72 import static org.openjdk.jmc.flightrecorder.jdk.JdkFilters.ALLOC_OUTSIDE_TLAB; 73 import static org.openjdk.jmc.flightrecorder.jdk.JdkFilters.BEFORE_GC; 74 import static org.openjdk.jmc.flightrecorder.jdk.JdkFilters.CODE_CACHE_FULL; 75 import static org.openjdk.jmc.flightrecorder.jdk.JdkFilters.SOCKET_READ_OR_WRITE; 76 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.BOOLEAN_FLAG; 77 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.CPU_INFORMATION; 78 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.FILE_READ; 79 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.FILE_WRITE; 80 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.GC_CONF; 81 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.GC_CONF_SURVIVOR; 82 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.GC_CONF_TLAB; 83 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.GC_CONF_YOUNG_GENERATION; 84 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.GC_PAUSE; 85 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.HEAP_CONF; 86 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.HEAP_SUMMARY; 87 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.OBJECT_COUNT; 88 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.OS_INFORMATION; 89 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.OS_MEMORY_SUMMARY; 90 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.SOCKET_READ; 91 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.SOCKET_WRITE; 92 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.ULONG_FLAG; 93 import static org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs.VM_INFO; 94 95 import java.text.MessageFormat; 96 97 import org.openjdk.jmc.common.item.Aggregators; 98 import org.openjdk.jmc.common.item.IAccessorFactory; 99 import org.openjdk.jmc.common.item.IAggregator; 100 import org.openjdk.jmc.common.item.IAttribute; 101 import org.openjdk.jmc.common.item.IMemberAccessor; 102 import org.openjdk.jmc.common.item.IType; 103 import org.openjdk.jmc.common.item.ItemFilters; 104 import org.openjdk.jmc.common.unit.IQuantity; 105 import org.openjdk.jmc.common.unit.UnitLookup; 106 import org.openjdk.jmc.flightrecorder.JfrAttributes; 107 import org.openjdk.jmc.flightrecorder.jdk.messages.internal.Messages; 108 109 /** 110 * Various useful aggregators based on JDK flight recorder data. 111 */ 112 public final class JdkAggregators { 113 114 // VM Info 115 public static final IAggregator<String, ?> JVM_NAME = distinctAsString(VM_INFO, JdkAttributes.JVM_NAME); 116 public static final IAggregator<IQuantity, ?> JVM_START_TIME = min(JdkAttributes.JVM_START_TIME.getName(), null, 117 VM_INFO, JdkAttributes.JVM_START_TIME); 118 public static final IAggregator<String, ?> JVM_VERSION = distinctAsString(VM_INFO, JdkAttributes.JVM_VERSION); 119 public static final IAggregator<String, ?> JAVA_ARGUMENTS = distinctAsString(VM_INFO, JdkAttributes.JAVA_ARGUMENTS); 120 public static final IAggregator<String, ?> JVM_ARGUMENTS = distinctAsString(VM_INFO, JdkAttributes.JVM_ARGUMENTS); 121 // CPU info 122 public static final IAggregator<IQuantity, ?> MIN_HW_THREADS = min(HW_THREADS.getName(), null, CPU_INFORMATION, 123 HW_THREADS); 124 public static final IAggregator<IQuantity, ?> MIN_NUMBER_OF_CORES = min(NUMBER_OF_CORES.getName(), null, 125 CPU_INFORMATION, NUMBER_OF_CORES); 126 public static final IAggregator<IQuantity, ?> MIN_NUMBER_OF_SOCKETS = min(NUMBER_OF_SOCKETS.getName(), null, 127 CPU_INFORMATION, NUMBER_OF_SOCKETS); 128 public static final IAggregator<String, ?> CPU_DESCRIPTION = distinctAsString(CPU_INFORMATION, 129 JdkAttributes.CPU_DESCRIPTION); 130 public static final IAggregator<String, ?> CPU_TYPE = distinctAsString(CPU_INFORMATION, JdkAttributes.CPU_TYPE); 131 // OS info 132 public static final IAggregator<String, ?> OS_VERSION = distinctAsString(OS_INFORMATION, JdkAttributes.OS_VERSION); 133 public static final IAggregator<IQuantity, ?> MAX_USED_MEMORY = max( 134 Messages.getString(Messages.AGGR_MAX_USED_MEMORY), null, OS_MEMORY_SUMMARY, JdkAttributes.OS_MEMORY_USED); 135 public static final IAggregator<IQuantity, ?> MIN_TOTAL_MEMORY = min( 136 Messages.getString(Messages.AGGR_MIN_TOTAL_MEMORY), null, OS_MEMORY_SUMMARY, JdkAttributes.OS_MEMORY_TOTAL); 137 // Heap config 138 public static final IAggregator<IQuantity, ?> HEAP_CONF_MAX_SIZE = max(HEAP_MAX_SIZE.getName(), null, HEAP_CONF, 139 HEAP_MAX_SIZE); 140 public static final IAggregator<IQuantity, ?> HEAP_CONF_MIN_SIZE = min(HEAP_MIN_SIZE.getName(), null, HEAP_CONF, 141 HEAP_MIN_SIZE); 142 public static final IAggregator<IQuantity, ?> HEAP_CONF_INITIAL_SIZE_MIN = min(HEAP_INITIAL_SIZE.getName(), null, 143 HEAP_CONF, HEAP_INITIAL_SIZE); 144 public static final IAggregator<IQuantity, ?> HEAP_OBJECT_ALIGNMENT_MIN = min(HEAP_OBJECT_ALIGNMENT.getName(), null, 145 HEAP_CONF, HEAP_OBJECT_ALIGNMENT); 146 public static final IAggregator<IQuantity, ?> HEAP_ADDRESS_SIZE_MIN = min(HEAP_ADDRESS_SIZE.getName(), null, 147 HEAP_CONF, HEAP_ADDRESS_SIZE); 148 public static final IAggregator<Boolean, ?> USE_COMPRESSED_OOPS = or(HEAP_CONF, 149 JdkAttributes.HEAP_USE_COMPRESSED_OOPS); 150 public static final IAggregator<String, ?> COMPRESSED_OOPS_MODE = distinctAsString(HEAP_CONF, 151 JdkAttributes.HEAP_COMPRESSED_OOPS_MODE); 152 // GC config 153 public static final IAggregator<String, ?> OLD_COLLECTOR = distinctAsString(GC_CONF, JdkAttributes.OLD_COLLECTOR); 154 public static final IAggregator<String, ?> YOUNG_COLLECTOR = distinctAsString(GC_CONF, 155 JdkAttributes.YOUNG_COLLECTOR); 156 public static final IAggregator<IQuantity, ?> PARALLEL_GC_THREAD_COUNT_MAX = max(GC_CONF, PARALLEL_GC_THREADS); 157 public static final IAggregator<IQuantity, ?> PARALLEL_GC_THREAD_COUNT_MIN = min(PARALLEL_GC_THREADS.getName(), 158 null, GC_CONF, PARALLEL_GC_THREADS); 159 public static final IAggregator<IQuantity, ?> CONCURRENT_GC_THREAD_COUNT_MIN = min(CONCURRENT_GC_THREADS.getName(), 160 null, GC_CONF, CONCURRENT_GC_THREADS); 161 public static final IAggregator<Boolean, ?> EXPLICIT_GC_CONCURRENT = or(GC_CONF, 162 JdkAttributes.EXPLICIT_GC_CONCURRENT); 163 public static final IAggregator<Boolean, ?> EXPLICIT_GC_DISABLED = or(GC_CONF, JdkAttributes.EXPLICIT_GC_DISABLED); 164 public static final IAggregator<Boolean, ?> USE_DYNAMIC_GC_THREADS = or(GC_CONF, 165 JdkAttributes.USE_DYNAMIC_GC_THREADS); 166 public static final IAggregator<IQuantity, ?> GC_TIME_RATIO_MIN = min(GC_TIME_RATIO.getName(), null, GC_CONF, 167 GC_TIME_RATIO); 168 public static final IAggregator<IQuantity, ?> YOUNG_GENERATION_MIN_SIZE = max( 169 JdkAttributes.YOUNG_GENERATION_MIN_SIZE.getName(), null, GC_CONF_YOUNG_GENERATION, 170 JdkAttributes.YOUNG_GENERATION_MIN_SIZE); 171 public static final IAggregator<IQuantity, ?> YOUNG_GENERATION_MAX_SIZE = min( 172 JdkAttributes.YOUNG_GENERATION_MAX_SIZE.getName(), null, GC_CONF_YOUNG_GENERATION, 173 JdkAttributes.YOUNG_GENERATION_MIN_SIZE); 174 public static final IAggregator<IQuantity, ?> NEW_RATIO_MIN = min(NEW_RATIO.getName(), null, 175 GC_CONF_YOUNG_GENERATION, NEW_RATIO); 176 public static final IAggregator<IQuantity, ?> TENURING_THRESHOLD_INITIAL_MIN = min( 177 TENURING_THRESHOLD_INITIAL.getName(), null, GC_CONF_SURVIVOR, TENURING_THRESHOLD_INITIAL); 178 public static final IAggregator<IQuantity, ?> TENURING_THRESHOLD_MAX = max(TENURING_THRESHOLD_MAXIMUM.getName(), 179 null, GC_CONF_SURVIVOR, TENURING_THRESHOLD_MAXIMUM); 180 public static final IAggregator<Boolean, ?> USES_TLABS = or(GC_CONF_TLAB, JdkAttributes.USES_TLABS); 181 public static final IAggregator<IQuantity, ?> TLAB_MIN_SIZE = min(JdkAttributes.TLAB_MIN_SIZE.getName(), null, 182 GC_CONF_TLAB, JdkAttributes.TLAB_MIN_SIZE); 183 public static final IAggregator<IQuantity, ?> TLAB_REFILL_WASTE_LIMIT_MIN = min(TLAB_REFILL_WASTE_LIMIT.getName(), 184 null, GC_CONF_TLAB, TLAB_REFILL_WASTE_LIMIT); 185 // Other 186 public static final IAggregator<IQuantity, ?> AVG_HEAP_USED_BEFORE_GC = filter( 187 Messages.getString(Messages.AGGR_AVG_HEAP_USED_BEFORE_GC), null, avg(HEAP_SUMMARY, HEAP_USED), BEFORE_GC); 188 public static final IAggregator<IQuantity, ?> AVG_HEAP_USED_AFTER_GC = filter( 189 Messages.getString(Messages.AGGR_AVG_HEAP_USED_AFTER_GC), null, avg(HEAP_SUMMARY, HEAP_USED), AFTER_GC); 190 public static final IAggregator<IQuantity, ?> SUM_HEAP_USED_BEFORE_GC = filter("SUM_HEAP_USED_BEFORE_GC", null, //$NON-NLS-1$ 191 sum(HEAP_SUMMARY, HEAP_USED), BEFORE_GC); 192 public static final IAggregator<IQuantity, ?> SUM_HEAP_USED_AFTER_GC = filter("SUM_HEAP_USED_AFTER_GC", null, //$NON-NLS-1$ 193 sum(HEAP_SUMMARY, HEAP_USED), AFTER_GC); 194 195 public static final IAggregator<IQuantity, ?> OBJECT_COUNT_MAX_SIZE = max( 196 Messages.getString(Messages.AGGR_OBJECT_COUNT_MAX_SIZE), 197 Messages.getString(Messages.AGGR_OBJECT_COUNT_MAX_SIZE_DESC), OBJECT_COUNT, HEAP_TOTAL); 198 public static final IAggregator<IQuantity, ?> OBJECT_COUNT_MAX_INSTANCES = max( 199 Messages.getString(Messages.AGGR_OBJECT_COUNT_MAX_INSTANCES), 200 Messages.getString(Messages.AGGR_OBJECT_COUNT_MAX_INSTANCES_DESC), OBJECT_COUNT, JdkAttributes.COUNT); 201 public static final IAggregator<Boolean, ?> UNLOCK_EXPERIMENTAL_VM_OPTIONS = filter( 202 Messages.getString(Messages.AGGR_UNLOCK_EXPERIMENTAL_VM_OPTIONS), null, 203 or(BOOLEAN_FLAG, FLAG_VALUE_BOOLEAN), ItemFilters.equals(FLAG_NAME, "UnlockExperimentalVMOptions")); //$NON-NLS-1$ 204 public static final IAggregator<Boolean, ?> IGNORE_UNRECOGNIZED_VM_OPTIONS = filter( 205 Messages.getString(Messages.AGGR_IGNORE_UNRECOGNIZED_VM_OPTIONS), null, 206 or(BOOLEAN_FLAG, FLAG_VALUE_BOOLEAN), ItemFilters.equals(FLAG_NAME, "IgnoreUnrecognizedVMOptions")); //$NON-NLS-1$ 207 public static final IAggregator<Boolean, ?> USE_STRING_DEDUPLICATION = filter("UseStringDeduplication", null, //$NON-NLS-1$ 208 or(BOOLEAN_FLAG, FLAG_VALUE_BOOLEAN), ItemFilters.equals(FLAG_NAME, "UseStringDeduplication")); //$NON-NLS-1$ 209 public static final IAggregator<Boolean, ?> USE_G1_GC = filter("UseG1GC", null, //$NON-NLS-1$ 210 or(BOOLEAN_FLAG, FLAG_VALUE_BOOLEAN), ItemFilters.equals(FLAG_NAME, "UseG1GC")); //$NON-NLS-1$ 211 public static final IAggregator<Boolean, ?> COMPACT_STRINGS = filter("CompactStrings", null, //$NON-NLS-1$ 212 or(BOOLEAN_FLAG, FLAG_VALUE_BOOLEAN), ItemFilters.equals(FLAG_NAME, "CompactStrings")); //$NON-NLS-1$ 213 public static final IAggregator<IQuantity, ?> LARGEST_MAX_HEAP_SIZE_FROM_FLAG = filter( 214 Messages.getString(Messages.AGGR_LARGEST_MAX_HEAP_SIZE_FROM_FLAG), null, max(ULONG_FLAG, FLAG_VALUE_NUMBER), 215 ItemFilters.equals(FLAG_NAME, "MaxHeapSize")); //$NON-NLS-1$ 216 public static final IAggregator<IQuantity, ?> OUTSIDE_TLAB_COUNT = Aggregators.count( 217 Messages.getString(Messages.AGGR_OUTSIDE_TLAB_COUNT), 218 Messages.getString(Messages.AGGR_OUTSIDE_TLAB_COUNT_DESC), ALLOC_OUTSIDE_TLAB); 219 public static final IAggregator<IQuantity, ?> INSIDE_TLAB_COUNT = Aggregators.count( 220 Messages.getString(Messages.AGGR_INSIDE_TLAB_COUNT), 221 Messages.getString(Messages.AGGR_INSIDE_TLAB_COUNT_DESC), ALLOC_INSIDE_TLAB); 222 public static final IAggregator<IQuantity, ?> FILE_WRITE_LONGEST = Aggregators.max(FILE_WRITE, DURATION); 223 public static final IAggregator<IQuantity, ?> FILE_READ_LONGEST = Aggregators.max(FILE_READ, DURATION); 224 public static final IAggregator<IQuantity, ?> FILE_WRITE_SIZE = Aggregators.sum( 225 Messages.getString(Messages.AGGR_FILE_WRITE_SIZE), Messages.getString(Messages.AGGR_FILE_WRITE_SIZE_DESC), 226 FILE_WRITE, IO_FILE_BYTES_WRITTEN); 227 public static final IAggregator<IQuantity, ?> FILE_READ_SIZE = Aggregators.sum( 228 Messages.getString(Messages.AGGR_FILE_READ_SIZE), Messages.getString(Messages.AGGR_FILE_READ_SIZE_DESC), 229 FILE_READ, IO_FILE_BYTES_READ); 230 public static final IAggregator<IQuantity, ?> FILE_WRITE_COUNT = Aggregators.count( 231 Messages.getString(Messages.AGGR_FILE_WRITE_COUNT), Messages.getString(Messages.AGGR_FILE_WRITE_COUNT_DESC), 232 JdkFilters.FILE_WRITE); 233 public static final IAggregator<IQuantity, ?> FILE_READ_COUNT = Aggregators.count( 234 Messages.getString(Messages.AGGR_FILE_READ_COUNT), Messages.getString(Messages.AGGR_FILE_READ_COUNT_DESC), 235 JdkFilters.FILE_READ); 236 public static final IAggregator<IQuantity, ?> ERROR_COUNT = Aggregators.count( 237 Messages.getString(Messages.AGGR_ERROR_COUNT), Messages.getString(Messages.AGGR_ERROR_COUNT_DESC), 238 JdkFilters.ERRORS); 239 public static final IAggregator<IQuantity, ?> EXCEPTIONS_COUNT = Aggregators.count( 240 Messages.getString(Messages.AGGR_EXCEPTIONS_COUNT), Messages.getString(Messages.AGGR_EXCEPTIONS_COUNT_DESC), 241 JdkFilters.EXCEPTIONS); 242 public static final IAggregator<IQuantity, ?> THROWABLES_COUNT = Aggregators.count( 243 Messages.getString(Messages.AGGR_THROWABLES_COUNT), Messages.getString(Messages.AGGR_THROWABLES_COUNT_DESC), 244 JdkFilters.THROWABLES); 245 public static final IAggregator<IQuantity, ?> CODE_CACHE_FULL_COUNT = Aggregators.count( 246 Messages.getString(Messages.AGGR_CODE_CACHE_FULL_COUNT), 247 Messages.getString(Messages.AGGR_CODE_CACHE_FULL_COUNT_DESC), CODE_CACHE_FULL); 248 public static final IAggregator<IQuantity, ?> SOCKET_WRITE_LONGEST = Aggregators.max(SOCKET_WRITE, DURATION); 249 public static final IAggregator<IQuantity, ?> SOCKET_READ_LONGEST = Aggregators.max(SOCKET_READ, DURATION); 250 public static final IAggregator<IQuantity, ?> SOCKET_WRITE_SIZE = Aggregators.sum( 251 Messages.getString(Messages.AGGR_SOCKET_WRITE_SIZE), 252 Messages.getString(Messages.AGGR_SOCKET_WRITE_SIZE_DESC), SOCKET_WRITE, IO_SOCKET_BYTES_WRITTEN); 253 public static final IAggregator<IQuantity, ?> SOCKET_READ_SIZE = Aggregators.sum( 254 Messages.getString(Messages.AGGR_SOCKET_READ_SIZE), Messages.getString(Messages.AGGR_SOCKET_READ_SIZE_DESC), 255 SOCKET_READ, IO_SOCKET_BYTES_READ); 256 public static final IAggregator<IQuantity, ?> SOCKET_WRITE_COUNT = Aggregators.count( 257 Messages.getString(Messages.AGGR_SOCKET_WRITE_COUNT), 258 Messages.getString(Messages.AGGR_SOCKET_WRITE_COUNT_DESC), JdkFilters.SOCKET_WRITE); 259 public static final IAggregator<IQuantity, ?> SOCKET_READ_COUNT = Aggregators.count( 260 Messages.getString(Messages.AGGR_SOCKET_READ_COUNT), 261 Messages.getString(Messages.AGGR_SOCKET_READ_COUNT_DESC), JdkFilters.SOCKET_READ); 262 public static final IAggregator<IQuantity, ?> NUMBER_OF_DISTINCT_PORTS = Aggregators 263 .filter(Aggregators.countDistinct(Messages.getString(Messages.AGGR_NUMBER_OF_DISTINCT_PORTS), 264 Messages.getString(Messages.AGGR_NUMBER_OF_DISTINCT_PORTS_DESC), IO_PORT), SOCKET_READ_OR_WRITE); 265 public static final IAggregator<IQuantity, ?> NUMBER_OF_DISTINCT_HOSTS = Aggregators 266 .filter(Aggregators.countDistinct(Messages.getString(Messages.AGGR_NUMBER_OF_DISTINCT_HOSTS), 267 Messages.getString(Messages.AGGR_NUMBER_OF_DISTINCT_HOSTS_DESC), IO_ADDRESS), SOCKET_READ_OR_WRITE); 268 public static final IAggregator<String, ?> HOST_NAMES_DISTINCT = Aggregators 269 .filter(Aggregators.distinctAsString(IO_HOST, ","), SOCKET_READ_OR_WRITE); //$NON-NLS-1$ 270 public static final IAggregator<IQuantity, ?> LONGEST_GC_PAUSE = Aggregators.max( 271 Messages.getString(Messages.AGGR_LONGEST_GC_PAUSE), Messages.getString(Messages.AGGR_LONGEST_GC_PAUSE_DESC), 272 GC_PAUSE, DURATION); 273 public static final IAggregator<IQuantity, ?> TOTAL_GC_PAUSE = Aggregators.sum( 274 Messages.getString(Messages.AGGR_TOTAL_GC_PAUSE), Messages.getString(Messages.AGGR_TOTAL_GC_PAUSE_DESC), 275 GC_PAUSE, DURATION); 276 277 public static final IAggregator<IQuantity, ?> JFR_DATA_LOST_COUNT = Aggregators.count( 278 Messages.getString(Messages.AGGR_JFR_DATA_LOST_COUNT), 279 Messages.getString(Messages.AGGR_JFR_DATA_LOST_COUNT_DESC), JdkFilters.JFR_DATA_LOST); 280 public static final IAggregator<IQuantity, ?> FLR_DATA_LOST_SIZE = Aggregators.sum( 281 Messages.getString(Messages.AGGR_FLR_DATA_LOST_SIZE), 282 Messages.getString(Messages.AGGR_FLR_DATA_LOST_SIZE_DESC), JdkTypeIDs.JFR_DATA_LOST, 283 JfrAttributes.FLR_DATA_LOST); 284 public static final IAggregator<IQuantity, ?> AVG_JVM_USER_CPU = Aggregators.avg(JdkTypeIDs.CPU_LOAD, 285 JdkAttributes.JVM_USER); 286 public static final IAggregator<IQuantity, ?> AVG_JVM_TOTAL_CPU = Aggregators.avg(JdkTypeIDs.CPU_LOAD, 287 JdkAttributes.JVM_TOTAL); 288 public static final IAggregator<IQuantity, ?> EXECUTION_SAMPLE_COUNT = Aggregators.count( 289 Messages.getString(Messages.AGGR_EXECUTION_SAMPLE_COUNT), 290 Messages.getString(Messages.AGGR_EXECUTION_SAMPLE_COUNT_DESC), JdkFilters.EXECUTION_SAMPLE); 291 public static final IAggregator<IQuantity, ?> METASPACE_OOM_COUNT = Aggregators.count( 292 Messages.getString(Messages.AGGR_METASPACE_OOM_COUNT), 293 Messages.getString(Messages.AGGR_METASPACE_OOM_COUNT_DESC), JdkFilters.METASPACE_OOM); 294 public static final IAggregator<IQuantity, ?> TOTAL_BLOCKED_TIME = Aggregators.sum( 295 Messages.getString(Messages.AGGR_TOTAL_BLOCKED_TIME), 296 Messages.getString(Messages.AGGR_TOTAL_BLOCKED_TIME_DESC), JdkTypeIDs.MONITOR_ENTER, DURATION); 297 public static final IAggregator<IQuantity, ?> TOTAL_BLOCKED_COUNT = Aggregators.count( 298 Messages.getString(Messages.AGGR_TOTAL_BLOCKED_COUNT), 299 Messages.getString(Messages.AGGR_TOTAL_BLOCKED_COUNT_DESC), JdkFilters.MONITOR_ENTER); 300 public static final IAggregator<IQuantity, ?> MAX_BLOCKED_TIME = Aggregators.max( 301 Messages.getString(Messages.AGGR_MAX_BLOCKED_TIME), Messages.getString(Messages.AGGR_MAX_BLOCKED_TIME_DESC), 302 JdkTypeIDs.MONITOR_ENTER, DURATION); 303 public static final IAggregator<IQuantity, ?> AVG_BLOCKED_TIME = Aggregators.avg( 304 Messages.getString(Messages.AGGR_AVG_BLOCKED_TIME), Messages.getString(Messages.AGGR_AVG_BLOCKED_TIME_DESC), 305 JdkTypeIDs.MONITOR_ENTER, DURATION); 306 public static final IAggregator<IQuantity, ?> STDDEV_BLOCKED_TIME = Aggregators.stddevp( 307 Messages.getString(Messages.AGGR_STDDEV_BLOCKED_TIME), 308 Messages.getString(Messages.AGGR_STDDEV_BLOCKED_TIME_DESC), DURATION); 309 public static final IAggregator<IQuantity, ?> ALLOC_INSIDE_TLAB_AVG = Aggregators.avg( 310 Messages.getString(Messages.AGGR_ALLOC_INSIDE_TLAB_AVG), 311 Messages.getString(Messages.AGGR_ALLOC_INSIDE_TLAB_AVG_DESC), JdkTypeIDs.ALLOC_INSIDE_TLAB, 312 JdkAttributes.ALLOCATION_SIZE); 313 public static final IAggregator<IQuantity, ?> ALLOC_OUTSIDE_TLAB_AVG = Aggregators.avg( 314 Messages.getString(Messages.AGGR_ALLOC_OUTSIDE_TLAB_AVG), 315 Messages.getString(Messages.AGGR_ALLOC_OUTSIDE_TLAB_AVG_DESC), JdkTypeIDs.ALLOC_OUTSIDE_TLAB, 316 JdkAttributes.ALLOCATION_SIZE); 317 public static final IAggregator<IQuantity, ?> ALLOC_INSIDE_TLAB_SUM = Aggregators.sum( 318 Messages.getString(Messages.AGGR_ALLOC_INSIDE_TLAB_SUM), 319 Messages.getString(Messages.AGGR_ALLOC_INSIDE_TLAB_SUM_DESC), JdkTypeIDs.ALLOC_INSIDE_TLAB, 320 JdkAttributes.TLAB_SIZE); 321 public static final IAggregator<IQuantity, ?> ALLOC_OUTSIDE_TLAB_SUM = Aggregators.sum( 322 Messages.getString(Messages.AGGR_ALLOC_OUTSIDE_TLAB_SUM), 323 Messages.getString(Messages.AGGR_ALLOC_OUTSIDE_TLAB_SUM_DESC), JdkTypeIDs.ALLOC_OUTSIDE_TLAB, 324 JdkAttributes.ALLOCATION_SIZE); 325 public static final IAggregator<IQuantity, ?> SWEEP_METHOD_SUM = Aggregators.sum( 326 Messages.getString(Messages.AGGR_SWEEP_METHOD_SUM), Messages.getString(Messages.AGGR_SWEEP_METHOD_SUM_DESC), 327 JdkTypeIDs.SWEEP_CODE_CACHE, JdkAttributes.SWEEP_METHOD_SWEPT); 328 public static final IAggregator<IQuantity, ?> SWEEP_FLUSHED_SUM = Aggregators.sum( 329 Messages.getString(Messages.AGGR_SWEEP_FLUSHED_SUM), 330 Messages.getString(Messages.AGGR_SWEEP_FLUSHED_SUM_DESC), JdkTypeIDs.SWEEP_CODE_CACHE, 331 JdkAttributes.SWEEP_METHOD_FLUSHED); 332 public static final IAggregator<IQuantity, ?> SWEEP_ZOMBIFIED_SUM = Aggregators.sum( 333 Messages.getString(Messages.AGGR_SWEEP_ZOMBIFIED_SUM), 334 Messages.getString(Messages.AGGR_SWEEP_ZOMBIFIED_SUM_DESC), JdkTypeIDs.SWEEP_CODE_CACHE, 335 JdkAttributes.SWEEP_METHOD_ZOMBIFIED); 336 public static final IAggregator<IQuantity, ?> SWEEP_RECLAIMED_SUM = Aggregators.sum( 337 Messages.getString(Messages.AGGR_SWEEP_RECLAIMED_SUM), 338 Messages.getString(Messages.AGGR_SWEEP_RECLAIMED_SUM_DESC), JdkTypeIDs.SWEEP_CODE_CACHE, 339 JdkAttributes.SWEEP_METHOD_RECLAIMED); 340 public static final IAggregator<IQuantity, ?> FIRST_ITEM_START = Aggregators.min(JfrAttributes.START_TIME); 341 public static final IAggregator<IQuantity, ?> FIRST_ITEM_END = Aggregators.min(JfrAttributes.END_TIME); 342 public static final IAggregator<IQuantity, ?> LAST_ITEM_END = Aggregators.max(JfrAttributes.END_TIME); 343 public static final IAggregator<IQuantity, ?> LONGEST_EVENT = Aggregators.max(DURATION); 344 public static final IAggregator<IQuantity, ?> ITEM_COUNT = Aggregators 345 .count(Messages.getString(Messages.AGGR_ITEM_COUNT), Messages.getString(Messages.AGGR_ITEM_COUNT_DESC)); 346 347 public static final IAggregator<IQuantity, ?> ALLOCATION_TOTAL = Aggregators.sum( 348 Messages.getString(Messages.AGGR_ALLOCATION_TOTAL), Messages.getString(Messages.AGGR_ALLOCATION_TOTAL_DESC), 349 UnitLookup.MEMORY, new IAccessorFactory<IQuantity>() { 350 351 @Override 352 public <T> IMemberAccessor<? extends IQuantity, T> getAccessor(IType<T> type) { 353 if (type.getIdentifier().equals(JdkTypeIDs.ALLOC_INSIDE_TLAB)) { 354 return JdkAttributes.TLAB_SIZE.getAccessor(type); 355 } else if (type.getIdentifier().equals(JdkTypeIDs.ALLOC_OUTSIDE_TLAB)) { 356 return JdkAttributes.ALLOCATION_SIZE.getAccessor(type); 357 } 358 return null; 359 } 360 }); 361 public static final IAggregator<IQuantity, ?> TOTAL_IO_TIME = Aggregators.filter( 362 Aggregators.sum(Messages.getString(Messages.AGGR_TOTAL_IO_TIME), 363 Messages.getString(Messages.AGGR_TOTAL_IO_TIME_DESC), JfrAttributes.DURATION), 364 JdkFilters.FILE_OR_SOCKET_IO); 365 public static final IAggregator<IQuantity, ?> MAX_IO_TIME = Aggregators.filter( 366 Aggregators.max(Messages.getString(Messages.AGGR_MAX_IO_TIME), 367 Messages.getString(Messages.AGGR_MAX_IO_TIME_DESC), JfrAttributes.DURATION), 368 JdkFilters.FILE_OR_SOCKET_IO); 369 public static final IAggregator<IQuantity, ?> AVG_IO_TIME = Aggregators.filter( 370 Aggregators.avg(Messages.getString(Messages.AGGR_AVG_IO_TIME), 371 Messages.getString(Messages.AGGR_AVG_IO_TIME_DESC), JfrAttributes.DURATION), 372 JdkFilters.FILE_OR_SOCKET_IO); 373 public static final IAggregator<IQuantity, ?> STDDEV_IO_TIME = Aggregators.filter( 374 Aggregators.stddevp(Messages.getString(Messages.AGGR_STDDEV_IO_TIME), 375 Messages.getString(Messages.AGGR_STDDEV_IO_TIME_DESC), JfrAttributes.DURATION), 376 JdkFilters.FILE_OR_SOCKET_IO); 377 public static final IAggregator<IQuantity, ?> TOTAL_IO_COUNT = Aggregators.count( 378 Messages.getString(Messages.AGGR_TOTAL_IO_COUNT), Messages.getString(Messages.AGGR_TOTAL_IO_COUNT_DESC), 379 JdkFilters.FILE_OR_SOCKET_IO); 380 public static final IAggregator<IQuantity, ?> CLASS_LOADING_COUNT = Aggregators.count( 381 Messages.getString(Messages.AGGR_CLASS_LOADING_COUNT), 382 Messages.getString(Messages.AGGR_CLASS_LOADING_COUNT_DESC), JdkFilters.CLASS_LOAD); 383 public static final IAggregator<IQuantity, ?> CLASS_LOADING_TIME_SUM = Aggregators.sum( 384 Messages.getString(Messages.AGGR_CLASS_LOADING_TIME_SUM), 385 Messages.getString(Messages.AGGR_CLASS_LOADING_TIME_SUM_DESC), JdkTypeIDs.CLASS_LOAD, 386 JfrAttributes.DURATION); 387 388 public static final IAggregator<IQuantity, ?> VM_OPERATION_COUNT = Aggregators.count( 389 Messages.getString(Messages.AGGR_VM_OPERATION_COUNT), 390 Messages.getString(Messages.AGGR_VM_OPERATION_COUNT_DESC), JdkFilters.VM_OPERATIONS); 391 public static final IAggregator<IQuantity, ?> VM_OPERATION_DURATION = Aggregators.sum( 392 Messages.getString(Messages.AGGR_VM_OPERATION_DURATION), 393 Messages.getString(Messages.AGGR_VM_OPERATION_DURATION_DESC), JfrAttributes.DURATION); 394 395 public static final IAggregator<IQuantity, ?> COMPILATIONS_COUNT = Aggregators.count( 396 Messages.getString(Messages.AGGR_COMPILATIONS_COUNT), 397 Messages.getString(Messages.AGGR_COMPILATIONS_COUNT_DESC), JdkFilters.COMPILATION); 398 public static final IAggregator<IQuantity, ?> LONGEST_COMPILATION = Aggregators.filter(Aggregators.max(DURATION), 399 JdkFilters.COMPILATION); 400 401 public static final IAggregator<String, ?> DUMP_REASON = distinctAsString(JdkTypeIDs.DUMP_REASON, 402 JdkAttributes.DUMP_REASON); 403 404 public static final IAggregator<IQuantity, ?> ADDRESSES_COUNT = Aggregators.countDistinct( 405 Messages.getString(Messages.AGGR_ADDRESSES_COUNT), Messages.getString(Messages.AGGR_ADDRESSES_COUNT_DESC), 406 JdkAttributes.MONITOR_ADDRESS); 407 public static final IAggregator<IQuantity, ?> OLD_OBJECT_ADDRESSES_COUNT = Aggregators.countDistinct( 408 Messages.getString(Messages.AGGR_ADDRESSES_COUNT), Messages.getString(Messages.AGGR_ADDRESSES_COUNT_DESC), 409 JdkAttributes.OLD_OBJECT_ADDRESS); 410 411 /** 412 * Aggregator for getting the first value, ie. the value from the event with the first occurring 413 * start time. 414 * 415 * @param attribute 416 * attribute to get value from 417 * @return the value provided by the very first event 418 */ 419 public static <V> IAggregator<V, ?> first(IAttribute<V> attribute) { 420 return new Aggregators.AdvancedMinAggregator<>( 421 MessageFormat.format(Messages.getString(Messages.AGGR_FIRST_ATTRIBUTE), attribute.getName()), 422 MessageFormat.format(Messages.getString(Messages.AGGR_FIRST_ATTRIBUTE_DESC), attribute.getName()), 423 attribute, JfrAttributes.START_TIME); 424 } 425 426 /** 427 * Aggregator for getting the last value, ie. the value from the event with the last occurring 428 * end time. 429 * 430 * @param attribute 431 * attribute to get value from 432 * @return the value provided by the very last event 433 */ 434 public static <V> IAggregator<V, ?> last(IAttribute<V> attribute) { 435 return new Aggregators.AdvancedMaxAggregator<>( 436 MessageFormat.format(Messages.getString(Messages.AGGR_LAST_ATTRIBUTE), attribute.getName()), 437 MessageFormat.format(Messages.getString(Messages.AGGR_LAST_ATTRIBUTE_DESC), attribute.getName()), 438 attribute, JfrAttributes.END_TIME); 439 } 440 441 }