Skip to content

Commit 79b78a1

Browse files
committed
simulation: short-leios --shared-log-format now takes CBOR|JSON arg
1 parent 51d8667 commit 79b78a1

File tree

3 files changed

+49
-20
lines changed

3 files changed

+49
-20
lines changed

simulation/src/LeiosProtocol/Short/DataSimP2P.hs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import Data.Ord
4444
import qualified Data.Set as Set
4545
import Diffusion
4646
import GHC.Generics
47+
import LeiosEvents (encodeCBOR)
4748
import LeiosProtocol.Common hiding (Point)
4849
import qualified LeiosProtocol.Config as OnDisk
4950
import LeiosProtocol.Short
@@ -230,13 +231,14 @@ accumDataTransmitted _msg TcpMsgForecast{..} = [(start, end, msgSize)]
230231
!start = realToFrac msgSendLeadingEdge.unTime
231232
!end = realToFrac msgSendTrailingEdge.unTime
232233

234+
data LogFormat = Shared {cbor :: Bool} | Legacy {verbosity :: Int}
235+
233236
data SimOutputConfig = SimOutputConfig
234237
{ logFile :: Maybe FilePath
235-
, logVerbosity :: Int
236238
, dataFile :: Maybe FilePath
237239
, analize :: Bool
238240
, stop :: Time
239-
, sharedFormat :: Bool
241+
, logFormat :: LogFormat
240242
}
241243

242244
rawDataFromState :: OnDisk.Config -> P2PNetwork -> LeiosSimState -> Time -> RawLeiosData
@@ -336,9 +338,11 @@ exampleSim seed cfg p2pNetwork@P2PNetwork{..} SimOutputConfig{..} = do
336338
runModel model =
337339
runSampleModel' logFile logEvent model stop $
338340
exampleTrace2 seed cfg p2pNetwork
339-
logEvent = case sharedFormat of
340-
False -> logLeiosTraceEvent p2pNodeNames logVerbosity
341-
True -> (fmap toEncoding .) . sharedTraceEvent p2pNodeNames
341+
logEvent = case logFormat of
342+
Legacy{..} -> jsonlLog $ logLeiosTraceEvent p2pNodeNames verbosity
343+
Shared{cbor}
344+
| cbor -> binaryLog $ (fmap (encodeCBOR . (: [])) .) . sharedTraceEvent p2pNodeNames
345+
| otherwise -> jsonlLog $ (fmap toEncoding .) . sharedTraceEvent p2pNodeNames
342346
renderState fp st = do
343347
let diffusionData = maybeAnalizeRawData analize (rawDataFromState cfg p2pNetwork st stop)
344348
encodeFile fp diffusionData

simulation/src/Main.hs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import Data.Aeson (eitherDecodeFileStrict')
1313
import Data.Default (Default (..))
1414
import Data.List (find)
1515
import qualified Data.Map as Map
16-
import Data.Maybe (fromMaybe, listToMaybe)
16+
import Data.Maybe (fromMaybe, isJust)
1717
import qualified Data.Yaml as Yaml
1818
import qualified ExamplesRelay
1919
import qualified ExamplesRelayP2P
@@ -374,12 +374,17 @@ runSimOptions SimOptions{..} = case simCommand of
374374
p2pNetwork <- execTopologyOptions rng1 topologyOptions
375375
let outputCfg =
376376
DataShortLeiosP2P.SimOutputConfig
377-
{ logFile = listToMaybe [dropExtension simOutputFile <.> "log" | logVerbosity > 0 || sharedFormat]
378-
, logVerbosity
379-
, dataFile = guard (takeExtension simOutputFile == ".json") >> pure simOutputFile
377+
{ logFile = do
378+
guard (logVerbosity > 0 || isJust sharedFormat)
379+
pure $ dropExtension simOutputFile <.> "log"
380+
, dataFile = do
381+
guard (takeExtension simOutputFile == ".json")
382+
pure simOutputFile
380383
, analize
381384
, stop = simOutputSeconds
382-
, sharedFormat
385+
, logFormat = case sharedFormat of
386+
Just x -> DataShortLeiosP2P.Shared (x == CBOR)
387+
Nothing -> DataShortLeiosP2P.Legacy logVerbosity
383388
}
384389
DataShortLeiosP2P.exampleSim rng2 config p2pNetwork outputCfg
385390

@@ -415,7 +420,7 @@ data SimCommand
415420
, topologyOptions :: TopologyOptions
416421
, logVerbosity :: Int
417422
, analize :: Bool
418-
, sharedFormat :: Bool
423+
, sharedFormat :: Maybe OutputFormat
419424
}
420425

421426
parserSimCommand :: Parser SimCommand
@@ -443,7 +448,7 @@ parserShortLeios =
443448
<*> parserTopologyOptions
444449
<*> logVerbosity
445450
<*> switch (long "analize" <> help "Calculate metrics and statistics.")
446-
<*> switch (long "shared-log-format" <> help "Use log format documented in trace.haskell.d.ts. Ignores --log-verbosity.")
451+
<*> optional sharedLogFormat
447452
where
448453
logVerbosity =
449454
option
@@ -453,6 +458,18 @@ parserShortLeios =
453458
<> help "0: no log; 1: major events; 2: debug; 3: all."
454459
<> shownDefValue 1
455460
)
461+
sharedLogFormat =
462+
option
463+
auto
464+
( long "shared-log-format"
465+
<> metavar "OUTPUT"
466+
<> help "Log format documented in trace.haskell.d.ts. OUTPUT can be `CBOR` or `JSON`."
467+
)
468+
469+
data OutputFormat
470+
= JSON
471+
| CBOR
472+
deriving (Eq, Read, Show)
456473

457474
data ConfigOptions
458475
= LeiosConfigFile FilePath

simulation/src/Sample.hs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Data.Aeson.Encoding
99
import qualified Data.ByteString.Lazy as BSL
1010
import Data.List (foldl')
1111
import GHC.Generics
12-
import System.IO (IOMode (WriteMode), hFlush, stdout, withFile)
12+
import System.IO (Handle, IOMode (WriteMode), hFlush, stdout, withFile)
1313
import TimeCompat
1414
import VizSim
1515

@@ -31,12 +31,12 @@ runSampleModel ::
3131
[(Time, event)] ->
3232
IO ()
3333
runSampleModel traceFile logEvent =
34-
runSampleModel' (Just traceFile) (\t -> fmap (toEncoding . SampleEvent t) . logEvent)
34+
runSampleModel' (Just traceFile) (jsonlLog (\t -> fmap (toEncoding . SampleEvent t) . logEvent))
3535

3636
runSampleModel' ::
3737
forall event state.
3838
Maybe FilePath ->
39-
(DiffTime -> event -> Maybe Encoding) ->
39+
(Handle -> DiffTime -> event -> IO ()) ->
4040
SampleModel event state ->
4141
Time ->
4242
[(Time, event)] ->
@@ -63,9 +63,17 @@ runSampleModel' traceFile logEvent (SampleModel s0 accum render) stop =
6363
render st'
6464
writeEvents _h (SimVizModel [] st) = return st
6565
writeEvents h (SimVizModel ((t'@(Time t), e) : es) st) = do
66-
case logEvent t e of
67-
Nothing -> return ()
68-
Just x -> do
69-
BSL.hPutStr h (encodingToLazyByteString x)
70-
BSL.hPutStr h "\n"
66+
logEvent h t e
7167
writeEvents h (SimVizModel es (accum t' e st))
68+
69+
jsonlLog :: (t1 -> t2 -> Maybe (Encoding' a)) -> Handle -> t1 -> t2 -> IO ()
70+
jsonlLog logEvent h t e = case logEvent t e of
71+
Nothing -> return ()
72+
Just x -> do
73+
BSL.hPutStr h (encodingToLazyByteString x)
74+
BSL.hPutStr h "\n"
75+
76+
binaryLog :: (t1 -> t2 -> Maybe BSL.ByteString) -> Handle -> t1 -> t2 -> IO ()
77+
binaryLog logEvent h t e = case logEvent t e of
78+
Nothing -> return ()
79+
Just x -> BSL.hPutStr h x

0 commit comments

Comments
 (0)