From 8e97ecee8f826558307539687e2960c87e892238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Andr=C3=A9n?= Date: Mon, 19 Sep 2016 11:00:34 +0200 Subject: [PATCH] Textual representations of event codes in flight recorder dump (#21489) --- .../akka/remote/artery/ArteryTransport.scala | 3 +- .../remote/artery/FlightRecorderEvents.scala | 43 +++++++++++++++++++ .../remote/artery/FlightRecorderReader.scala | 11 ++++- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala b/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala index b4b98c34ca..c0d3e02ce0 100644 --- a/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala +++ b/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala @@ -489,6 +489,7 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R try { if (settings.Advanced.DeleteAeronDirectory) { IoUtil.delete(new File(driver.aeronDirectoryName), false) + topLevelFREvents.loFreq(Transport_MediaFileDeleted, NoMetaData) } } catch { case NonFatal(e) ⇒ @@ -766,7 +767,7 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R if (areonErrorLog != null) areonErrorLog.close() if (mediaDriver.get.isDefined) { stopMediaDriver() - topLevelFREvents.loFreq(Transport_MediaFileDeleted, NoMetaData) + } topLevelFREvents.loFreq(Transport_FlightRecorderClose, NoMetaData) diff --git a/akka-remote/src/main/scala/akka/remote/artery/FlightRecorderEvents.scala b/akka-remote/src/main/scala/akka/remote/artery/FlightRecorderEvents.scala index e800e5493f..ea0ccff368 100644 --- a/akka-remote/src/main/scala/akka/remote/artery/FlightRecorderEvents.scala +++ b/akka-remote/src/main/scala/akka/remote/artery/FlightRecorderEvents.scala @@ -2,6 +2,8 @@ package akka.remote.artery object FlightRecorderEvents { + // Note: Remember to update dictionary when adding new events! + val NoMetaData = Array.empty[Byte] // Top level remoting events @@ -44,4 +46,45 @@ object FlightRecorderEvents { val Compression_CompressedManifest = 91 val Compression_AllocatedManifestCompressionId = 92 + // Used for presentation of the entries in the flight recorder + lazy val eventDictionary = Map( + Transport_MediaDriverStarted → "Transport: Media driver started", + Transport_AeronStarted → "Transport: Aeron started", + Transport_AeronErrorLogStarted → "Transport: Aeron error log started", + Transport_TaskRunnerStarted → "Transport: Task runner started", + Transport_UniqueAddressSet → "Transport: Unique address set", + Transport_MaterializerStarted → "Transport: Materializer started", + Transport_StartupFinished → "Transport: Startup finished", + Transport_OnAvailableImage → "Transport: onAvailableImage", + Transport_KillSwitchPulled → "Transport: KillSwitch pulled", + Transport_Stopped → "Transport: Stopped", + Transport_AeronErrorLogTaskStopped → "Transport: Aeron errorLog task stopped", + Transport_MediaFileDeleted → "Transport: Media file deleted", + Transport_FlightRecorderClose → "Transport: Flight recorder closed", + Transport_SendQueueOverflow → "Transport: Send queue overflow", + + // Aeron Sink events + AeronSink_Started → "AeronSink: Started", + AeronSink_TaskRunnerRemoved → "AeronSink: Task runner removed", + AeronSink_PublicationClosed → "AeronSink: Publication closed", + AeronSink_Stopped → "AeronSink: Stopped", + AeronSink_EnvelopeGrabbed → "AeronSink: Envelope grabbed", + AeronSink_EnvelopeOffered → "AeronSink: Envelope offered", + AeronSink_GaveUpEnvelope → "AeronSink: Gave up envelope", + AeronSink_DelegateToTaskRunner → "AeronSink: Delegate to task runner", + AeronSink_ReturnFromTaskRunner → "AeronSink: Return from task runner", + + // Aeron Source events + AeronSource_Started → "AeronSource: Started", + AeronSource_Stopped → "AeronSource: Stopped", + AeronSource_Received → "AeronSource: Received", + AeronSource_DelegateToTaskRunner → "AeronSource: Delegate to task runner", + AeronSource_ReturnFromTaskRunner → "AeronSource: Return from task runner", + + // Compression events + Compression_CompressedActorRef → "Compression: Compressed ActorRef", + Compression_AllocatedActorRefCompressionId → "Compression: Allocated ActorRef compression id", + Compression_CompressedManifest → "Compression: Compressed manifest", + Compression_AllocatedManifestCompressionId → "Compression: Allocated manifest compression id" + ).map { case (int, str) ⇒ int.toLong → str } } diff --git a/akka-remote/src/main/scala/akka/remote/artery/FlightRecorderReader.scala b/akka-remote/src/main/scala/akka/remote/artery/FlightRecorderReader.scala index 71682da8b3..762accc4c7 100644 --- a/akka-remote/src/main/scala/akka/remote/artery/FlightRecorderReader.scala +++ b/akka-remote/src/main/scala/akka/remote/artery/FlightRecorderReader.scala @@ -197,11 +197,18 @@ private[akka] final class FlightRecorderReader(fileChannel: FileChannel) { } case class RichEntry(timeStamp: Instant, dirty: Boolean, code: Long, metadata: Array[Byte]) { - override def toString: String = s"[$timeStamp] ${if (dirty) "#" else ""} \t $code | ${metadata.mkString(",")}" + override def toString: String = { + val textualCode = FlightRecorderEvents.eventDictionary.getOrElse(code, "").take(34) + val metadataString = new String(metadata, "UTF-8") + f"[$timeStamp] ${if (dirty) "#" else ""} $code%3s $textualCode%-34s | $metadataString" + } } case class CompactEntry(timeStamp: Instant, dirty: Boolean, code: Long, param: Long) { - override def toString: String = s"[$timeStamp] ${if (dirty) "#" else ""} \t $code | $param" + override def toString: String = { + val textualCode = FlightRecorderEvents.eventDictionary.getOrElse(code, "").take(34) + f"[$timeStamp] ${if (dirty) "#" else ""} $code%3s $textualCode%-34s | $param" + } } private val fileBuffer = new MappedResizeableBuffer(fileChannel, 0, TotalSize)