EventStream that can serialize events over
the network using an MBeanServerConnection.
The following example shows how to record garbage collection pauses and CPU usage on a remote host and print the events to standard out.
String host = "com.example";
int port = 4711;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL u = new JMXServiceURL(url);
JMXConnector c = JMXConnectorFactory.connect(u);
MBeanServerConnection conn = c.getMBeanServerConnection();
try (var rs = new RemoteRecordingStream(conn)) {
rs.enable("jdk.GCPhasePause").withoutThreshold();
rs.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1));
rs.onEvent("jdk.CPULoad", System.out::println);
rs.onEvent("jdk.GCPhasePause", System.out::println);
rs.start();
}
| Modifier and Type | Class and Description |
|---|---|
| pack-priv static class | |
| pack-priv static class |
| Modifier and Type | Field and Description |
|---|---|
| pack-priv volatile boolean | |
| pack-priv final Instant | |
| private static final String | |
| pack-priv volatile Instant | |
| pack-priv final Object | |
| private Duration | |
| private long | |
| pack-priv final FlightRecorderMXBean | |
| private static final ObjectName | |
| pack-priv final Path | |
| pack-priv final long | |
| pack-priv final DiskRepository | |
| private boolean | |
| pack-priv volatile Instant | |
| pack-priv final EventStream |
| Access | Constructor and Description |
|---|---|
| public | RemoteRecordingStream(MBeanServerConnection
the connection)MBeanServerConnection where the
FlightRecorderMXBean is registered, not
nullCreates an event stream that operates against a |
| public | RemoteRecordingStream(MBeanServerConnection
the connection, Path MBeanServerConnection where the
FlightRecorderMXBean is registered, not
nullthe directory to store event data that is downloaded, not
directory)nullCreates an event stream that operates against a |
| private |
| Modifier and Type | Method and Description |
|---|---|
| public void | awaitTermination(Duration timeout)
Implements jdk. Blocks until all actions are completed, or the stream is closed, or the timeout occurs, or the current thread is interrupted, whichever happens first. |
| public void | awaitTermination()
Implements jdk. Blocks until all actions are completed, or the stream is closed, or the current thread is interrupted, whichever happens first. |
| private static void | |
| public void | close()
Implements jdk. Releases all resources associated with this stream. |
| private static void | |
| private List | |
| private static FlightRecorderMXBean | |
| private long | |
| public EventSettings | |
| public void | |
| public EventSettings | |
| private void | |
| private RecordingInfo | |
| pack-priv boolean | |
| private static Path | |
| public void | onClose(Runnable action)
Implements jdk. Registers an action to perform when the stream is closed. |
| public void | onError(Consumer<Throwable> action)
Implements jdk. Registers an action to perform if an exception occurs. |
| public void | onEvent(Consumer<RecordedEvent> action)
Implements jdk. Registers an action to perform on all events in the stream. |
| public void | onEvent(String eventName, Consumer<RecordedEvent> action)
Implements jdk. Registers an action to perform on all events matching a name. |
| public void | onFlush(Runnable action)
Implements jdk. Registers an action to perform after the stream has been flushed. |
| public void | onMetadata(Consumer<MetadataEvent> action)
Overrides default jdk. Registers an action to perform when new metadata arrives in the stream. |
| public boolean | |
| public void | setEndTime(Instant endTime)
Implements jdk. Specifies the end time of the stream. |
| public void | |
| public void | setMaxSize(long
the amount of data to retain, maxSize)0 if infiniteDetermines how much data is kept for the stream. |
| public void | setOrdered(boolean ordered)
Implements jdk. Specifies that events arrive in chronological order, sorted by the time they were committed to the stream. |
| public void | setReuse(boolean reuse)
Implements jdk. Specifies that the event object in an |
| public void | setSettings(Map<String, String>
the settings to set, not settings)nullReplaces all settings for this recording stream. |
| public void | setStartTime(Instant startTime)
Implements jdk. Specifies the start time of the stream. |
| public void | |
| public void | startAsync()
Implements jdk. Starts asynchronous processing of actions. |
| private void | |
| public boolean | |
| private void |
| closed | back to summary |
|---|---|
| pack-priv volatile boolean closed | |
| creationTime | back to summary |
|---|---|
| pack-priv final Instant creationTime | |
| ENABLED | back to summary |
|---|---|
| private static final String ENABLED | |
| endTime | back to summary |
|---|---|
| pack-priv volatile Instant endTime | |
| lock | back to summary |
|---|---|
| pack-priv final Object lock | |
| maxAge | back to summary |
|---|---|
| private Duration maxAge | |
| maxSize | back to summary |
|---|---|
| private long maxSize | |
| mbean | back to summary |
|---|---|
| pack-priv final FlightRecorderMXBean mbean | |
| OBJECT_NAME | back to summary |
|---|---|
| private static final ObjectName OBJECT_NAME | |
| path | back to summary |
|---|---|
| pack-priv final Path path | |
| recordingId | back to summary |
|---|---|
| pack-priv final long recordingId | |
| repository | back to summary |
|---|---|
| pack-priv final DiskRepository repository | |
| started | back to summary |
|---|---|
| private boolean started | |
| startTime | back to summary |
|---|---|
| pack-priv volatile Instant startTime | |
| stream | back to summary |
|---|---|
| pack-priv final EventStream stream | |
| RemoteRecordingStream | back to summary |
|---|---|
| public RemoteRecordingStream(MBeanServerConnection connection) throws IOException Creates an event stream that operates against a
To configure event settings, use
| |
| RemoteRecordingStream | back to summary |
|---|---|
| public RemoteRecordingStream(MBeanServerConnection connection, Path directory) throws IOException Creates an event stream that operates against a
To configure event settings, use
| |
| RemoteRecordingStream | back to summary |
|---|---|
| private RemoteRecordingStream(MBeanServerConnection connection, Path directory, boolean delete) throws IOException | |
| awaitTermination | back to summary |
|---|---|
| public void awaitTermination(Duration timeout) throws InterruptedException Implements jdk. Doc from jdk. Blocks until all actions are completed, or the stream is closed, or the timeout occurs, or the current thread is interrupted, whichever happens first.
| |
| awaitTermination | back to summary |
|---|---|
| public void awaitTermination() throws InterruptedException Implements jdk. Doc from jdk. Blocks until all actions are completed, or the stream is closed, or the current thread is interrupted, whichever happens first.
| |
| checkFileAccess | back to summary |
|---|---|
| private static void checkFileAccess(Path directory) throws IOException | |
| close | back to summary |
|---|---|
| public void close() Implements jdk. Doc from jdk. Releases all resources associated with this stream. If a stream is started, asynchronously or synchronously, it is stopped immediately or after the next flush. This method does NOT guarantee that all registered actions are completed before return. Closing a previously closed stream has no effect.
| |
| closeSilently | back to summary |
|---|---|
| private static void closeSilently(RandomAccessFile f) | |
| configurations | back to summary |
|---|---|
| private List | |
| createProxy | back to summary |
|---|---|
| private static FlightRecorderMXBean createProxy(MBeanServerConnection connection) throws IOException | |
| createRecording | back to summary |
|---|---|
| private long createRecording() throws IOException | |
| disable | back to summary |
|---|---|
| public EventSettings disable(String name) Disables event with the specified name. If multiple events with same name (for example, the same class is loaded in different class loaders), then all events that match the name are disabled.
| |
| dump | back to summary |
|---|---|
| public void dump(Path destination) throws IOException Writes recording data to a file. The recording stream must be started, but not closed. It's highly recommended that a max age or max size is set before starting the stream. Otherwise, the dump may not contain any events.
| |
| enable | back to summary |
|---|---|
| public EventSettings enable(String name) Enables the event with the specified name. If multiple events have the same name (for example, the same class is loaded in different class loaders), then all events that match the name are enabled.
| |
| ensureStartable | back to summary |
|---|---|
| private void ensureStartable() | |
| getRecordingInfo | back to summary |
|---|---|
| private RecordingInfo getRecordingInfo(List<RecordingInfo> infos, long id) throws IOException | |
| isClosed | back to summary |
|---|---|
| pack-priv boolean isClosed() | |
| makeTempDirectory | back to summary |
|---|---|
| private static Path makeTempDirectory() throws IOException | |
| onClose | back to summary |
|---|---|
| public void onClose(Runnable action) Implements jdk. Doc from jdk. Registers an action to perform when the stream is closed. If the stream is already closed, the action will be performed immediately in the current thread.
| |
| onError | back to summary |
|---|---|
| public void onError(Consumer<Throwable> action) Implements jdk. Doc from jdk. Registers an action to perform if an exception occurs. If an action is not registered, an exception stack trace is printed to standard error. Registering an action overrides the default behavior. If multiple actions have been registered, they are performed in the order of registration. If this method itself throws an exception, resulting behavior is undefined.
| |
| onEvent | back to summary |
|---|---|
| public void onEvent(Consumer<RecordedEvent> action) Implements jdk. Doc from jdk. Registers an action to perform on all events in the stream.
To perform an action on a subset of event types, consider using
| |
| onEvent | back to summary |
|---|---|
| public void onEvent(String eventName, Consumer<RecordedEvent> action) Implements jdk. Doc from jdk. Registers an action to perform on all events matching a name.
| |
| onFlush | back to summary |
|---|---|
| public void onFlush(Runnable action) Implements jdk. Doc from jdk. Registers an action to perform after the stream has been flushed.
| |
| onMetadata | back to summary |
|---|---|
| public void onMetadata(Consumer<MetadataEvent> action) Overrides default jdk. Doc from jdk. Registers an action to perform when new metadata arrives in the stream. The event type of an event always arrives sometime before the actual event. The action must be registered before the stream is started.
The following example shows how to listen to new event types, register
an action if the event type name matches a regular expression and increase a
counter if a matching event is found. A benefit of using an action per
event type, instead of the generic static long count = 0; public static void main(String... args) throws IOException { Path file = Path.of(args[0]); String regExp = args[1]; var pr = Pattern.compile(regExp).asMatchPredicate(); try (var s = EventStream.openFile(file)) { s.setOrdered(false); s.onMetadata(metadata -> metadata.getAddedEventTypes() .stream().map(EventType::getName).filter(pr) .forEach(eventName -> s.onEvent(eventName, event -> count++))); s.start(); System.out.println(count + " events matches " + regExp); } }
| |
| remove | back to summary |
|---|---|
| public boolean remove(Object action) Implements jdk. Doc from jdk. Unregisters an action. If the action has been registered multiple times, all instances are unregistered.
| |
| setEndTime | back to summary |
|---|---|
| public void setEndTime(Instant endTime) Implements jdk. Doc from jdk. Specifies the end time of the stream. The end time must be set before starting the stream. At end time, the stream is closed.
| |
| setMaxAge | back to summary |
|---|---|
| public void setMaxAge(Duration maxAge) Determines how far back data is kept for the stream. To control the amount of recording data stored on disk, the maximum length of time to retain the data can be specified. Data stored on disk that is older than the specified length of time is removed by the Java Virtual Machine (JVM). If neither maximum limit or the maximum age is set, the size of the recording may grow indefinitely if events are not consumed.
| |
| setMaxSize | back to summary |
|---|---|
| public void setMaxSize(long maxSize) Determines how much data is kept for the stream. To control the amount of recording data that is stored on disk, the maximum amount of data to retain can be specified. When the maximum limit is exceeded, the Java Virtual Machine (JVM) removes the oldest chunk to make room for a more recent chunk. If neither maximum limit or the maximum age is set, the size of the recording may grow indefinitely if events are not consumed. The size is measured in bytes.
| |
| setOrdered | back to summary |
|---|---|
| public void setOrdered(boolean ordered) Implements jdk. Doc from jdk. Specifies that events arrive in chronological order, sorted by the time they were committed to the stream.
| |
| setReuse | back to summary |
|---|---|
| public void setReuse(boolean reuse) Implements jdk. Doc from jdk. Specifies that the event object in an
If reuse is set to
| |
| setSettings | back to summary |
|---|---|
| public void setSettings(Map<String, String> settings) Replaces all settings for this recording stream. The following example connects to a remote host and stream events using settings from the "default" configuration.
{
String host = "com.example";
int port = 4711;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL u = new JMXServiceURL(url);
JMXConnector c = JMXConnectorFactory.connect(u);
MBeanServerConnection conn = c.getMBeanServerConnection();
try (final var rs = new RemoteRecordingStream(conn)) {
rs.onMetadata(e -> {
for (Configuration c : e.getConfigurations()) {
if (c.getName().equals("default")) {
rs.setSettings(c.getSettings());
}
}
});
rs.onEvent(System.out::println);
rs.start();
}
| |
| setStartTime | back to summary |
|---|---|
| public void setStartTime(Instant startTime) Implements jdk. Doc from jdk. Specifies the start time of the stream. The start time must be set before starting the stream
| |
| start | back to summary |
|---|---|
| public void start() Implements jdk. Doc from jdk. Starts processing of actions. Actions are performed in the current thread.
To stop the stream, use the
| |
| startAsync | back to summary |
|---|---|
| public void startAsync() Implements jdk. Doc from jdk. Starts asynchronous processing of actions. Actions are performed in a single separate thread.
To stop the stream, use the
| |
| startDownload | back to summary |
|---|---|
| private void startDownload() | |
| stop | back to summary |
|---|---|
| public boolean stop() Stops the recording stream. Stops a started stream and waits until all events in the recording have been consumed.
Invoking this method in an action, for example in the
The following code snippet illustrates how this method can be used in
conjunction with the AtomicLong bytesWritten = new AtomicLong();
try (var r = new RemoteRecordingStream(connection)) {
r.setMaxSize(Long.MAX_VALUE);
r.enable("jdk.FileWrite").withoutThreshold();
r.onEvent(event ->
bytesWritten.addAndGet(event.getLong("bytesWritten"))
);
r.startAsync();
testFoo();
r.stop();
if (bytesWritten.get() > 1_000_000L) {
r.dump(Path.of("file-write-events.jfr"));
throw new AssertionError("testFoo() writes too much data to disk");
}
}
| |
| updateOnCompleteHandler | back to summary |
|---|---|
| private void updateOnCompleteHandler() | |
| Modifier and Type | Field and Description |
|---|---|
| private final DiskRepository |
| Access | Constructor and Description |
|---|---|
| pack-priv |
| Modifier and Type | Method and Description |
|---|---|
| public void | accept(Long endNanos)
Implements java. Performs this operation on the given argument. |
| repository | back to summary |
|---|---|
| private final DiskRepository repository | |
| ChunkConsumer | back to summary |
|---|---|
| pack-priv ChunkConsumer(DiskRepository repository) | |
| accept | back to summary |
|---|---|
| public void accept(Long endNanos) Implements java. Doc from java. Performs this operation on the given argument.
| |
| Modifier and Type | Field and Description |
|---|---|
| private final String | |
| private final FlightRecorderMXBean | |
| private final long |
| Access | Constructor and Description |
|---|---|
| pack-priv |
| Modifier and Type | Method and Description |
|---|---|
| private Map | |
| public Map | |
| public void |
| identifier | back to summary |
|---|---|
| private final String identifier | |
| mbean | back to summary |
|---|---|
| private final FlightRecorderMXBean mbean | |
| recordingId | back to summary |
|---|---|
| private final long recordingId | |
| RemoteSettings | back to summary |
|---|---|
| pack-priv RemoteSettings(FlightRecorderMXBean mbean, long recordingId, String identifier) | |
| getEventSettings | back to summary |
|---|---|
| private Map | |
| toMap | back to summary |
|---|---|
| public Map Implements jdk.
| |
| with | back to summary |
|---|---|
| public void with(String name, String value) Implements jdk.
| |