src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/Health.java
author egahlin
Mon, 16 Sep 2019 15:10:34 +0200
branchJEP-349-branch
changeset 58151 7fd5766202ab
parent 58112 e7754025004b
permissions -rw-r--r--
Add removal reminder for Monitor and Health
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58112
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
     1
/*
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
     4
 *
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
     7
 * published by the Free Software Foundation.
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
     8
 *
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    13
 * accompanied this code).
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    14
 *
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    18
 *
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    21
 * questions.
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    22
 */
e7754025004b Copyright update - round 2
mseledtsov
parents: 57859
diff changeset
    23
57859
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    24
package jdk.jfr.internal.dcmd;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    25
import java.time.Duration;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    26
import java.time.Instant;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    27
import java.time.LocalDateTime;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    28
import java.time.ZoneOffset;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    29
import java.time.format.DateTimeFormatter;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    30
import java.util.ArrayList;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    31
import java.util.Collections;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    32
import java.util.HashMap;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    33
import java.util.Iterator;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    34
import java.util.List;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    35
import java.util.Map;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    36
import java.util.Objects;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    37
import java.util.StringJoiner;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    38
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    39
import jdk.jfr.consumer.RecordedEvent;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    40
import jdk.jfr.consumer.RecordedFrame;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    41
import jdk.jfr.consumer.RecordedMethod;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    42
import jdk.jfr.consumer.RecordedStackTrace;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    43
import jdk.jfr.consumer.RecordingStream;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    44
58151
7fd5766202ab Add removal reminder for Monitor and Health
egahlin
parents: 58112
diff changeset
    45
// TODO: This file is to be deleted before integration
7fd5766202ab Add removal reminder for Monitor and Health
egahlin
parents: 58112
diff changeset
    46
57859
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    47
/**
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    48
 *
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    49
 * HEALTH REPORT
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    50
 *
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    51
 * Example agent that shows how event streaming can be used to gather statistics
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    52
 * of a running application.
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    53
 *
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    54
 * Usage:
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    55
 *
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    56
 * $ java -javaagent:health-report.jar[=interval=<interval>] MyApp
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    57
 *
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    58
 * where interval is how often statistics should be written to standard out.
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    59
 *
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    60
 * Example,
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    61
 *
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    62
 * $ java -javaagent:health-report.jar MyApp
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    63
 *
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    64
 * For testing purposes it is also possible to just run Main.java and it will
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    65
 * run an allocation loop
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    66
 *
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    67
 * $ java Main.java
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    68
 *
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    69
 */
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    70
public final class Health {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    71
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    72
    private static final String TEMPLATE =
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    73
    "=================== HEALTH REPORT === $FLUSH_TIME         ====================\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    74
    "| GC: $GC_NAME            Phys. memory: $PHYSIC_MEM Alloc Rate: $ALLOC_RATE  |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    75
    "| OC Count    : $OC_COUNT Initial Heap: $INIT_HEAP  Total Alloc: $TOT_ALLOC  |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    76
    "| OC Pause Avg: $OC_AVG   Used Heap   : $USED_HEAP  Thread Count: $THREADS   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    77
    "| OC Pause Max: $OC_MAX   Commit. Heap: $COM_HEAP   Class Count : $CLASSES   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    78
    "| YC Count    : $YC_COUNT CPU Machine   : $MACH_CPU Safepoints: $SAFEPOINTS  |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    79
    "| YC Pause Avg: $YC_AVG   CPU JVM User  : $USR_CPU  Max Safepoint: $MAX_SAFE |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    80
    "| YC Pause Max: $YC_MAX   CPU JVM System: $SYS_CPU  Max Comp. Time: $MAX_COM |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    81
    "|--- Top Allocation Methods ------------------------------- -----------------|\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    82
    "| $ALLOCACTION_TOP_FRAME                                            $AL_PE   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    83
    "| $ALLOCACTION_TOP_FRAME                                            $AL_PE   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    84
    "| $ALLOCACTION_TOP_FRAME                                            $AL_PE   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    85
    "| $ALLOCACTION_TOP_FRAME                                            $AL_PE   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    86
    "| $ALLOCACTION_TOP_FRAME                                            $AL_PE   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    87
    "|--- Hot Methods ------------------------------------------------------------|\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    88
    "| $EXECUTION_TOP_FRAME                                              $EX_PE   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    89
    "| $EXECUTION_TOP_FRAME                                              $EX_PE   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    90
    "| $EXECUTION_TOP_FRAME                                              $EX_PE   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    91
    "| $EXECUTION_TOP_FRAME                                              $EX_PE   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    92
    "| $EXECUTION_TOP_FRAME                                              $EX_PE   |\n" +
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    93
    "==============================================================================\n";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    94
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    95
    public final static Field FLUSH_TIME = new Field();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    96
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    97
    public final static Field GC_NAME = new Field();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    98
    public final static Field OC_COUNT= new Field(Option.COUNT);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
    99
    public final static Field OC_AVG = new Field(Option.AVERAGE, Option.DURATION);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   100
    public final static Field OC_MAX = new Field(Option.MAX, Option.DURATION);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   101
    public final static Field YC_COUNT = new Field(Option.COUNT);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   102
    public final static Field YC_AVG = new Field(Option.AVERAGE, Option.DURATION);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   103
    public final static Field YC_MAX= new Field(Option.MAX, Option.DURATION);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   104
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   105
    public final static Field PHYSIC_MEM = new Field(Option.BYTES);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   106
    public final static Field INIT_HEAP = new Field(Option.BYTES);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   107
    public final static Field USED_HEAP = new Field(Option.BYTES);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   108
    public final static Field COM_HEAP = new Field(Option.BYTES);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   109
    public final static Field MACH_CPU = new Field(Option.PERCENTAGE);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   110
    public final static Field USR_CPU= new Field(Option.PERCENTAGE);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   111
    public final static Field SYS_CPU = new Field(Option.PERCENTAGE);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   112
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   113
    public final static Field ALLOC_RATE = new Field(Option.BYTES_PER_SECOND);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   114
    public final static Field TOT_ALLOC = new Field(Option.TOTAL, Option.BYTES);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   115
    public final static Field THREADS = new Field();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   116
    public final static Field CLASSES = new Field();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   117
    public final static Field SAFEPOINTS = new Field(Option.COUNT);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   118
    public final static Field MAX_SAFE = new Field(Option.MAX, Option.DURATION);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   119
    public final static Field MAX_COM = new Field(Option.MAX, Option.DURATION);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   120
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   121
    public final static Field ALLOCACTION_TOP_FRAME = new Field();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   122
    public final static Field AL_PE = new Field(Option.NORMALIZED, Option.TOTAL);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   123
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   124
    public final static Field EXECUTION_TOP_FRAME = new Field();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   125
    public final static Field EX_PE = new Field(Option.NORMALIZED, Option.COUNT);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   126
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   127
    private static RecordingStream rs;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   128
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   129
    public static void start() {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   130
        Duration duration = Duration.ofSeconds(1);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   131
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   132
        rs = new RecordingStream();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   133
        // Event configuration
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   134
        rs.enable("jdk.CPULoad").withPeriod(duration);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   135
        rs.enable("jdk.YoungGarbageCollection").withoutThreshold();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   136
        rs.enable("jdk.OldGarbageCollection").withoutThreshold();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   137
        rs.enable("jdk.GCHeapSummary").withPeriod(duration);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   138
        rs.enable("jdk.PhysicalMemory").withPeriod(duration);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   139
        rs.enable("jdk.GCConfiguration").withPeriod(duration);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   140
        rs.enable("jdk.SafepointBegin");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   141
        rs.enable("jdk.SafepointEnd");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   142
        rs.enable("jdk.ObjectAllocationOutsideTLAB").withStackTrace();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   143
        rs.enable("jdk.ObjectAllocationInNewTLAB").withStackTrace();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   144
        rs.enable("jdk.ExecutionSample").withPeriod(Duration.ofMillis(10)).withStackTrace();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   145
        rs.enable("jdk.JavaThreadStatistics").withPeriod(duration);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   146
        rs.enable("jdk.ClassLoadingStatistics").withPeriod(duration);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   147
        rs.enable("jdk.Compilation").withoutThreshold();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   148
        rs.enable("jdk.GCHeapConfiguration").withPeriod(duration);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   149
        rs.enable("jdk.Flush").withoutThreshold();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   150
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   151
        // Dispatch handlers
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   152
        rs.onEvent("jdk.CPULoad", Health::onCPULoad);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   153
        rs.onEvent("jdk.YoungGarbageCollection", Health::onYoungColletion);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   154
        rs.onEvent("jdk.OldGarbageCollection", Health::onOldCollection);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   155
        rs.onEvent("jdk.GCHeapSummary", Health::onGCHeapSummary);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   156
        rs.onEvent("jdk.PhysicalMemory", Health::onPhysicalMemory);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   157
        rs.onEvent("jdk.GCConfiguration", Health::onGCConfiguration);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   158
        rs.onEvent("jdk.SafepointBegin", Health::onSafepointBegin);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   159
        rs.onEvent("jdk.SafepointEnd", Health::onSafepointEnd);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   160
        rs.onEvent("jdk.ObjectAllocationOutsideTLAB", Health::onObjectAllocationOutsideTLAB);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   161
        rs.onEvent("jdk.ObjectAllocationInNewTLAB", Health::onObjectAllocationInNewTLAB);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   162
        rs.onEvent("jdk.ExecutionSample", Health::onExecutionSample);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   163
        rs.onEvent("jdk.JavaThreadStatistics", Health::onJavaThreadStatistics);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   164
        rs.onEvent("jdk.ClassLoadingStatistics", Health::onClassLoadingStatistics);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   165
        rs.onEvent("jdk.Compilation", Health::onCompilation);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   166
        rs.onEvent("jdk.GCHeapConfiguration", Health::onGCHeapConfiguration);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   167
        rs.onEvent("jdk.Flush", Health::onFlushpoint);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   168
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   169
        rs.onFlush(Health::printReport);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   170
        rs.startAsync();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   171
        System.out.println("Health started");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   172
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   173
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   174
    private static void onCPULoad(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   175
        MACH_CPU.addSample(event.getDouble("machineTotal"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   176
        SYS_CPU.addSample(event.getDouble("jvmSystem"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   177
        USR_CPU.addSample(event.getDouble("jvmUser"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   178
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   179
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   180
    private static void onYoungColletion(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   181
        long nanos = event.getDuration().toNanos();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   182
        YC_COUNT.addSample(nanos);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   183
        YC_MAX.addSample(nanos);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   184
        YC_AVG.addSample(nanos);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   185
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   186
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   187
    private static void onOldCollection(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   188
        long nanos = event.getDuration().toNanos();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   189
        OC_COUNT.addSample(nanos);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   190
        OC_MAX.addSample(nanos);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   191
        OC_AVG.addSample(nanos);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   192
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   193
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   194
    private static void onGCHeapSummary(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   195
        USED_HEAP.addSample(event.getLong("heapUsed"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   196
        COM_HEAP.addSample(event.getLong("heapSpace.committedSize"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   197
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   198
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   199
    private static void onPhysicalMemory(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   200
        PHYSIC_MEM.addSample(event.getLong("totalSize"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   201
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   202
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   203
    private static void onCompilation(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   204
        MAX_COM.addSample(event.getDuration().toNanos());
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   205
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   206
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   207
    private static void onGCConfiguration(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   208
        String gc = event.getString("oldCollector");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   209
        String yc = event.getString("youngCollector");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   210
        if (yc != null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   211
            gc += "/" + yc;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   212
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   213
        GC_NAME.addSample(gc);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   214
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   215
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   216
    private final static Map<Long, Instant> safepointBegin = new HashMap<>();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   217
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   218
    private static void onSafepointBegin(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   219
        safepointBegin.put(event.getValue("safepointId"), event.getEndTime());
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   220
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   221
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   222
    private static void onSafepointEnd(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   223
        long id = event.getValue("safepointId");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   224
        Instant begin = safepointBegin.get(id);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   225
        if (begin != null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   226
            long nanos = Duration.between(begin, event.getEndTime()).toNanos();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   227
            safepointBegin.remove(id);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   228
            SAFEPOINTS.addSample(nanos);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   229
            MAX_SAFE.addSample(nanos);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   230
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   231
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   232
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   233
    private static void onObjectAllocationOutsideTLAB(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   234
        onAllocationSample(event, event.getLong("allocationSize"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   235
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   236
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   237
    private static void onObjectAllocationInNewTLAB(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   238
        onAllocationSample(event, event.getLong("tlabSize"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   239
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   240
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   241
    private static double totalAllocated;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   242
    private static long firstAllocationTime = -1;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   243
    private static void onAllocationSample(RecordedEvent event, long size) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   244
        String topFrame = topFrame(event.getStackTrace());
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   245
        if (topFrame != null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   246
            ALLOCACTION_TOP_FRAME.addSample(topFrame, size);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   247
            AL_PE.addSample(topFrame, size);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   248
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   249
        TOT_ALLOC.addSample(size);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   250
        // ALLOC_RATE.addRate(timetsamp, amount);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   251
        long timestamp = event.getEndTime().toEpochMilli();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   252
        totalAllocated += size;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   253
        if (firstAllocationTime > 0) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   254
            long elapsedTime = timestamp - firstAllocationTime;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   255
            if (elapsedTime > 0) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   256
                double rate = 1000.0 * (totalAllocated / elapsedTime);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   257
                ALLOC_RATE.addSample(rate);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   258
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   259
        } else {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   260
            firstAllocationTime = timestamp;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   261
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   262
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   263
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   264
    private static void onExecutionSample(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   265
        String topFrame = topFrame(event.getStackTrace());
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   266
        EXECUTION_TOP_FRAME.addSample(topFrame, 1);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   267
        EX_PE.addSample(topFrame, 1);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   268
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   269
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   270
    private static void onJavaThreadStatistics(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   271
        THREADS.addSample(event.getDouble("activeCount"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   272
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   273
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   274
    private static void onClassLoadingStatistics(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   275
        long diff = event.getLong("loadedClassCount") - event.getLong("unloadedClassCount");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   276
        CLASSES.addSample(diff);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   277
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   278
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   279
    private static void onGCHeapConfiguration(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   280
        INIT_HEAP.addSample(event.getLong("initialSize"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   281
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   282
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   283
    private final static DateTimeFormatter FORMATTER =
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   284
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   285
    private static void onFlushpoint(RecordedEvent event) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   286
        Instant i = event.getEndTime();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   287
        LocalDateTime l = LocalDateTime.ofInstant(i, ZoneOffset.systemDefault());
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   288
        FLUSH_TIME.addSample(FORMATTER.format(l));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   289
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   290
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   291
    // # # # TEMPLATE AND SAMPLING # # #
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   292
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   293
    private enum Option {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   294
        BYTES, PERCENTAGE, DURATION, BYTES_PER_SECOND, NORMALIZED, COUNT, AVERAGE, TOTAL, MAX
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   295
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   296
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   297
    private static final class Record {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   298
        private final Object key;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   299
        private int count = 1;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   300
        private double total;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   301
        private double max;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   302
        private Object value = null;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   303
        public Record(Object key, String sample) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   304
            this.key = key;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   305
            this.value = sample;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   306
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   307
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   308
        public Record(Object object, double sample) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   309
            this.key = object;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   310
            this.value = sample;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   311
            this.max = sample;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   312
            this.total = sample;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   313
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   314
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   315
        public long getCount() {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   316
            return count;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   317
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   318
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   319
        public double getAverage() {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   320
            return total / count;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   321
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   322
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   323
        public double getMax() {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   324
            return max;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   325
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   326
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   327
        public double getTotal() {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   328
            return total;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   329
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   330
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   331
        public int hashCode() {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   332
            return key == null ? 0 : key.hashCode();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   333
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   334
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   335
        public boolean equals(Object o) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   336
            if (o instanceof Record) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   337
                Record that = (Record) o;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   338
                return Objects.equals(that.key, this.key);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   339
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   340
            return false;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   341
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   342
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   343
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   344
    private static final class Field implements Iterable<Record> {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   345
        private final HashMap<Object, Record> histogram = new HashMap<>();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   346
        private final Option[] options;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   347
        private double norm;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   348
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   349
        public Field(Option... options) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   350
            this.options = options;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   351
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   352
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   353
        public void addSample(double sample) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   354
            addSample(this, sample);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   355
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   356
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   357
        public void addSample(String sample) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   358
            histogram.merge(this, new Record(this, sample), (a, b) -> {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   359
                a.count++;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   360
                a.value = sample;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   361
                return a;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   362
            });
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   363
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   364
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   365
        public void addSample(Object key, double sample) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   366
            histogram.merge(key, new Record(key, sample), (a, b) -> {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   367
                a.count++;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   368
                a.total += sample;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   369
                a.value = sample;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   370
                a.max = Math.max(a.max, sample);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   371
                return a;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   372
            });
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   373
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   374
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   375
        public boolean hasOption(Option option) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   376
            for (Option o : options) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   377
                if (o == option) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   378
                    return true;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   379
                }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   380
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   381
            return false;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   382
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   383
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   384
        @Override
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   385
        public Iterator<Record> iterator() {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   386
            List<Record> records = new ArrayList<>(histogram.values());
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   387
            Collections.sort(records, (a, b) -> Long.compare(b.getCount(), a.getCount()));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   388
            if (hasOption(Option.TOTAL)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   389
                Collections.sort(records, (a, b) -> Double.compare(b.getTotal(), a.getTotal()));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   390
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   391
            if (hasOption(Option.NORMALIZED)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   392
                norm = 0.0;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   393
                for (Record r : records) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   394
                    if (hasOption(Option.TOTAL)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   395
                        norm += r.getTotal();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   396
                    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   397
                    if (hasOption(Option.COUNT)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   398
                        norm += r.getCount();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   399
                    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   400
                }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   401
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   402
            return records.iterator();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   403
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   404
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   405
        public double getNorm() {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   406
            return norm;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   407
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   408
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   409
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   410
    private static void printReport() {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   411
        try {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   412
            StringBuilder template = new StringBuilder(TEMPLATE);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   413
            for (java.lang.reflect.Field f : Health.class.getDeclaredFields()) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   414
                String variable = "$" + f.getName();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   415
                if (f.getType() == Field.class) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   416
                    writeParam(template, variable, (Field) f.get(null));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   417
                }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   418
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   419
            System.out.println(template.toString());
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   420
        } catch (Exception e) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   421
            e.printStackTrace();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   422
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   423
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   424
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   425
    private static void writeParam(StringBuilder template, String variable, Field param) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   426
        Iterator<Record> it = param.iterator();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   427
        int lastIndex = 0;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   428
        while (true) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   429
            int index = template.indexOf(variable, lastIndex);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   430
            if (index == -1) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   431
                return;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   432
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   433
            lastIndex = index + 1;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   434
            Record record = it.hasNext() ? it.next() : null;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   435
            Object value = null;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   436
            if (record != null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   437
                value = (record.key == param) ? record.value : record.key;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   438
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   439
            if (value != null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   440
                if (param.hasOption(Option.MAX)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   441
                    value = record.getMax();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   442
                }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   443
                if (param.hasOption(Option.COUNT)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   444
                    value = record.getCount();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   445
                }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   446
                if (param.hasOption(Option.AVERAGE)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   447
                    value = record.getAverage();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   448
                }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   449
                if (param.hasOption(Option.TOTAL)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   450
                    value = record.getTotal();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   451
                }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   452
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   453
            if (param.hasOption(Option.COUNT)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   454
                value = value == null ? 0 : value;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   455
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   456
            if (param.hasOption(Option.BYTES)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   457
                value = formatBytes((Number) value);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   458
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   459
            if (param.hasOption(Option.DURATION)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   460
                value = formatDuration((Number) value);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   461
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   462
            if (param.hasOption(Option.BYTES_PER_SECOND)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   463
                if (value != null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   464
                    value = formatBytes((Number) value) + "/s";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   465
                }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   466
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   467
            if (param.hasOption(Option.NORMALIZED)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   468
                if (value != null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   469
                    double d = ((Number) value).doubleValue() / param.getNorm();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   470
                    value = formatPercentage(d);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   471
                }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   472
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   473
            if (param.hasOption(Option.PERCENTAGE)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   474
                value = formatPercentage((Number) value);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   475
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   476
            String text;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   477
            if (value == null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   478
                text = record == null ? "" : "N/A";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   479
            } else {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   480
                text = String.valueOf(value);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   481
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   482
            int length = Math.max(text.length(), variable.length());
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   483
            for (int i = 0; i < length; i++) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   484
                char c = i < text.length() ? text.charAt(i) : ' ';
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   485
                template.setCharAt(index + i, c);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   486
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   487
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   488
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   489
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   490
    // # # # FORMATTING # # #
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   491
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   492
    enum TimespanUnit {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   493
        NANOSECONDS("ns", 1000), MICROSECONDS("us", 1000), MILLISECONDS("ms", 1000), SECONDS("s", 60), MINUTES("m", 60),
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   494
        HOURS("h", 24), DAYS("d", 7);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   495
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   496
        final String text;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   497
        final long amount;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   498
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   499
        TimespanUnit(String unit, long amount) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   500
            this.text = unit;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   501
            this.amount = amount;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   502
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   503
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   504
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   505
    private static String formatDuration(Number value) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   506
        if (value == null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   507
            return "N/A";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   508
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   509
        double t = value.doubleValue();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   510
        TimespanUnit result = TimespanUnit.NANOSECONDS;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   511
        for (TimespanUnit unit : TimespanUnit.values()) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   512
            result = unit;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   513
            if (t < 1000) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   514
                break;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   515
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   516
            t = t / unit.amount;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   517
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   518
        return String.format("%.1f %s", t, result.text);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   519
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   520
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   521
    private static String formatPercentage(Number value) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   522
        if (value == null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   523
            return "N/A";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   524
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   525
        return String.format("%6.2f %%", value.doubleValue() * 100);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   526
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   527
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   528
    private static String formatBytes(Number value) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   529
        if (value == null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   530
            return "N/A";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   531
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   532
        long bytes = value.longValue();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   533
        if (bytes >= 1024 * 1024l) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   534
            return bytes / (1024 * 1024L) + " MB";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   535
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   536
        if (bytes >= 1024) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   537
            return bytes / 1024 + " kB";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   538
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   539
        return bytes + " bytes";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   540
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   541
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   542
    private static String topFrame(RecordedStackTrace stackTrace) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   543
        if (stackTrace == null) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   544
            return null;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   545
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   546
        List<RecordedFrame> frames = stackTrace.getFrames();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   547
        if (!frames.isEmpty()) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   548
            RecordedFrame topFrame = frames.get(0);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   549
            if (topFrame.isJavaFrame()) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   550
                return formatMethod(topFrame.getMethod());
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   551
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   552
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   553
        return null;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   554
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   555
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   556
    private static String formatMethod(RecordedMethod m) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   557
        StringBuilder sb = new StringBuilder();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   558
        String typeName = m.getType().getName();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   559
        typeName = typeName.substring(typeName.lastIndexOf('.') + 1);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   560
        sb.append(typeName).append(".").append(m.getName());
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   561
        sb.append("(");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   562
        StringJoiner sj = new StringJoiner(", ");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   563
        String md = m.getDescriptor().replace("/", ".");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   564
        String parameter = md.substring(1, md.lastIndexOf(")"));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   565
        for (String qualifiedName : decodeDescriptors(parameter)) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   566
            sj.add(qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1));
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   567
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   568
        sb.append(sj.length() > 10 ? "..." : sj);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   569
        sb.append(")");
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   570
        return sb.toString();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   571
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   572
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   573
    private static List<String> decodeDescriptors(String descriptor) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   574
        List<String> descriptors = new ArrayList<>();
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   575
        for (int index = 0; index < descriptor.length(); index++) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   576
            String arrayBrackets = "";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   577
            while (descriptor.charAt(index) == '[') {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   578
                arrayBrackets += "[]";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   579
                index++;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   580
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   581
            char c = descriptor.charAt(index);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   582
            String type;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   583
            switch (c) {
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   584
            case 'L':
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   585
                int endIndex = descriptor.indexOf(';', index);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   586
                type = descriptor.substring(index + 1, endIndex);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   587
                index = endIndex;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   588
                break;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   589
            case 'I':
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   590
                type = "int";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   591
                break;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   592
            case 'J':
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   593
                type = "long";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   594
                break;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   595
            case 'Z':
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   596
                type = "boolean";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   597
                break;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   598
            case 'D':
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   599
                type = "double";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   600
                break;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   601
            case 'F':
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   602
                type = "float";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   603
                break;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   604
            case 'S':
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   605
                type = "short";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   606
                break;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   607
            case 'C':
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   608
                type = "char";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   609
                break;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   610
            case 'B':
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   611
                type = "byte";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   612
                break;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   613
            default:
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   614
                type = "<unknown-descriptor-type>";
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   615
            }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   616
            descriptors.add(type + arrayBrackets);
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   617
        }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   618
        return descriptors;
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   619
    }
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   620
}
f4230f4bdd6b Add example apps
egahlin
parents:
diff changeset
   621