diff --git a/bench/locli/locli.cabal b/bench/locli/locli.cabal index 5cd50392a00..09c16e1eafe 100644 --- a/bench/locli/locli.cabal +++ b/bench/locli/locli.cabal @@ -25,6 +25,7 @@ library Cardano.Analysis.ChainFilter Cardano.Analysis.Driver Cardano.Analysis.MachTimeline + Cardano.Analysis.Version Cardano.Unlog.Commands Cardano.Unlog.LogObject diff --git a/bench/locli/src/Cardano/Analysis/API.hs b/bench/locli/src/Cardano/Analysis/API.hs index 3a3e334c59f..182240377b9 100644 --- a/bench/locli/src/Cardano/Analysis/API.hs +++ b/bench/locli/src/Cardano/Analysis/API.hs @@ -23,6 +23,7 @@ import Ouroboros.Network.Block (BlockNo(..)) import Cardano.Analysis.ChainFilter import Cardano.Analysis.Profile +import Cardano.Analysis.Version import Cardano.Logging.Resources.Types import Cardano.Unlog.LogObject hiding (Text) import Cardano.Unlog.Render @@ -36,7 +37,8 @@ import Data.Distribution -- | Results of block propagation analysis. data BlockPropagation = BlockPropagation - { bpSlotRange :: !(SlotNo, SlotNo) -- ^ Analysis range, inclusive. + { bpVersion :: !Version + , bpSlotRange :: !(SlotNo, SlotNo) -- ^ Analysis range, inclusive. , bpForgerForges :: !(Distribution Float NominalDiffTime) , bpForgerAdoptions :: !(Distribution Float NominalDiffTime) , bpForgerAnnouncements :: !(Distribution Float NominalDiffTime) @@ -143,7 +145,8 @@ data DataDomain -- | The top-level representation of the machine timeline analysis results. data MachTimeline = MachTimeline - { sSlotRange :: (SlotNo, SlotNo) -- ^ Analysis range, inclusive. + { sVersion :: !Version + , sSlotRange :: (SlotNo, SlotNo) -- ^ Analysis range, inclusive. , sMaxChecks :: !Word64 , sSlotMisses :: ![Word64] , sSpanLensCPU85 :: ![Int] diff --git a/bench/locli/src/Cardano/Analysis/BlockProp.hs b/bench/locli/src/Cardano/Analysis/BlockProp.hs index 949aadd72a0..372331a616d 100644 --- a/bench/locli/src/Cardano/Analysis/BlockProp.hs +++ b/bench/locli/src/Cardano/Analysis/BlockProp.hs @@ -52,6 +52,7 @@ import Data.Distribution import Cardano.Analysis.API import Cardano.Analysis.ChainFilter import Cardano.Analysis.Profile +import Cardano.Analysis.Version import Cardano.Unlog.LogObject hiding (Text) import Cardano.Unlog.Render import Cardano.Unlog.Resources @@ -281,6 +282,7 @@ doBlockProp p cFilters eventMaps = do | p@(Perc p') <- adoptionPcts <> [Perc 1.0] ] , bpSizes = forgerEventsCDF (Just . bfBlockSize . beForge) , bpChainBlockEvents = chain + , bpVersion = getVersion } where chain, chainV :: [BlockEvents] diff --git a/bench/locli/src/Cardano/Analysis/Driver.hs b/bench/locli/src/Cardano/Analysis/Driver.hs index dcc799b407e..fe38f213522 100644 --- a/bench/locli/src/Cardano/Analysis/Driver.hs +++ b/bench/locli/src/Cardano/Analysis/Driver.hs @@ -12,7 +12,8 @@ module Cardano.Analysis.Driver , runAnalysisCommand ) where -import Prelude (String, error) +import Prelude (String) +import Prelude qualified as P (error, head) import Cardano.Prelude import Control.Arrow ((&&&)) @@ -36,6 +37,7 @@ import Cardano.Analysis.BlockProp import Cardano.Analysis.ChainFilter import Cardano.Analysis.MachTimeline import Cardano.Analysis.Profile +import Cardano.Analysis.Version import Cardano.Unlog.Commands import Cardano.Unlog.LogObject hiding (Text) import Cardano.Unlog.Render @@ -72,11 +74,27 @@ renderAnalysisCmdError cmd err = , mconcat (renderer cmdErr) ] +-- | This estimates the run identifier, given the expected path structure. +logfileRunIdentifier :: Text -> Text +logfileRunIdentifier fp = + case drop (length xs - 3) xs of + rundir:_ -> rundir + _ -> fp + where + xs = T.split (== '/') fp + +textId :: FilePath -> Text +textId inputfp = mconcat + [ "input: ", logfileRunIdentifier (T.pack inputfp), " " + , "locli: ", gitRev getVersion + ] + -- -- Analysis command dispatch -- runAnalysisCommand :: AnalysisCommand -> ExceptT AnalysisCmdError IO () runAnalysisCommand (MachineTimelineCmd genesisFile metaFile mChFiltersFile logfiles oFiles) = do + progress "run" (Q . T.unpack . logfileRunIdentifier . T.pack . unJsonLogfile $ P.head logfiles) progress "genesis" (Q $ unJsonGenesisFile genesisFile) progress "meta" (Q $ unJsonRunMetafile metaFile) chainInfo <- @@ -99,6 +117,7 @@ runAnalysisCommand (MachineTimelineCmd genesisFile metaFile mChFiltersFile logfi firstExceptT AnalysisCmdError $ runMachineTimeline chainInfo logfiles chFilters oFiles runAnalysisCommand (BlockPropagationCmd genesisFile metaFile mChFiltersFile logfiles oFiles) = do + progress "run" (Q . T.unpack . logfileRunIdentifier . T.pack . unJsonLogfile $ P.head logfiles) progress "genesis" (Q $ unJsonGenesisFile genesisFile) progress "meta" (Q $ unJsonRunMetafile metaFile) chainInfo <- @@ -156,7 +175,7 @@ runBlockPropagation cInfo chConds logfiles BlockPropagationOutputFiles{..} = do \(TextOutputFile f) -> withFile f WriteMode $ \hnd -> do progress "pretty-timeline" (Q f) - hPutStrLn hnd . T.pack $ printf "--- input: %s" f + hPutStrLn hnd $ textId f mapM_ (T.hPutStrLn hnd) (renderDistributions (cProfile cInfo) RenderPretty blockPropagation) mapM_ (T.hPutStrLn hnd) @@ -271,8 +290,7 @@ runMachineTimeline chainInfo logfiles chFilters MachineTimelineOutputFiles{..} = renderPrettyMachTimeline xs s (TextOutputFile f) = withFile f WriteMode $ \hnd -> do progress "pretty-timeline" (Q f) - hPutStrLn hnd . T.pack $ - printf "--- input: %s" f + hPutStrLn hnd $ textId f mapM_ (T.hPutStrLn hnd) (renderDistributions p RenderPretty s) mapM_ (T.hPutStrLn hnd) @@ -290,7 +308,7 @@ runMachineTimeline chainInfo logfiles chFilters MachineTimelineOutputFiles{..} = renderRunScalars rs renderExportTimeline :: [SlotStats] -> CsvOutputFile -> IO () renderExportTimeline _xs (CsvOutputFile _o) = - error "Timeline export is not supported." + P.error "Timeline export is not supported." -- withFile o WriteMode $ -- mapM_ (T.hPutStrLn hnd) (renderTimeline xs) diff --git a/bench/locli/src/Cardano/Analysis/MachTimeline.hs b/bench/locli/src/Cardano/Analysis/MachTimeline.hs index 2379ce9d991..3f579f39f9e 100644 --- a/bench/locli/src/Cardano/Analysis/MachTimeline.hs +++ b/bench/locli/src/Cardano/Analysis/MachTimeline.hs @@ -27,6 +27,7 @@ import Data.Distribution import Cardano.Analysis.API import Cardano.Analysis.Profile +import Cardano.Analysis.Version import Cardano.Unlog.LogObject hiding (Text) import Cardano.Unlog.Render import Cardano.Unlog.Resources @@ -85,6 +86,7 @@ slotStatsMachTimeline CInfo{} slots = computeResDistrib stdPercentiles resDistProjs slots , sSpanLensCPU85EBndDistrib = computeDistribution stdPercentiles sSpanLensCPU85EBnd , sSpanLensCPU85RwdDistrib = computeDistribution stdPercentiles sSpanLensCPU85Rwd + , sVersion = getVersion } where sSpanLensCPU85EBnd = Vec.length <$> diff --git a/bench/locli/src/Cardano/Analysis/Version.hs b/bench/locli/src/Cardano/Analysis/Version.hs new file mode 100644 index 00000000000..25b7705deec --- /dev/null +++ b/bench/locli/src/Cardano/Analysis/Version.hs @@ -0,0 +1,28 @@ +{-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE ImportQualifiedPost #-} +module Cardano.Analysis.Version + (Version (..), getVersion) +where + +import Data.Aeson (ToJSON(..), FromJSON(..)) +import Data.Text (Text, pack) +import Data.Version (showVersion) +import GHC.Generics (Generic) +import Paths_locli (version) +import Prelude (Show) +import Cardano.Config.Git.Rev qualified (gitRev) + + +data Version = + Version + { gitRev :: Text + , version :: Text + } + deriving (Generic, FromJSON, Show, ToJSON) + +getVersion :: Version +getVersion = + Version + Cardano.Config.Git.Rev.gitRev + (pack (showVersion Paths_locli.version)) diff --git a/bench/locli/src/Cardano/Unlog/Parsers.hs b/bench/locli/src/Cardano/Unlog/Parsers.hs index d67bd6a9892..1811eb1fbfb 100644 --- a/bench/locli/src/Cardano/Unlog/Parsers.hs +++ b/bench/locli/src/Cardano/Unlog/Parsers.hs @@ -33,7 +33,6 @@ parseCommand :: Parser Command parseCommand = asum [ parseAnalysis - , parseDisplayVersion ] parseAnalysis :: Parser Command @@ -47,21 +46,3 @@ parseAnalysis = "Log analysis" parseAnalysisCommands ] - -parseDisplayVersion :: Parser Command -parseDisplayVersion = - subparser - (mconcat - [ commandGroup "Miscellaneous commands" - , metavar "Miscellaneous commands" - , command' - "version" - "Show the locli version" - (pure DisplayVersion) - ] - ) - <|> flag' DisplayVersion - ( long "version" - <> help "Show the locli version" - <> hidden - ) diff --git a/bench/locli/src/Cardano/Unlog/Run.hs b/bench/locli/src/Cardano/Unlog/Run.hs index 12fdb660987..00788c078b8 100644 --- a/bench/locli/src/Cardano/Unlog/Run.hs +++ b/bench/locli/src/Cardano/Unlog/Run.hs @@ -5,28 +5,28 @@ module Cardano.Unlog.Run , CommandErrors , renderCommandError , runCommand + -- * Re-exports + , gitRev + , ) where import Cardano.Prelude import Control.Monad.Trans.Except.Extra (firstExceptT) -import Data.Text qualified as Text +import Data.Aeson qualified as AE +import Data.ByteString.Lazy.Char8 qualified as LBS import Cardano.Analysis.Driver (AnalysisCmdError, renderAnalysisCmdError, runAnalysisCommand) import Cardano.Unlog.Commands (AnalysisCommand) -import Cardano.Config.Git.Rev (gitRev) -import Data.Version (showVersion) -import Paths_locli (version) +import Cardano.Analysis.Version -- | Sub-commands of 'locli'. data Command = -- | Analysis commands AnalysisCommand AnalysisCommand - - | DisplayVersion deriving Show data CommandErrors @@ -34,18 +34,10 @@ data CommandErrors deriving Show runCommand :: Command -> ExceptT CommandErrors IO () -runCommand (AnalysisCommand c) = firstExceptT (AnalysisError c) $ runAnalysisCommand c -runCommand DisplayVersion = runDisplayVersion +runCommand (AnalysisCommand c) = do + liftIO $ LBS.putStrLn $ AE.encode getVersion + firstExceptT (AnalysisError c) $ runAnalysisCommand c renderCommandError :: CommandErrors -> Text renderCommandError (AnalysisError cmd err) = renderAnalysisCmdError cmd err - -runDisplayVersion :: ExceptT CommandErrors IO () -runDisplayVersion = do - liftIO . putTextLn $ mconcat - [ "locli ", renderVersion version - , ", git rev ", gitRev - ] - where - renderVersion = Text.pack . showVersion diff --git a/nix/workbench/lib-cabal.sh b/nix/workbench/lib-cabal.sh index bbdd04ce874..833edb91065 100644 --- a/nix/workbench/lib-cabal.sh +++ b/nix/workbench/lib-cabal.sh @@ -31,11 +31,15 @@ function cardano-topology() { } function locli() { - cabal -v0 run exe:locli -- "$@" + cabal -v0 build exe:locli + set-git-rev \ + $(git rev-parse HEAD) \ + $(find ./dist-newstyle/build/ -type f -name locli) + cabal -v0 exec locli -- "$@" } function tx-generator() { - cabal -v0 run exe:tx-generator -- "$@" + cabal -v0 run exe:tx-generator -- "$@" } export WORKBENCH_CABAL_MODE=t diff --git a/shell.nix b/shell.nix index db9fcdfb76f..af1e745fa31 100644 --- a/shell.nix +++ b/shell.nix @@ -73,6 +73,7 @@ let cardano-ping cabalWrapped ghcid + haskellBuildUtils pkgs.graphviz weeder nixWrapped