Class RemoteRecordingStream
- All Implemented Interfaces:
AutoCloseable,EventStream
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();
}
- Since:
- 16
-
Constructor Summary
ConstructorsConstructorDescriptionRemoteRecordingStream(MBeanServerConnection connection) Creates an event stream that operates against aMBeanServerConnectionthat has a registeredFlightRecorderMXBean.RemoteRecordingStream(MBeanServerConnection connection, Path directory) Creates an event stream that operates against aMBeanServerConnectionthat has a registeredFlightRecorderMXBean. -
Method Summary
Modifier and TypeMethodDescriptionvoidBlocks until all actions are completed, or the stream is closed, or the current thread is interrupted, whichever happens first.voidawaitTermination(Duration timeout) Blocks until all actions are completed, or the stream is closed, or the timeout occurs, or the current thread is interrupted, whichever happens first.voidclose()Releases all resources associated with this stream.Disables event with the specified name.voidWrites recording data to a file.Enables the event with the specified name.voidRegisters an action to perform when the stream is closed.voidRegisters an action to perform if an exception occurs.voidonEvent(String eventName, Consumer<RecordedEvent> action) Registers an action to perform on all events matching a name.voidonEvent(Consumer<RecordedEvent> action) Registers an action to perform on all events in the stream.voidRegisters an action to perform after the stream has been flushed.booleanUnregisters an action.voidsetEndTime(Instant endTime) Specifies the end time of the stream.voidDetermines how far back data is kept for the stream.voidsetMaxSize(long maxSize) Determines how much data is kept for the stream.voidsetOrdered(boolean ordered) Specifies that events arrives in chronological order, sorted by the time they were committed to the stream.voidsetReuse(boolean reuse) Specifies that the event object in anEventStream.onEvent(Consumer)action can be reused.voidsetSettings(Map<String, String> settings) Replaces all settings for this recording stream.voidsetStartTime(Instant startTime) Specifies the start time of the stream.voidstart()Starts processing of actions.voidStarts asynchronous processing of actions.booleanstop()Stops the recording stream.Methods declared in class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods declared in interface jdk.jfr.consumer.EventStream
onMetadata
-
Constructor Details
-
RemoteRecordingStream
Creates an event stream that operates against aMBeanServerConnectionthat has a registeredFlightRecorderMXBean.To configure event settings, use
setSettings(Map).- Parameters:
connection- theMBeanServerConnectionwhere theFlightRecorderMXBeanis registered, notnull- Throws:
IOException- if a stream can't be opened, an I/O error occurs when trying to access the repository or theFlightRecorderMXBean
-
RemoteRecordingStream
Creates an event stream that operates against aMBeanServerConnectionthat has a registeredFlightRecorderMXBean.To configure event settings, use
setSettings(Map).- Parameters:
connection- theMBeanServerConnectionwhere theFlightRecorderMXBeanis registered, notnulldirectory- the directory to store event data that is downloaded, notnull- Throws:
IOException- if a stream can't be opened, an I/O error occurs when trying to access the repository or theFlightRecorderMXBean
-
-
Method Details
-
setSettings
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(); }- Parameters:
settings- the settings to set, notnull- See Also:
-
disable
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.
- Parameters:
name- the settings for the event, notnull- Returns:
- an event setting for further configuration, not
null
-
enable
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.
- Parameters:
name- the settings for the event, notnull- Returns:
- an event setting for further configuration, not
null - See Also:
-
setMaxAge
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.
- Parameters:
maxAge- the length of time that data is kept, ornullif infinite- Throws:
IllegalArgumentException- ifmaxAgeis negativeIllegalStateException- if the recording is in theCLOSEDstate
-
setMaxSize
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.
- Parameters:
maxSize- the amount of data to retain,0if infinite- Throws:
IllegalArgumentException- ifmaxSizeis negativeIllegalStateException- if the recording is inCLOSEDstate
-
onEvent
Description copied from interface:EventStreamRegisters an action to perform on all events in the stream.To perform an action on a subset of event types, consider using
EventStream.onEvent(String, Consumer)andEventStream.onMetadata(Consumer)as it is likely more performant than any selection or filtering mechanism implemented in a generic action.- Specified by:
onEventin interfaceEventStream- Parameters:
action- an action to perform on eachRecordedEvent, notnull- See Also:
-
onEvent
Description copied from interface:EventStreamRegisters an action to perform on all events matching a name.- Specified by:
onEventin interfaceEventStream- Parameters:
eventName- the name of the event, notnullaction- an action to perform on eachRecordedEventmatching the event name, notnull
-
onFlush
Description copied from interface:EventStreamRegisters an action to perform after the stream has been flushed.- Specified by:
onFlushin interfaceEventStream- Parameters:
action- an action to perform after the stream has been flushed, notnull
-
onError
Description copied from interface:EventStreamRegisters 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.
- Specified by:
onErrorin interfaceEventStream- Parameters:
action- an action to perform if an exception occurs, notnull
-
onClose
Description copied from interface:EventStreamRegisters 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.
- Specified by:
onClosein interfaceEventStream- Parameters:
action- an action to perform after the stream is closed, notnull- See Also:
-
close
public void close()Description copied from interface:EventStreamReleases 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.
- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceEventStream
-
remove
Description copied from interface:EventStreamUnregisters an action.If the action has been registered multiple times, all instances are unregistered.
- Specified by:
removein interfaceEventStream- Parameters:
action- the action to unregister, notnull- Returns:
trueif the action was unregistered,falseotherwise- See Also:
-
setReuse
public void setReuse(boolean reuse) Description copied from interface:EventStreamSpecifies that the event object in anEventStream.onEvent(Consumer)action can be reused.If reuse is set to
true, an action should not keep a reference to the event object after the action has completed.- Specified by:
setReusein interfaceEventStream- Parameters:
reuse-trueif an event object can be reused,falseotherwise
-
setOrdered
public void setOrdered(boolean ordered) Description copied from interface:EventStreamSpecifies that events arrives in chronological order, sorted by the time they were committed to the stream.- Specified by:
setOrderedin interfaceEventStream- Parameters:
ordered- if event objects arrive in chronological order toEventStream.onEvent(Consumer)
-
setStartTime
Description copied from interface:EventStreamSpecifies the start time of the stream.The start time must be set before starting the stream
- Specified by:
setStartTimein interfaceEventStream- Parameters:
startTime- the start time, notnull- See Also:
-
setEndTime
Description copied from interface:EventStreamSpecifies the end time of the stream.The end time must be set before starting the stream.
At end time, the stream is closed.
- Specified by:
setEndTimein interfaceEventStream- Parameters:
endTime- the end time, notnull- See Also:
-
start
public void start()Description copied from interface:EventStreamStarts processing of actions.Actions are performed in the current thread.
To stop the stream, use the
EventStream.close()method.- Specified by:
startin interfaceEventStream
-
startAsync
public void startAsync()Description copied from interface:EventStreamStarts asynchronous processing of actions.Actions are performed in a single separate thread.
To stop the stream, use the
EventStream.close()method.- Specified by:
startAsyncin interfaceEventStream
-
stop
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
onEvent(Consumer)method, could block the stream indefinitely. To stop the stream abruptly, use theclose()method.The following code snippet illustrates how this method can be used in conjunction with the
startAsync()method to monitor what happens during a test method: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"); } }- Returns:
trueif recording is stopped,falseotherwise- Throws:
IllegalStateException- if the recording is not started or is already stopped- Since:
- 20
-
dump
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.
- Parameters:
destination- the location where recording data is written, notnull- Throws:
IOException- if the recording data can't be copied to the specified location, or if the stream is closed, or not started.- Since:
- 17
- See Also:
-
awaitTermination
Description copied from interface:EventStreamBlocks until all actions are completed, or the stream is closed, or the timeout occurs, or the current thread is interrupted, whichever happens first.- Specified by:
awaitTerminationin interfaceEventStream- Parameters:
timeout- the maximum time to wait, notnull- Throws:
InterruptedException- if interrupted while waiting- See Also:
-
awaitTermination
Description copied from interface:EventStreamBlocks until all actions are completed, or the stream is closed, or the current thread is interrupted, whichever happens first.- Specified by:
awaitTerminationin interfaceEventStream- Throws:
InterruptedException- if interrupted while waiting- See Also:
-