Streams have the .timestamp() and .elapsed() operations which produce Tuple2<Long, T> where Long is the timestamp or the delta between 2 onNext. You can then play with reduce().
In this test I actually reduce the metrics produced by elapsed to compute a moving time average:
2.1 will benefit from a more generic MetricsProcessor for these scenarios, we have it in the backlog once we're done migrating reactor-core into its new focused job: toolkit for creating basic Processors (including the current ones), Subscribers, and Publisher. Reactor-Stream being the module using these blocks to produce high order operations.