/*
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.jfr.internal.management;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import jdk.jfr.EventType;
import jdk.jfr.internal.JVMSupport;
import jdk.jfr.internal.LogLevel;
import jdk.jfr.internal.LogTag;
import jdk.jfr.internal.Logger;
import jdk.jfr.internal.MetadataRepository;
import jdk.jfr.internal.Utils;
import jdk.jfr.internal.instrument.JDKEvents;
The management API in module jdk.management.jfr should be built on top of the
public API in jdk.jfr. Before putting more functionality here, consider if it
should not be part of the public API, and if not, please provide motivation
/**
* The management API in module jdk.management.jfr should be built on top of the
* public API in jdk.jfr. Before putting more functionality here, consider if it
* should not be part of the public API, and if not, please provide motivation
*
*/
public final class ManagementSupport {
// Purpose of this method is to expose the event types to the
// FlightRecorderMXBean without instantiating Flight Recorder.
//
// This allows:
//
// 1) discoverability, so event settings can be exposed without the need to
// create a new Recording in FlightrecorderMXBean.
//
// 2) a graphical JMX client to list all attributes to the user, without
// loading JFR memory buffers. This is especially important when there is
// no intent to use Flight Recorder.
//
// An alternative design would be to make FlightRecorder#getEventTypes
// static, but it would the make the API look strange
//
public static List<EventType> getEventTypes() {
// would normally be checked when a Flight Recorder instance is created
Utils.checkAccessFlightRecorder();
if (JVMSupport.isNotAvailable()) {
return new ArrayList<>();
}
JDKEvents.initialize(); // make sure JDK events are available
return Collections.unmodifiableList(MetadataRepository.getInstance().getRegisteredEventTypes());
}
// Reuse internal code for parsing a timespan
public static long parseTimespan(String s) {
return Utils.parseTimespan(s);
}
// Reuse internal code for formatting settings
public static final String formatTimespan(Duration dValue, String separation) {
return Utils.formatTimespan(dValue, separation);
}
// Reuse internal logging mechanism
public static void logError(String message) {
Logger.log(LogTag.JFR, LogLevel.ERROR, message);
}
}