From 4e78f003f6e786c5dc973719969764c6fe4da409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20W=C3=B3jtowicz?= Date: Tue, 26 Nov 2024 18:03:57 +0100 Subject: [PATCH 01/21] Use cardano-ledger-conway 1.17.3 --- cabal.project | 2 +- cardano-node/cardano-node.cabal | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cabal.project b/cabal.project index bef93a67ebc..1a927bf6eaf 100644 --- a/cabal.project +++ b/cabal.project @@ -14,7 +14,7 @@ repository cardano-haskell-packages -- you need to run if you change them index-state: , hackage.haskell.org 2024-10-10T00:52:24Z - , cardano-haskell-packages 2024-10-30T10:23:17Z + , cardano-haskell-packages 2024-11-26T16:00:26Z packages: cardano-node diff --git a/cardano-node/cardano-node.cabal b/cardano-node/cardano-node.cabal index c2f8e5c5873..a9dbdd7f127 100644 --- a/cardano-node/cardano-node.cabal +++ b/cardano-node/cardano-node.cabal @@ -1,7 +1,7 @@ cabal-version: 3.0 name: cardano-node -version: 10.1.2 +version: 10.1.3 synopsis: The cardano full node description: The cardano full node. category: Cardano, @@ -156,7 +156,7 @@ library , cardano-ledger-binary , cardano-ledger-byron -- TODO: remove constraint at next ledger bump - , cardano-ledger-conway ^>= 1.17.2 + , cardano-ledger-conway ^>= 1.17.3 , cardano-ledger-core , cardano-ledger-shelley , cardano-prelude From de3c809ec06a81e784c828833151663bb555dc5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20W=C3=B3jtowicz?= Date: Tue, 26 Nov 2024 19:28:30 +0100 Subject: [PATCH 02/21] cardanoProtocolVersion and CHaP bump --- cardano-node/src/Cardano/Node/Protocol/Cardano.hs | 2 +- flake.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cardano-node/src/Cardano/Node/Protocol/Cardano.hs b/cardano-node/src/Cardano/Node/Protocol/Cardano.hs index caa24132d04..051c241c847 100644 --- a/cardano-node/src/Cardano/Node/Protocol/Cardano.hs +++ b/cardano-node/src/Cardano/Node/Protocol/Cardano.hs @@ -171,7 +171,7 @@ mkSomeConsensusProtocolCardano NodeByronProtocolConfiguration { shelleyGenesisHash, shelleyBasedLeaderCredentials = shelleyLeaderCredentials } - , Consensus.cardanoProtocolVersion = ProtVer (natVersion @10) 0 + , Consensus.cardanoProtocolVersion = ProtVer (natVersion @10) 1 -- The remaining arguments specify the parameters needed to transition between two eras , Consensus.cardanoLedgerTransitionConfig = Ledger.mkLatestTransitionConfig diff --git a/flake.lock b/flake.lock index 82e94186fda..302c445df84 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "CHaP": { "flake": false, "locked": { - "lastModified": 1730295876, - "narHash": "sha256-ijnHTQ6eKIQ9FpEqDKt6c7vuFYN8aOBDhonp67utx2s=", + "lastModified": 1732639071, + "narHash": "sha256-XY+LlzuumeRovfBMXIPS90Trk7HTxpUMFFdL4bmMZDU=", "owner": "intersectmbo", "repo": "cardano-haskell-packages", - "rev": "25591f43ab943d5a070db5e8a2b9ff3a499d4d92", + "rev": "6df7fca74cc3a34babfa7ce7cb4b7a8c72c70982", "type": "github" }, "original": { From 3bc5842e2a7d44ec62a19ff511fb36bcbd50f2c6 Mon Sep 17 00:00:00 2001 From: Neil Mayhew Date: Thu, 2 Jan 2025 16:15:22 -0700 Subject: [PATCH 03/21] Bump CHaP --- cabal.project | 2 +- flake.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cabal.project b/cabal.project index 1a927bf6eaf..2ab8caf4794 100644 --- a/cabal.project +++ b/cabal.project @@ -14,7 +14,7 @@ repository cardano-haskell-packages -- you need to run if you change them index-state: , hackage.haskell.org 2024-10-10T00:52:24Z - , cardano-haskell-packages 2024-11-26T16:00:26Z + , cardano-haskell-packages 2025-01-02T21:54:55Z packages: cardano-node diff --git a/flake.lock b/flake.lock index 302c445df84..03529c16a9d 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "CHaP": { "flake": false, "locked": { - "lastModified": 1732639071, - "narHash": "sha256-XY+LlzuumeRovfBMXIPS90Trk7HTxpUMFFdL4bmMZDU=", + "lastModified": 1735857786, + "narHash": "sha256-X6Fp2uU++62rgaH4J1pIN5AalfV7f9rM5dmFaByMWqU=", "owner": "intersectmbo", "repo": "cardano-haskell-packages", - "rev": "6df7fca74cc3a34babfa7ce7cb4b7a8c72c70982", + "rev": "b9eaf0bbe60ccf64b7afc969b79f9820a4534bcf", "type": "github" }, "original": { From 3cde9b9e080c038c8777388f8e0bf6f3ac7adc45 Mon Sep 17 00:00:00 2001 From: Neil Mayhew Date: Thu, 2 Jan 2025 16:59:03 -0700 Subject: [PATCH 04/21] Use cardano-ledger-conway 1.17.4 --- cardano-node/cardano-node.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cardano-node/cardano-node.cabal b/cardano-node/cardano-node.cabal index a9dbdd7f127..e63dcb2a704 100644 --- a/cardano-node/cardano-node.cabal +++ b/cardano-node/cardano-node.cabal @@ -156,7 +156,7 @@ library , cardano-ledger-binary , cardano-ledger-byron -- TODO: remove constraint at next ledger bump - , cardano-ledger-conway ^>= 1.17.3 + , cardano-ledger-conway ^>= 1.17.4 , cardano-ledger-core , cardano-ledger-shelley , cardano-prelude From d330c6883f8591f01efb5409e0a3e9c0428a4762 Mon Sep 17 00:00:00 2001 From: Neil Mayhew Date: Thu, 2 Jan 2025 17:02:58 -0700 Subject: [PATCH 05/21] Increase cardano-node version to 10.1.4 --- cardano-node/cardano-node.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cardano-node/cardano-node.cabal b/cardano-node/cardano-node.cabal index e63dcb2a704..de9617d7365 100644 --- a/cardano-node/cardano-node.cabal +++ b/cardano-node/cardano-node.cabal @@ -1,7 +1,7 @@ cabal-version: 3.0 name: cardano-node -version: 10.1.3 +version: 10.1.4 synopsis: The cardano full node description: The cardano full node. category: Cardano, From b1637f453613fd4b72dab450a8cff79943837421 Mon Sep 17 00:00:00 2001 From: Neil Mayhew Date: Mon, 6 Jan 2025 12:33:39 -0700 Subject: [PATCH 06/21] Increase protocol minor version This enables tracking of peers that have upgraded, but makes no other difference --- cardano-node/src/Cardano/Node/Protocol/Cardano.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cardano-node/src/Cardano/Node/Protocol/Cardano.hs b/cardano-node/src/Cardano/Node/Protocol/Cardano.hs index 051c241c847..84f312ea522 100644 --- a/cardano-node/src/Cardano/Node/Protocol/Cardano.hs +++ b/cardano-node/src/Cardano/Node/Protocol/Cardano.hs @@ -171,7 +171,7 @@ mkSomeConsensusProtocolCardano NodeByronProtocolConfiguration { shelleyGenesisHash, shelleyBasedLeaderCredentials = shelleyLeaderCredentials } - , Consensus.cardanoProtocolVersion = ProtVer (natVersion @10) 1 + , Consensus.cardanoProtocolVersion = ProtVer (natVersion @10) 2 -- The remaining arguments specify the parameters needed to transition between two eras , Consensus.cardanoLedgerTransitionConfig = Ledger.mkLatestTransitionConfig From f7af271b2b3c86bae74ed572205a45a89f586e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Thu, 9 Jan 2025 17:24:11 +0100 Subject: [PATCH 07/21] cardano-node: Started LedgerQuery tracer replaces StartLeadershipPlus --- cardano-node/cardano-node.cabal | 2 +- .../src/Cardano/Node/Tracing/Consistency.hs | 8 +- .../src/Cardano/Node/Tracing/Documentation.hs | 14 +- .../src/Cardano/Node/Tracing/Tracers.hs | 21 +-- .../Cardano/Node/Tracing/Tracers/ChainDB.hs | 1 + .../Cardano/Node/Tracing/Tracers/Consensus.hs | 100 +------------ .../Tracing/Tracers/ForgingThreadStats.hs | 28 ++-- .../Node/Tracing/Tracers/LedgerQuery.hs | 85 +++++++++++ .../Tracing/Tracers/StartLeadershipCheck.hs | 136 ------------------ 9 files changed, 122 insertions(+), 273 deletions(-) create mode 100644 cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerQuery.hs delete mode 100644 cardano-node/src/Cardano/Node/Tracing/Tracers/StartLeadershipCheck.hs diff --git a/cardano-node/cardano-node.cabal b/cardano-node/cardano-node.cabal index de9617d7365..d5ade5d6b5d 100644 --- a/cardano-node/cardano-node.cabal +++ b/cardano-node/cardano-node.cabal @@ -111,6 +111,7 @@ library Cardano.Node.Tracing.Tracers.Diffusion Cardano.Node.Tracing.Tracers.ForgingThreadStats Cardano.Node.Tracing.Tracers.KESInfo + Cardano.Node.Tracing.Tracers.LedgerQuery Cardano.Node.Tracing.Tracers.NodeToClient Cardano.Node.Tracing.Tracers.NodeToNode Cardano.Node.Tracing.Tracers.NodeVersion @@ -119,7 +120,6 @@ library Cardano.Node.Tracing.Tracers.Peer Cardano.Node.Tracing.Tracers.Resources Cardano.Node.Tracing.Tracers.Shutdown - Cardano.Node.Tracing.Tracers.StartLeadershipCheck Cardano.Node.Tracing.Tracers.Startup Cardano.Node.Types Cardano.Tracing.Config diff --git a/cardano-node/src/Cardano/Node/Tracing/Consistency.hs b/cardano-node/src/Cardano/Node/Tracing/Consistency.hs index a2e4aa6bb35..74cd1635475 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Consistency.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Consistency.hs @@ -22,13 +22,11 @@ import Cardano.Node.Tracing.Documentation (docTracersFirstPhase) import Cardano.Node.Tracing.Formatting () import qualified Cardano.Node.Tracing.StateRep as SR import Cardano.Node.Tracing.Tracers.BlockReplayProgress -import Cardano.Node.Tracing.Tracers.Consensus import Cardano.Node.Tracing.Tracers.Diffusion () import Cardano.Node.Tracing.Tracers.KESInfo () import Cardano.Node.Tracing.Tracers.NodeToClient () import Cardano.Node.Tracing.Tracers.NodeToNode () import Cardano.Node.Tracing.Tracers.NodeVersion (NodeVersionTrace) - import Cardano.Node.Tracing.Tracers.NonP2P () import Cardano.Node.Tracing.Tracers.P2P () import Cardano.Node.Tracing.Tracers.Peer @@ -179,8 +177,8 @@ getAllNamespaces = (TraceLocalTxSubmissionServerEvent blk)]) mempoolNS = map (nsGetTuple . nsReplacePrefix ["Mempool"]) (allNamespaces :: [Namespace (TraceEventMempool blk)]) - forgeNS = map (nsGetTuple . nsReplacePrefix ["Forge", "Loop"]) - (allNamespaces :: [Namespace (ForgeTracerType blk)]) + -- forgeNS = map (nsGetTuple . nsReplacePrefix ["Forge", "Loop"]) + -- (allNamespaces :: [Namespace (ForgeTracerType blk)]) TODO YUP blockchainTimeNS = map (nsGetTuple . nsReplacePrefix ["BlockchainTime"]) (allNamespaces :: [Namespace (TraceBlockchainTimeEvent RelativeTime)]) @@ -388,7 +386,7 @@ getAllNamespaces = <> txOutboundNS <> localTxSubmissionServerNS <> mempoolNS - <> forgeNS +-- <> forgeNS TODO YUP <> blockchainTimeNS -- NodeToClient <> keepAliveClientNS diff --git a/cardano-node/src/Cardano/Node/Tracing/Documentation.hs b/cardano-node/src/Cardano/Node/Tracing/Documentation.hs index e217afba03d..b97210604ad 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Documentation.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Documentation.hs @@ -355,12 +355,12 @@ docTracersFirstPhase condConfigFileName = do mempoolTrDoc <- documentTracer (mempoolTr :: Trace IO (TraceEventMempool blk)) - forgeTr <- mkCardanoTracer - trBase trForward mbTrEKG - ["Forge", "Loop"] - configureTracers configReflection trConfig [forgeTr] - forgeTrDoc <- documentTracer (forgeTr :: - Trace IO (ForgeTracerType blk)) + -- forgeTr <- mkCardanoTracer + -- trBase trForward mbTrEKG + -- ["Forge", "Loop"] + -- configureTracers configReflection trConfig [forgeTr] + -- -- forgeTrDoc <- documentTracer (forgeTr :: + -- -- Trace IO (ForgeTracerType blk)) TODO YUP forgeTr' <- mkCardanoTracer @@ -718,7 +718,7 @@ docTracersFirstPhase condConfigFileName = do <> txOutboundTrDoc <> localTxSubmissionServerTrDoc <> mempoolTrDoc - <> forgeTrDoc +-- <> forgeTrDoc TODO YUP <> forgeThreadStatsTrDoc <> blockchainTimeTrDoc -- NodeToClient diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers.hs index b105e66bc08..aca63b7b176 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers.hs @@ -217,7 +217,7 @@ mkConsensusTracers :: forall blk. -> TraceConfig -> NodeKernelData blk -> IO (Consensus.Tracers IO (ConnectionId RemoteAddress) (ConnectionId LocalAddress) blk) -mkConsensusTracers configReflection trBase trForward mbTrEKG _trDataPoint trConfig nodeKernel = do +mkConsensusTracers configReflection trBase trForward mbTrEKG _trDataPoint trConfig _nodeKernel = do !chainSyncClientTr <- mkCardanoTracer trBase trForward mbTrEKG ["ChainSync", "Client"] @@ -301,11 +301,11 @@ mkConsensusTracers configReflection trBase trForward mbTrEKG _trDataPoint trConf ["Mempool"] configureTracers configReflection trConfig [mempoolTr] - !forgeTr <- mkCardanoTracer' - trBase trForward mbTrEKG - ["Forge", "Loop"] - (forgeTracerTransform nodeKernel) - configureTracers configReflection trConfig [forgeTr] + -- !forgeTr <- mkCardanoTracer' + -- trBase trForward mbTrEKG + -- ["Forge", "Loop"] + -- (forgeTracerTransform nodeKernel) + -- configureTracers configReflection trConfig [forgeTr] TODO YUP !forgeThreadStatsTr <- mkCardanoTracer' trBase trForward mbTrEKG @@ -362,10 +362,11 @@ mkConsensusTracers configReflection trBase trForward mbTrEKG _trDataPoint trConf traceWith localTxSubmissionServerTr , Consensus.mempoolTracer = Tracer $ traceWith mempoolTr - , Consensus.forgeTracer = - Tracer (\(Consensus.TraceLabelCreds _ x) -> traceWith (contramap Left forgeTr) x) - <> - Tracer (\(Consensus.TraceLabelCreds _ x) -> traceWith (contramap Left forgeThreadStatsTr) x) + , Consensus.forgeTracer = mempty + -- , Consensus.forgeTracer = + -- Tracer (\(Consensus.TraceLabelCreds _ x) -> traceWith forgeTr x) //TODO YUP + -- <> + -- Tracer (\(Consensus.TraceLabelCreds _ x) -> traceWith forgeThreadStatsTr x) , Consensus.blockchainTimeTracer = Tracer $ traceWith blockchainTimeTr , Consensus.keepAliveClientTracer = Tracer $ diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/ChainDB.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/ChainDB.hs index a0ecf536704..985da853e1c 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/ChainDB.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/ChainDB.hs @@ -11,6 +11,7 @@ module Cardano.Node.Tracing.Tracers.ChainDB ( withAddedToCurrentChainEmptyLimited + , fragmentChainDensity ) where import Cardano.Logging diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs index 0ec5a5db4bc..512ced72392 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs @@ -14,10 +14,7 @@ module Cardano.Node.Tracing.Tracers.Consensus ( - TraceStartLeadershipCheckPlus (..) - , ForgeTracerType - , forgeTracerTransform - , initialClientMetrics + initialClientMetrics , calculateBlockFetchClientMetrics , ClientMetrics ) where @@ -30,7 +27,6 @@ import Cardano.Node.Tracing.Era.Shelley () import Cardano.Node.Tracing.Formatting () import Cardano.Node.Tracing.Render import Cardano.Node.Tracing.Tracers.ConsensusStartupException () -import Cardano.Node.Tracing.Tracers.StartLeadershipCheck import Cardano.Protocol.TPraos.OCert (KESPeriod (..)) import Cardano.Slotting.Slot (WithOrigin (..)) import Ouroboros.Consensus.Block @@ -1308,100 +1304,6 @@ instance MetaTrace (TraceEventMempool blk) where , Namespace [] ["ManuallyRemovedTxs"] ] --------------------------------------------------------------------------------- --- ForgeTracerType --------------------------------------------------------------------------------- - -instance ( tx ~ GenTx blk - , ConvertRawHash blk - , GetHeader blk - , HasHeader blk - , HasKESInfo blk - , LedgerSupportsProtocol blk - , LedgerSupportsMempool blk - , SerialiseNodeToNodeConstraints blk - , HasTxId (GenTx blk) - , Show (ForgeStateUpdateError blk) - , Show (CannotForge blk) - , LogFormatting (InvalidBlockReason blk) - , LogFormatting (CannotForge blk) - , LogFormatting (ForgeStateUpdateError blk)) - => LogFormatting (ForgeTracerType blk) where - forMachine dtal (Left i) = forMachine dtal i - forMachine dtal (Right i) = forMachine dtal i - forHuman (Left i) = forHumanOrMachine i - forHuman (Right i) = forHumanOrMachine i - asMetrics (Left i) = asMetrics i - asMetrics (Right i) = asMetrics i - -instance MetaTrace (ForgeTracerType blk) where - namespaceFor (Left ev) = - nsCast (namespaceFor ev) - namespaceFor (Right _ev) = - Namespace [] ["StartLeadershipCheckPlus"] - - severityFor (Namespace _ ["StartLeadershipCheckPlus"]) _ = Just - Info - severityFor ns (Just (Left ev')) = - severityFor (nsCast ns) (Just ev') - severityFor ns Nothing = - severityFor (nsCast ns :: Namespace (TraceForgeEvent blk)) Nothing - severityFor _ _ = Nothing - - detailsFor (Namespace _ ["StartLeadershipCheckPlus"]) _ = Just - DNormal - detailsFor ns (Just (Left ev')) = - detailsFor (nsCast ns) (Just ev') - detailsFor ns Nothing = - detailsFor (nsCast ns :: Namespace (TraceForgeEvent blk)) Nothing - detailsFor _ _ = Nothing - - privacyFor (Namespace _ ["StartLeadershipCheckPlus"]) _ = Just - Public - privacyFor ns (Just (Left ev')) = - privacyFor (nsCast ns) (Just ev') - privacyFor ns Nothing = - privacyFor (nsCast ns :: Namespace (TraceForgeEvent blk)) Nothing - privacyFor _ _ = Nothing - - metricsDocFor (Namespace _ ["StartLeadershipCheckPlus"]) = - [ ("Forge.UtxoSize", "") - , ("Forge.DelegMapSize", "") - ] - metricsDocFor ns = - metricsDocFor (nsCast ns :: Namespace (TraceForgeEvent blk)) - - documentFor (Namespace _ ["StartLeadershipCheckPlus"]) = Just $ mconcat - [ "We adopted the block we produced, we also trace the transactions" - , " that were adopted." - ] - documentFor ns = - documentFor (nsCast ns :: Namespace (TraceForgeEvent blk)) - - allNamespaces = - Namespace [] ["StartLeadershipCheckPlus"] - : map nsCast (allNamespaces :: [Namespace (TraceForgeEvent blk)]) - --------------------------------------------------------------------------------- --- TraceStartLeadershipCheck --------------------------------------------------------------------------------- - -instance LogFormatting TraceStartLeadershipCheckPlus where - forMachine _dtal TraceStartLeadershipCheckPlus {..} = - mconcat [ "kind" .= String "TraceStartLeadershipCheck" - , "slot" .= toJSON (unSlotNo tsSlotNo) - , "utxoSize" .= Number (fromIntegral tsUtxoSize) - , "delegMapSize" .= Number (fromIntegral tsDelegMapSize) - , "chainDensity" .= Number (fromRational (toRational tsChainDensity)) - ] - forHuman TraceStartLeadershipCheckPlus {..} = - "Checking for leadership in slot " <> showT (unSlotNo tsSlotNo) - <> " utxoSize " <> showT tsUtxoSize - <> " delegMapSize " <> showT tsDelegMapSize - <> " chainDensity " <> showT tsChainDensity - asMetrics TraceStartLeadershipCheckPlus {..} = - [IntM "utxoSize" (fromIntegral tsUtxoSize), - IntM "delegMapSize" (fromIntegral tsDelegMapSize)] -------------------------------------------------------------------------------- diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/ForgingThreadStats.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/ForgingThreadStats.hs index 21841012203..62fb0e5f2de 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/ForgingThreadStats.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/ForgingThreadStats.hs @@ -10,7 +10,6 @@ module Cardano.Node.Tracing.Tracers.ForgingThreadStats ) where import Cardano.Logging -import Cardano.Node.Tracing.Tracers.StartLeadershipCheck (ForgeTracerType) import Cardano.Slotting.Slot (SlotNo (..)) import Ouroboros.Consensus.Node.Tracers import qualified Ouroboros.Consensus.Node.Tracers as Consensus @@ -155,31 +154,30 @@ emptyForgingStats :: ForgingStats emptyForgingStats = ForgingStats mempty 0 0 0 0 forgeThreadStats :: Trace IO ForgingStats - -> IO (Trace IO (ForgeTracerType blk)) + -> IO (Trace IO (TraceForgeEvent blk)) forgeThreadStats tr = - let tr' = contramap unfold tr - in foldCondTraceM calculateThreadStats emptyForgingStats - (\case - Left Consensus.TraceStartLeadershipCheck{} -> True - Left _ -> False - Right _ -> True - ) - tr' + let tr' = contramap unfold tr + in foldCondTraceM calculateThreadStats emptyForgingStats + (\case + Consensus.TraceStartLeadershipCheck{} -> True + _ -> False + ) + tr' calculateThreadStats :: MonadIO m => ForgingStats -> LoggingContext - -> ForgeTracerType blk + -> TraceForgeEvent blk -> m ForgingStats calculateThreadStats stats _context - (Left TraceNodeCannotForge {}) = do + (TraceNodeCannotForge {}) = do mapThreadStats stats (\fts -> (fts { ftsNodeCannotForgeNum = ftsNodeCannotForgeNum fts + 1} , Nothing)) (\fs _ -> (fs { fsNodeCannotForgeNum = fsNodeCannotForgeNum fs + 1 })) calculateThreadStats stats _context - (Left (TraceNodeIsLeader (SlotNo slot'))) = do + (TraceNodeIsLeader (SlotNo slot')) = do let slot = fromIntegral slot' mapThreadStats stats @@ -187,14 +185,14 @@ calculateThreadStats stats _context , ftsLastSlot = slot}, Nothing)) (\fs _ -> (fs { fsNodeIsLeaderNum = fsNodeIsLeaderNum fs + 1 })) calculateThreadStats stats _context - (Left TraceForgedBlock {}) = do + (TraceForgedBlock {}) = do mapThreadStats stats (\fts -> (fts { ftsBlocksForgedNum = ftsBlocksForgedNum fts + 1} , Nothing)) (\fs _ -> (fs { fsBlocksForgedNum = fsBlocksForgedNum fs + 1 })) calculateThreadStats stats _context - (Left (TraceNodeNotLeader (SlotNo slot'))) = do + (TraceNodeNotLeader (SlotNo slot')) = do let slot = fromIntegral slot' mapThreadStats stats diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerQuery.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerQuery.hs new file mode 100644 index 00000000000..5e1488edb62 --- /dev/null +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerQuery.hs @@ -0,0 +1,85 @@ +{-# LANGUAGE CPP #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE RecordWildCards #-} + +module Cardano.Node.Tracing.Tracers.LedgerQuery + ( TraceLedgerQuery (..) + , traceLedgerQuery + ) where + + +import Cardano.Ledger.BaseTypes (StrictMaybe (..)) +import Cardano.Logging +import Cardano.Node.Queries (LedgerQueries (..), NodeKernelData (..), mapNodeKernelDataIO, + nkQueryChain, nkQueryLedger) +import Cardano.Node.Tracing.Tracers.ChainDB (fragmentChainDensity) +import Ouroboros.Consensus.HardFork.Combinator +import Ouroboros.Consensus.Ledger.Abstract (IsLedger) +import Ouroboros.Consensus.Ledger.Extended (ledgerState) +import qualified Ouroboros.Network.AnchoredFragment as AF + +import Data.Aeson (Value (Number, String), (.=)) + + +data TraceLedgerQuery = + TraceLedgerQuery { + -- tsSlotNo :: SlotNo + tsUtxoSize :: Int + , tsDelegMapSize :: Int + , tsChainDensity :: Double + } + +traceLedgerQuery :: + ( IsLedger (LedgerState blk) + , LedgerQueries blk +#if __GLASGOW_HASKELL__ >= 906 + , AF.HasHeader blk +#endif + , AF.HasHeader (Header blk)) + => NodeKernelData blk + -> Trace IO TraceLedgerQuery + -> IO () +traceLedgerQuery nodeKern tracer = do + query <- mapNodeKernelDataIO + (\nk -> + (,,) + <$> nkQueryLedger (ledgerUtxoSize . ledgerState) nk + <*> nkQueryLedger (ledgerDelegMapSize . ledgerState) nk + <*> nkQueryChain fragmentChainDensity nk) + nodeKern + case query of + SNothing -> pure () + SJust (utxoSize, delegMapSize, chainDensity) -> + let msg = TraceLedgerQuery + utxoSize + delegMapSize + (fromRational chainDensity) + in traceWith tracer msg + +-------------------------------------------------------------------------------- +-- TraceStartLeadershipCheck +-------------------------------------------------------------------------------- + +instance LogFormatting TraceLedgerQuery where + forMachine _dtal TraceLedgerQuery {..} = + mconcat [ "kind" .= String "TraceLedgerQuery" + -- , "slot" .= toJSON (unSlotNo tsSlotNo) + , "utxoSize" .= Number (fromIntegral tsUtxoSize) + , "delegMapSize" .= Number (fromIntegral tsDelegMapSize) + , "chainDensity" .= Number (fromRational (toRational tsChainDensity)) + ] + forHuman TraceLedgerQuery {..} = + "Querying ledger " -- <> showT (unSlotNo tsSlotNo) + <> " utxoSize " <> showT tsUtxoSize + <> " delegMapSize " <> showT tsDelegMapSize + <> " chainDensity " <> showT tsChainDensity + asMetrics TraceLedgerQuery {..} = + [IntM "utxoSize" (fromIntegral tsUtxoSize), + IntM "delegMapSize" (fromIntegral tsDelegMapSize)] + + + + + diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/StartLeadershipCheck.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/StartLeadershipCheck.hs deleted file mode 100644 index b3d5bb810a9..00000000000 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/StartLeadershipCheck.hs +++ /dev/null @@ -1,136 +0,0 @@ -{-# LANGUAGE CPP #-} -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE NamedFieldPuns #-} - -module Cardano.Node.Tracing.Tracers.StartLeadershipCheck - ( TraceStartLeadershipCheckPlus (..) - , ForgeTracerType - , forgeTracerTransform - ) where - - -import Cardano.Logging - -import Control.Concurrent.STM (atomically) -import Data.IORef (readIORef) -import Data.Word (Word64) - -import qualified Ouroboros.Network.AnchoredFragment as AF -import Ouroboros.Network.Block (BlockNo (..), blockNo, unBlockNo) -import Ouroboros.Network.NodeToClient (LocalConnectionId) -import Ouroboros.Network.NodeToNode (RemoteAddress) - -import Ouroboros.Consensus.Block (SlotNo (..)) -import Ouroboros.Consensus.HardFork.Combinator -import Ouroboros.Consensus.Ledger.Abstract (IsLedger) -import Ouroboros.Consensus.Ledger.Extended (ExtLedgerState, ledgerState) -import Ouroboros.Consensus.Node (NodeKernel (..)) -import Ouroboros.Consensus.Node.Tracers -import qualified Ouroboros.Consensus.Storage.ChainDB as ChainDB - -import Cardano.Node.Queries (LedgerQueries (..), NodeKernelData (..)) -import Cardano.Slotting.Slot (fromWithOrigin) - -import Cardano.Ledger.BaseTypes (StrictMaybe (..)) - - -type ForgeTracerType blk = Either (TraceForgeEvent blk) - TraceStartLeadershipCheckPlus - -data TraceStartLeadershipCheckPlus = - TraceStartLeadershipCheckPlus { - tsSlotNo :: SlotNo - , tsUtxoSize :: Int - , tsDelegMapSize :: Int - , tsChainDensity :: Double - } - -forgeTracerTransform :: - ( IsLedger (LedgerState blk) - , LedgerQueries blk -#if __GLASGOW_HASKELL__ >= 906 - , AF.HasHeader blk -#endif - , AF.HasHeader (Header blk)) - => NodeKernelData blk - -> Trace IO (ForgeTracerType blk) - -> IO (Trace IO (ForgeTracerType blk)) -forgeTracerTransform nodeKern (Trace tr) = - contramapM (Trace tr) - (\case - (lc, Right (Left slc@(TraceStartLeadershipCheck slotNo))) -> do - query <- mapNodeKernelDataIO - (\nk -> - (,,) - <$> nkQueryLedger (ledgerUtxoSize . ledgerState) nk - <*> nkQueryLedger (ledgerDelegMapSize . ledgerState) nk - <*> nkQueryChain fragmentChainDensity nk) - nodeKern - case query of - SNothing -> pure (lc, Right (Left slc)) - SJust (utxoSize, delegMapSize, chainDensity) -> - let msg = TraceStartLeadershipCheckPlus - slotNo - utxoSize - delegMapSize - (fromRational chainDensity) - in pure (lc, Right (Right msg)) - (lc, Right a) -> - pure (lc, Right a) - (lc, Left control) -> - pure (lc, Left control)) - -nkQueryLedger :: - IsLedger (LedgerState blk) - => (ExtLedgerState blk -> a) - -> NodeKernel IO RemoteAddress LocalConnectionId blk - -> IO a -nkQueryLedger f NodeKernel{getChainDB} = - f <$> atomically (ChainDB.getCurrentLedger getChainDB) - -fragmentChainDensity :: -#if __GLASGOW_HASKELL__ >= 906 - (AF.HasHeader blk, AF.HasHeader (Header blk)) -#else - AF.HasHeader (Header blk) -#endif - => AF.AnchoredFragment (Header blk) -> Rational -fragmentChainDensity frag = calcDensity blockD slotD - where - calcDensity :: Word64 -> Word64 -> Rational - calcDensity bl sl - | sl > 0 = toRational bl / toRational sl - | otherwise = 0 - slotN = unSlotNo $ fromWithOrigin 0 (AF.headSlot frag) - -- Slot of the tip - slot @k@ blocks back. Use 0 as the slot for genesis - -- includes EBBs - slotD = slotN - - unSlotNo (fromWithOrigin 0 (AF.lastSlot frag)) - -- Block numbers start at 1. We ignore the genesis EBB, which has block number 0. - blockD = blockN - firstBlock - blockN = unBlockNo $ fromWithOrigin (BlockNo 1) (AF.headBlockNo frag) - firstBlock = case unBlockNo . blockNo <$> AF.last frag of - -- Empty fragment, no blocks. We have that @blocks = 1 - 1 = 0@ - Left _ -> 1 - -- The oldest block is the genesis EBB with block number 0, - -- don't let it contribute to the number of blocks - Right 0 -> 1 - Right b -> b - -nkQueryChain :: - (AF.AnchoredFragment (Header blk) -> a) - -> NodeKernel IO RemoteAddress LocalConnectionId blk - -> IO a -nkQueryChain f NodeKernel{getChainDB} = - f <$> atomically (ChainDB.getCurrentChain getChainDB) - - -mapNodeKernelDataIO :: - (NodeKernel IO RemoteAddress LocalConnectionId blk -> IO a) - -> NodeKernelData blk - -> IO (StrictMaybe a) -mapNodeKernelDataIO f (NodeKernelData ref) = - readIORef ref >>= traverse f From 9c5499b28499b4b81a10ba4c1d614db186b03b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Tue, 14 Jan 2025 14:16:06 +0100 Subject: [PATCH 08/21] cardano-node: ledger metrics tracer --- cardano-node/cardano-node.cabal | 2 +- cardano-node/src/Cardano/Node/Tracing.hs | 5 +- cardano-node/src/Cardano/Node/Tracing/API.hs | 6 ++ .../src/Cardano/Node/Tracing/Consistency.hs | 7 +- .../src/Cardano/Node/Tracing/Documentation.hs | 15 ++-- .../src/Cardano/Node/Tracing/Tracers.hs | 23 ++--- .../Cardano/Node/Tracing/Tracers/Consensus.hs | 2 +- .../{LedgerQuery.hs => LedgerMetrics.hs} | 84 ++++++++++++++----- cardano-node/src/Cardano/Tracing/Tracers.hs | 8 +- .../src/Cardano/Tracer/MetaTrace.hs | 1 + 10 files changed, 107 insertions(+), 46 deletions(-) rename cardano-node/src/Cardano/Node/Tracing/Tracers/{LedgerQuery.hs => LedgerMetrics.hs} (53%) diff --git a/cardano-node/cardano-node.cabal b/cardano-node/cardano-node.cabal index d5ade5d6b5d..5223c5d4a29 100644 --- a/cardano-node/cardano-node.cabal +++ b/cardano-node/cardano-node.cabal @@ -111,7 +111,7 @@ library Cardano.Node.Tracing.Tracers.Diffusion Cardano.Node.Tracing.Tracers.ForgingThreadStats Cardano.Node.Tracing.Tracers.KESInfo - Cardano.Node.Tracing.Tracers.LedgerQuery + Cardano.Node.Tracing.Tracers.LedgerMetrics Cardano.Node.Tracing.Tracers.NodeToClient Cardano.Node.Tracing.Tracers.NodeToNode Cardano.Node.Tracing.Tracers.NodeVersion diff --git a/cardano-node/src/Cardano/Node/Tracing.hs b/cardano-node/src/Cardano/Node/Tracing.hs index 027d988d086..fb3017a2024 100644 --- a/cardano-node/src/Cardano/Node/Tracing.hs +++ b/cardano-node/src/Cardano/Node/Tracing.hs @@ -15,9 +15,9 @@ import Cardano.Node.Startup (NodeInfo, NodeStartupInfo, StartupTrace ( import Cardano.Node.Tracing.StateRep (NodeState) import Cardano.Node.Tracing.Tracers.ConsensusStartupException (ConsensusStartupException (..)) -import Cardano.Node.Tracing.Tracers.Peer (PeerT) +import Cardano.Node.Tracing.Tracers.LedgerMetrics (LedgerMetrics) import Cardano.Node.Tracing.Tracers.NodeVersion (NodeVersionTrace) - +import Cardano.Node.Tracing.Tracers.Peer (PeerT) import qualified Ouroboros.Consensus.Network.NodeToClient as NodeToClient import qualified Ouroboros.Consensus.Network.NodeToNode as NodeToNode import qualified Ouroboros.Consensus.Node.Tracers as Consensus @@ -55,4 +55,5 @@ data Tracers peer localPeer blk p2p = Tracers , nodeStateTracer :: !(Tracer IO NodeState) , resourcesTracer :: !(Tracer IO ResourceStats) , peersTracer :: !(Tracer IO [PeerT blk]) + , ledgerMetricsTracer :: !(Tracer IO LedgerMetrics) } diff --git a/cardano-node/src/Cardano/Node/Tracing/API.hs b/cardano-node/src/Cardano/Node/Tracing/API.hs index cf8f182411b..fb09a851705 100644 --- a/cardano-node/src/Cardano/Node/Tracing/API.hs +++ b/cardano-node/src/Cardano/Node/Tracing/API.hs @@ -18,6 +18,7 @@ import Cardano.Node.Tracing import Cardano.Node.Tracing.DefaultTraceConfig (defaultCardanoConfig) import Cardano.Node.Tracing.StateRep (NodeState (..)) import Cardano.Node.Tracing.Tracers +import Cardano.Node.Tracing.Tracers.LedgerMetrics import Cardano.Node.Tracing.Tracers.Peer (startPeerTracer) import Cardano.Node.Tracing.Tracers.Resources (startResourceTracer) import Cardano.Node.Types @@ -69,6 +70,11 @@ initTraceDispatcher nc p networkMagic nodeKernel p2pMode = do (resourcesTracer tracers) (fromMaybe 1000 (tcResourceFrequency trConfig)) + startLedgerMetricsTracer + (ledgerMetricsTracer tracers) + (fromMaybe 1000 (tcLedgerMetricsFrequency trConfig)) + nodeKernel + startPeerTracer (peersTracer tracers) nodeKernel diff --git a/cardano-node/src/Cardano/Node/Tracing/Consistency.hs b/cardano-node/src/Cardano/Node/Tracing/Consistency.hs index 74cd1635475..5bc94e0f8d6 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Consistency.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Consistency.hs @@ -44,6 +44,7 @@ import Ouroboros.Consensus.MiniProtocol.ChainSync.Client (TraceChainSy import Ouroboros.Consensus.MiniProtocol.ChainSync.Server (TraceChainSyncServerEvent) import Ouroboros.Consensus.MiniProtocol.LocalTxSubmission.Server (TraceLocalTxSubmissionServerEvent (..)) +import Ouroboros.Consensus.Node.Tracers (TraceForgeEvent) import qualified Ouroboros.Consensus.Protocol.Ledger.HotKey as HotKey import qualified Ouroboros.Consensus.Storage.ChainDB as ChainDB import Ouroboros.Network.Block (Point (..), SlotNo, Tip) @@ -177,8 +178,8 @@ getAllNamespaces = (TraceLocalTxSubmissionServerEvent blk)]) mempoolNS = map (nsGetTuple . nsReplacePrefix ["Mempool"]) (allNamespaces :: [Namespace (TraceEventMempool blk)]) - -- forgeNS = map (nsGetTuple . nsReplacePrefix ["Forge", "Loop"]) - -- (allNamespaces :: [Namespace (ForgeTracerType blk)]) TODO YUP + forgeNS = map (nsGetTuple . nsReplacePrefix ["Forge", "Loop"]) + (allNamespaces :: [Namespace (TraceForgeEvent blk)]) blockchainTimeNS = map (nsGetTuple . nsReplacePrefix ["BlockchainTime"]) (allNamespaces :: [Namespace (TraceBlockchainTimeEvent RelativeTime)]) @@ -386,7 +387,7 @@ getAllNamespaces = <> txOutboundNS <> localTxSubmissionServerNS <> mempoolNS --- <> forgeNS TODO YUP + <> forgeNS <> blockchainTimeNS -- NodeToClient <> keepAliveClientNS diff --git a/cardano-node/src/Cardano/Node/Tracing/Documentation.hs b/cardano-node/src/Cardano/Node/Tracing/Documentation.hs index b97210604ad..5ef2cee5c61 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Documentation.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Documentation.hs @@ -355,13 +355,12 @@ docTracersFirstPhase condConfigFileName = do mempoolTrDoc <- documentTracer (mempoolTr :: Trace IO (TraceEventMempool blk)) - -- forgeTr <- mkCardanoTracer - -- trBase trForward mbTrEKG - -- ["Forge", "Loop"] - -- configureTracers configReflection trConfig [forgeTr] - -- -- forgeTrDoc <- documentTracer (forgeTr :: - -- -- Trace IO (ForgeTracerType blk)) TODO YUP - + forgeTr <- mkCardanoTracer + trBase trForward mbTrEKG + ["Forge", "Loop"] + configureTracers configReflection trConfig [forgeTr] + forgeTrDoc <- documentTracer (forgeTr :: + Trace IO (Consensus.TraceForgeEvent blk)) forgeTr' <- mkCardanoTracer trBase trForward mbTrEKG @@ -718,7 +717,7 @@ docTracersFirstPhase condConfigFileName = do <> txOutboundTrDoc <> localTxSubmissionServerTrDoc <> mempoolTrDoc --- <> forgeTrDoc TODO YUP + <> forgeTrDoc <> forgeThreadStatsTrDoc <> blockchainTimeTrDoc -- NodeToClient diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers.hs index aca63b7b176..a83d4e27532 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers.hs @@ -31,6 +31,7 @@ import Cardano.Node.Tracing.Tracers.Consensus import Cardano.Node.Tracing.Tracers.Diffusion () import Cardano.Node.Tracing.Tracers.ForgingThreadStats (forgeThreadStats) import Cardano.Node.Tracing.Tracers.KESInfo +import Cardano.Node.Tracing.Tracers.LedgerMetrics () import Cardano.Node.Tracing.Tracers.NodeToClient () import Cardano.Node.Tracing.Tracers.NodeToNode () import Cardano.Node.Tracing.Tracers.NodeVersion (getNodeVersion) @@ -117,6 +118,9 @@ mkDispatchTracers nodeKernel trBase trForward mbTrEKG trDataPoint trConfig enabl !resourcesTr <- mkCardanoTracer trBase trForward mbTrEKG [] configureTracers configReflection trConfig [resourcesTr] + !ledgerMetricsTr <- mkCardanoTracer trBase trForward mbTrEKG [] + configureTracers configReflection trConfig [ledgerMetricsTr] + !startupTr <- mkCardanoTracer trBase trForward mbTrEKG ["Startup"] configureTracers configReflection trConfig [startupTr] @@ -199,6 +203,7 @@ mkDispatchTracers nodeKernel trBase trForward mbTrEKG trDataPoint trConfig enabl , resourcesTracer = Tracer (traceWith resourcesTr) , peersTracer = Tracer (traceWith peersTr) <> Tracer (traceNodePeers nodePeersDP) + , ledgerMetricsTracer = Tracer (traceWith ledgerMetricsTr) } mkConsensusTracers :: forall blk. @@ -301,11 +306,10 @@ mkConsensusTracers configReflection trBase trForward mbTrEKG _trDataPoint trConf ["Mempool"] configureTracers configReflection trConfig [mempoolTr] - -- !forgeTr <- mkCardanoTracer' - -- trBase trForward mbTrEKG - -- ["Forge", "Loop"] - -- (forgeTracerTransform nodeKernel) - -- configureTracers configReflection trConfig [forgeTr] TODO YUP + !forgeTr <- mkCardanoTracer + trBase trForward mbTrEKG + ["Forge", "Loop"] + configureTracers configReflection trConfig [forgeTr] !forgeThreadStatsTr <- mkCardanoTracer' trBase trForward mbTrEKG @@ -362,11 +366,10 @@ mkConsensusTracers configReflection trBase trForward mbTrEKG _trDataPoint trConf traceWith localTxSubmissionServerTr , Consensus.mempoolTracer = Tracer $ traceWith mempoolTr - , Consensus.forgeTracer = mempty - -- , Consensus.forgeTracer = - -- Tracer (\(Consensus.TraceLabelCreds _ x) -> traceWith forgeTr x) //TODO YUP - -- <> - -- Tracer (\(Consensus.TraceLabelCreds _ x) -> traceWith forgeThreadStatsTr x) + , Consensus.forgeTracer = + Tracer (\(Consensus.TraceLabelCreds _ x) -> traceWith forgeTr x) + <> + Tracer (\(Consensus.TraceLabelCreds _ x) -> traceWith forgeThreadStatsTr x) , Consensus.blockchainTimeTracer = Tracer $ traceWith blockchainTimeTr , Consensus.keepAliveClientTracer = Tracer $ diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs index 512ced72392..b687bbde476 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs @@ -68,7 +68,7 @@ import Ouroboros.Network.TxSubmission.Outbound import Control.Monad (guard) import Control.Monad.Class.MonadTime.SI (Time (..)) -import Data.Aeson (ToJSON, Value (Number, String), toJSON, (.=)) +import Data.Aeson (ToJSON, Value (..), toJSON, (.=)) import qualified Data.Aeson as Aeson import Data.Foldable (Foldable(toList)) import Data.Int (Int64) diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerQuery.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs similarity index 53% rename from cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerQuery.hs rename to cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs index 5e1488edb62..86cbfda2946 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerQuery.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs @@ -2,16 +2,21 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE PackageImports #-} {-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE ScopedTypeVariables #-} -module Cardano.Node.Tracing.Tracers.LedgerQuery - ( TraceLedgerQuery (..) - , traceLedgerQuery + + +module Cardano.Node.Tracing.Tracers.LedgerMetrics + ( LedgerMetrics (..) + , traceLedgerMetrics + , startLedgerMetricsTracer ) where import Cardano.Ledger.BaseTypes (StrictMaybe (..)) -import Cardano.Logging +import Cardano.Logging hiding (traceWith) import Cardano.Node.Queries (LedgerQueries (..), NodeKernelData (..), mapNodeKernelDataIO, nkQueryChain, nkQueryLedger) import Cardano.Node.Tracing.Tracers.ChainDB (fragmentChainDensity) @@ -20,18 +25,39 @@ import Ouroboros.Consensus.Ledger.Abstract (IsLedger) import Ouroboros.Consensus.Ledger.Extended (ledgerState) import qualified Ouroboros.Network.AnchoredFragment as AF +import Control.Concurrent (threadDelay) +import Control.Concurrent.Async (async) +import Control.Monad (forever) +import Control.Monad.Class.MonadAsync (link) +import "contra-tracer" Control.Tracer (Tracer, traceWith) import Data.Aeson (Value (Number, String), (.=)) +startLedgerMetricsTracer + :: forall blk + . IsLedger (LedgerState blk) + => LedgerQueries blk + => AF.HasHeader (Header blk) + => Tracer IO LedgerMetrics + -> Int + -> NodeKernelData blk + -> IO () +startLedgerMetricsTracer tr delayMilliseconds nodeKernelData = do + as <- async ledgerMetricsThread + link as + where + ledgerMetricsThread :: IO () + ledgerMetricsThread = forever $ do + traceLedgerMetrics nodeKernelData tr + threadDelay (delayMilliseconds * 1000) -data TraceLedgerQuery = - TraceLedgerQuery { - -- tsSlotNo :: SlotNo +data LedgerMetrics = + LedgerMetrics { tsUtxoSize :: Int , tsDelegMapSize :: Int , tsChainDensity :: Double } -traceLedgerQuery :: +traceLedgerMetrics :: ( IsLedger (LedgerState blk) , LedgerQueries blk #if __GLASGOW_HASKELL__ >= 906 @@ -39,9 +65,9 @@ traceLedgerQuery :: #endif , AF.HasHeader (Header blk)) => NodeKernelData blk - -> Trace IO TraceLedgerQuery + -> Tracer IO LedgerMetrics -> IO () -traceLedgerQuery nodeKern tracer = do +traceLedgerMetrics nodeKern tracer = do query <- mapNodeKernelDataIO (\nk -> (,,) @@ -52,34 +78,54 @@ traceLedgerQuery nodeKern tracer = do case query of SNothing -> pure () SJust (utxoSize, delegMapSize, chainDensity) -> - let msg = TraceLedgerQuery + let msg = LedgerMetrics utxoSize delegMapSize (fromRational chainDensity) in traceWith tracer msg -------------------------------------------------------------------------------- --- TraceStartLeadershipCheck +-- LedgerMetrics -------------------------------------------------------------------------------- -instance LogFormatting TraceLedgerQuery where - forMachine _dtal TraceLedgerQuery {..} = - mconcat [ "kind" .= String "TraceLedgerQuery" - -- , "slot" .= toJSON (unSlotNo tsSlotNo) +instance LogFormatting LedgerMetrics where + forMachine _dtal LedgerMetrics {..} = + mconcat [ "kind" .= String "LedgerMetrics" , "utxoSize" .= Number (fromIntegral tsUtxoSize) , "delegMapSize" .= Number (fromIntegral tsDelegMapSize) , "chainDensity" .= Number (fromRational (toRational tsChainDensity)) ] - forHuman TraceLedgerQuery {..} = - "Querying ledger " -- <> showT (unSlotNo tsSlotNo) + forHuman LedgerMetrics {..} = + "Ledger metrics " <> " utxoSize " <> showT tsUtxoSize <> " delegMapSize " <> showT tsDelegMapSize <> " chainDensity " <> showT tsChainDensity - asMetrics TraceLedgerQuery {..} = + asMetrics LedgerMetrics {..} = [IntM "utxoSize" (fromIntegral tsUtxoSize), IntM "delegMapSize" (fromIntegral tsDelegMapSize)] +instance MetaTrace LedgerMetrics where + namespaceFor LedgerMetrics {} = Namespace [] ["LedgerMetrics"] + severityFor (Namespace _ ["LedgerMetrics"]) _ = Just Info + severityFor _ _ = Nothing + + metricsDocFor (Namespace _ ["LedgerMetrics"]) = + [ ("utxoSize", "UTxO set size") + , ("delegMapSize", "Delegation map size") + ] + metricsDocFor _ = [] + + documentFor (Namespace _ ["LedgerMetrics"]) = Just $ mconcat + [ "" -- TODO YUP + ] + + documentFor _ = Nothing + + allNamespaces = [Namespace [] ["LedgerMetrics"]] + + + diff --git a/cardano-node/src/Cardano/Tracing/Tracers.hs b/cardano-node/src/Cardano/Tracing/Tracers.hs index 78ea014e3e5..45f3e8efaa9 100644 --- a/cardano-node/src/Cardano/Tracing/Tracers.hs +++ b/cardano-node/src/Cardano/Tracing/Tracers.hs @@ -70,8 +70,8 @@ import Ouroboros.Consensus.Ledger.Abstract (LedgerErr, LedgerState) import Ouroboros.Consensus.Ledger.Extended (ledgerState) import Ouroboros.Consensus.Ledger.Inspect (InspectLedger, LedgerEvent) import Ouroboros.Consensus.Ledger.Query (BlockQuery) -import Ouroboros.Consensus.Ledger.SupportsMempool (ApplyTxErr, GenTx, GenTxId, HasTxs, - LedgerSupportsMempool, ByteSize32 (..)) +import Ouroboros.Consensus.Ledger.SupportsMempool (ApplyTxErr, ByteSize32 (..), GenTx, + GenTxId, HasTxs, LedgerSupportsMempool) import Ouroboros.Consensus.Ledger.SupportsProtocol (LedgerSupportsProtocol) import Ouroboros.Consensus.Mempool (MempoolSize (..), TraceEventMempool (..)) import Ouroboros.Consensus.MiniProtocol.BlockFetch.Server @@ -176,6 +176,7 @@ nullTracersP2P = Tracers , nodeVersionTracer = nullTracer , resourcesTracer = nullTracer , peersTracer = nullTracer + , ledgerMetricsTracer = nullTracer } nullTracersNonP2P :: Tracers peer localPeer blk 'Diffusion.NonP2P @@ -194,6 +195,7 @@ nullTracersNonP2P = Tracers , nodeVersionTracer = nullTracer , resourcesTracer = nullTracer , peersTracer = nullTracer + , ledgerMetricsTracer = nullTracer } indexGCType :: ChainDB.TraceGCEvent a -> Int @@ -360,6 +362,7 @@ mkTracers blockConfig tOpts@(TracingOnLegacy trSel) tr nodeKern ekgDirect enable , nodeStateTracer = nullTracer , resourcesTracer = nullTracer , peersTracer = nullTracer + , ledgerMetricsTracer = nullTracer } where traceForgeEnabledMetric :: Maybe EKGDirect -> StartupTrace blk -> IO () @@ -538,6 +541,7 @@ mkTracers _ _ _ _ _ enableP2P = , nodeVersionTracer = nullTracer , resourcesTracer = nullTracer , peersTracer = nullTracer + , ledgerMetricsTracer = nullTracer } -------------------------------------------------------------------------------- diff --git a/cardano-tracer/src/Cardano/Tracer/MetaTrace.hs b/cardano-tracer/src/Cardano/Tracer/MetaTrace.hs index 9abd834affc..d7c8a685c7f 100644 --- a/cardano-tracer/src/Cardano/Tracer/MetaTrace.hs +++ b/cardano-tracer/src/Cardano/Tracer/MetaTrace.hs @@ -302,6 +302,7 @@ mkTracerTracer defSeverity = do , tcNodeName = Nothing , tcPeerFrequency = Nothing , tcResourceFrequency = Nothing + , tcLedgerMetricsFrequency = Nothing , tcMetricsPrefix = Nothing , tcOptions = Map.fromList [ ([], [ConfSeverity defSeverity]) From 84af3a91391aaf5be0c9b49aa7a8dd2d48402504 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Tue, 14 Jan 2025 14:16:39 +0100 Subject: [PATCH 09/21] trace-dispatcher: ledger metrics frequency --- .../src/Cardano/Logging/ConfigurationParser.hs | 8 ++++++++ trace-dispatcher/src/Cardano/Logging/Types.hs | 2 ++ 2 files changed, 10 insertions(+) diff --git a/trace-dispatcher/src/Cardano/Logging/ConfigurationParser.hs b/trace-dispatcher/src/Cardano/Logging/ConfigurationParser.hs index f911d4b5756..ce8d5c5f74a 100644 --- a/trace-dispatcher/src/Cardano/Logging/ConfigurationParser.hs +++ b/trace-dispatcher/src/Cardano/Logging/ConfigurationParser.hs @@ -35,6 +35,7 @@ data ConfigRepresentation = ConfigRepresentation { , traceOptionMetricsPrefix :: Maybe Text , traceOptionPeerFrequency :: Maybe Int , traceOptionResourceFrequency :: Maybe Int + , traceOptionLedgerMetricsFrequency :: Maybe Int } deriving (Eq, Ord, Show) @@ -46,6 +47,7 @@ instance AE.FromJSON ConfigRepresentation where <*> obj .:? "TraceOptionMetricsPrefix" <*> obj .:? "TraceOptionPeerFrequency" <*> obj .:? "TraceOptionResourceFrequency" + <*> obj .:? "TraceOptionLedgerMetricsFrequency" parseJSON _ = mempty instance AE.ToJSON ConfigRepresentation where @@ -56,6 +58,7 @@ instance AE.ToJSON ConfigRepresentation where , "TraceOptionMetricsPrefix" .= traceOptionMetricsPrefix , "TraceOptionPeerFrequency" .= traceOptionPeerFrequency , "TraceOptionResourceFrequency" .= traceOptionResourceFrequency + , "TraceOptionLedgerMetricsFrequency" .= traceOptionLedgerMetricsFrequency ] type OptionsRepresentation = Map.Map Text ConfigOptionRep @@ -76,6 +79,7 @@ instance AE.FromJSON ConfigOptionRep where <*> obj .:? "detail" <*> obj .:? "backends" <*> obj .:? "maxFrequency" + parseJSON _ = mempty instance AE.ToJSON ConfigOptionRep where @@ -113,6 +117,7 @@ readConfigurationWithDefault fp defaultConf = do (tcMetricsPrefix fileConf <|> tcMetricsPrefix defaultConf) (tcPeerFrequency fileConf <|> tcPeerFrequency defaultConf) (tcResourceFrequency fileConf <|> tcResourceFrequency defaultConf) + (tcLedgerMetricsFrequency fileConf <|> tcLedgerMetricsFrequency defaultConf) -- | Parse the byteString as external representation and converts to internal -- representation @@ -145,6 +150,8 @@ parseRepresentation bs = transform (decodeEither' bs) (traceOptionMetricsPrefix cr) (traceOptionPeerFrequency cr) (traceOptionResourceFrequency cr) + (traceOptionLedgerMetricsFrequency cr) + -- | Convert from external to internal representation toConfigOptions :: ConfigOptionRep -> [ConfigOption] @@ -166,6 +173,7 @@ configToRepresentation traceConfig = (tcMetricsPrefix traceConfig) (tcPeerFrequency traceConfig) (tcResourceFrequency traceConfig) + (tcLedgerMetricsFrequency traceConfig) where toOptionRepresentation :: Map.Map [Text] [ConfigOption] -> Map.Map Text ConfigOptionRep diff --git a/trace-dispatcher/src/Cardano/Logging/Types.hs b/trace-dispatcher/src/Cardano/Logging/Types.hs index e2c21afe5ea..5d67e0618d4 100644 --- a/trace-dispatcher/src/Cardano/Logging/Types.hs +++ b/trace-dispatcher/src/Cardano/Logging/Types.hs @@ -480,6 +480,8 @@ data TraceConfig = TraceConfig { , tcPeerFrequency :: Maybe Int -- | Optional resource trace frequency in milliseconds. , tcResourceFrequency :: Maybe Int + -- | Optional ledger metrics frequency in milliseconds. + , tcLedgerMetricsFrequency :: Maybe Int } deriving (Eq, Ord, Show) From 68841d7f1563d478e9157ef8340aa9f96c57717c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Wed, 15 Jan 2025 11:19:15 +0100 Subject: [PATCH 10/21] cardano-node: consistency and documentation --- cabal.project | 2 +- cardano-node/src/Cardano/Node/Tracing/Consistency.hs | 4 ++++ cardano-node/src/Cardano/Node/Tracing/Documentation.hs | 8 ++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cabal.project b/cabal.project index 2ab8caf4794..4d6a1820763 100644 --- a/cabal.project +++ b/cabal.project @@ -35,7 +35,7 @@ packages: extra-packages: Cabal program-options - ghc-options: -Werror +-- ghc-options: -Werror test-show-details: direct diff --git a/cardano-node/src/Cardano/Node/Tracing/Consistency.hs b/cardano-node/src/Cardano/Node/Tracing/Consistency.hs index 5bc94e0f8d6..d6b8903fd0c 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Consistency.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Consistency.hs @@ -24,6 +24,7 @@ import qualified Cardano.Node.Tracing.StateRep as SR import Cardano.Node.Tracing.Tracers.BlockReplayProgress import Cardano.Node.Tracing.Tracers.Diffusion () import Cardano.Node.Tracing.Tracers.KESInfo () +import Cardano.Node.Tracing.Tracers.LedgerMetrics (LedgerMetrics) import Cardano.Node.Tracing.Tracers.NodeToClient () import Cardano.Node.Tracing.Tracers.NodeToNode () import Cardano.Node.Tracing.Tracers.NodeVersion (NodeVersionTrace) @@ -127,6 +128,8 @@ getAllNamespaces = (allNamespaces :: [Namespace [PeerT blk]]) resourcesNS = map nsGetTuple (allNamespaces :: [Namespace ResourceStats]) + ledgerMetricsNS = map nsGetTuple + (allNamespaces :: [Namespace LedgerMetrics]) startupNS = map (nsGetTuple . nsReplacePrefix ["Startup"]) (allNamespaces :: [Namespace (StartupTrace blk)]) shutdownNS = map (nsGetTuple . nsReplacePrefix ["Shutdown"]) @@ -370,6 +373,7 @@ getAllNamespaces = stateNS <> peersNS <> resourcesNS + <> ledgerMetricsNS <> startupNS <> shutdownNS <> nodeVersionNS diff --git a/cardano-node/src/Cardano/Node/Tracing/Documentation.hs b/cardano-node/src/Cardano/Node/Tracing/Documentation.hs index 5ef2cee5c61..262a5e51877 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Documentation.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Documentation.hs @@ -33,6 +33,7 @@ import Cardano.Node.Tracing.Tracers.Consensus import Cardano.Node.Tracing.Tracers.Diffusion () import Cardano.Node.Tracing.Tracers.ForgingThreadStats (ForgeThreadStats) import Cardano.Node.Tracing.Tracers.KESInfo () +import Cardano.Node.Tracing.Tracers.LedgerMetrics (LedgerMetrics) import Cardano.Node.Tracing.Tracers.NodeToClient () import Cardano.Node.Tracing.Tracers.NodeToNode () import Cardano.Node.Tracing.Tracers.NodeVersion (NodeVersionTrace) @@ -231,6 +232,10 @@ docTracersFirstPhase condConfigFileName = do configureTracers configReflection trConfig [resourcesTr] resourcesTrDoc <- documentTracer (resourcesTr :: Trace IO ResourceStats) + ledgerMetricsTr <- mkCardanoTracer trBase trForward mbTrEKG [] + configureTracers configReflection trConfig [ledgerMetricsTr] + ledgerMetricsTrDoc <- documentTracer (ledgerMetricsTr :: Trace IO LedgerMetrics) + -- Startup tracer startupTr <- mkCardanoTracer trBase trForward mbTrEKG @@ -376,6 +381,8 @@ docTracersFirstPhase condConfigFileName = do blockchainTimeTrDoc <- documentTracer (blockchainTimeTr :: Trace IO (TraceBlockchainTimeEvent RelativeTime)) + + -- Node to client keepAliveClientTr <- mkCardanoTracer @@ -698,6 +705,7 @@ docTracersFirstPhase condConfigFileName = do <> nodeStartupInfoDpDoc <> stateTrDoc <> resourcesTrDoc + <> ledgerMetricsTrDoc <> startupTrDoc <> shutdownTrDoc <> nodeVersionDoc From 34e18a9a78f7cb87cae26d773088dea56c2e6c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Wed, 15 Jan 2025 11:51:56 +0100 Subject: [PATCH 11/21] bench: empty config value --- bench/tx-generator/src/Cardano/Benchmarking/Tracer.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/bench/tx-generator/src/Cardano/Benchmarking/Tracer.hs b/bench/tx-generator/src/Cardano/Benchmarking/Tracer.hs index f52fe4db709..4d041aa57e8 100644 --- a/bench/tx-generator/src/Cardano/Benchmarking/Tracer.hs +++ b/bench/tx-generator/src/Cardano/Benchmarking/Tracer.hs @@ -177,6 +177,7 @@ initialTraceConfig = TraceConfig { , tcPeerFrequency = Just 2000 -- Every 2 seconds , tcResourceFrequency = Just 1000 -- Every second , tcMetricsPrefix = Nothing + , tcLedgerMetricsFrequency = Nothing } where setMaxDetail :: Text -> ([Text], [ConfigOption]) From 4edb75723ef0a703db4c9a4e650299abce15b806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Wed, 15 Jan 2025 11:52:21 +0100 Subject: [PATCH 12/21] workbench: adopt config --- nix/workbench/service/tracing.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/nix/workbench/service/tracing.nix b/nix/workbench/service/tracing.nix index 9b8ef772d6e..9d24ecc31f6 100644 --- a/nix/workbench/service/tracing.nix +++ b/nix/workbench/service/tracing.nix @@ -76,6 +76,7 @@ let "Net.Subscription.DNS".severity = "Debug"; "Net.Subscription.IP".severity = "Debug"; "NodeState".severity = "Notice"; + "LedgerMetrics".severity = "Info"; "Resources".severity = "Debug"; "Shutdown".severity = "Notice"; "Startup".severity = "Notice"; From b52f9601b9316c764d3933698709416cb76f71f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Wed, 15 Jan 2025 11:52:43 +0100 Subject: [PATCH 13/21] trace-dispatcher: config value --- trace-dispatcher/src/Cardano/Logging/Types.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/trace-dispatcher/src/Cardano/Logging/Types.hs b/trace-dispatcher/src/Cardano/Logging/Types.hs index 5d67e0618d4..5907a9c8010 100644 --- a/trace-dispatcher/src/Cardano/Logging/Types.hs +++ b/trace-dispatcher/src/Cardano/Logging/Types.hs @@ -494,6 +494,7 @@ emptyTraceConfig = TraceConfig { , tcMetricsPrefix = Nothing , tcPeerFrequency = Just 2000 -- Every 2 seconds , tcResourceFrequency = Just 5000 -- Every five seconds + , tcLedgerMetricsFrequency = Just 1000 } --------------------------------------------------------------------------- From ff562dc0b483394f0da6ede080815f9d99fff161 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Wed, 15 Jan 2025 12:02:43 +0100 Subject: [PATCH 14/21] trace-dispatcher: test fixes --- .../test/Cardano/Logging/Test/Unit/Configuration.hs | 2 ++ .../test/Cardano/Logging/Test/Unit/Documentation.hs | 1 + 2 files changed, 3 insertions(+) diff --git a/trace-dispatcher/test/Cardano/Logging/Test/Unit/Configuration.hs b/trace-dispatcher/test/Cardano/Logging/Test/Unit/Configuration.hs index d07e8d93090..650a73bcbd9 100644 --- a/trace-dispatcher/test/Cardano/Logging/Test/Unit/Configuration.hs +++ b/trace-dispatcher/test/Cardano/Logging/Test/Unit/Configuration.hs @@ -60,6 +60,7 @@ config1 = TraceConfig { , tcPeerFrequency = Nothing , tcResourceFrequency = Nothing , tcMetricsPrefix = Nothing + , tcLedgerMetricsFrequency = Nothing } config2 :: TraceConfig @@ -78,6 +79,7 @@ config2 = TraceConfig { , tcPeerFrequency = Nothing , tcResourceFrequency = Nothing , tcMetricsPrefix = Nothing + , tcLedgerMetricsFrequency = Nothing } testConfig' :: diff --git a/trace-dispatcher/test/Cardano/Logging/Test/Unit/Documentation.hs b/trace-dispatcher/test/Cardano/Logging/Test/Unit/Documentation.hs index f8196d5fd58..0614707ad0f 100644 --- a/trace-dispatcher/test/Cardano/Logging/Test/Unit/Documentation.hs +++ b/trace-dispatcher/test/Cardano/Logging/Test/Unit/Documentation.hs @@ -43,5 +43,6 @@ config1 = TraceConfig { , tcPeerFrequency = Nothing , tcResourceFrequency = Nothing , tcMetricsPrefix = Just "cardano" + , tcLedgerMetricsFrequency = Nothing } From 24e523f19de5d215ef086128c6df6328f306045d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Wed, 15 Jan 2025 12:07:07 +0100 Subject: [PATCH 15/21] fix changed cabal.project --- cabal.project | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cabal.project b/cabal.project index 4d6a1820763..2ab8caf4794 100644 --- a/cabal.project +++ b/cabal.project @@ -35,7 +35,7 @@ packages: extra-packages: Cabal program-options --- ghc-options: -Werror + ghc-options: -Werror test-show-details: direct From ee34ea04e742cefd6475ae5eef1bf0264a172593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Wed, 15 Jan 2025 12:57:01 +0100 Subject: [PATCH 16/21] cardano-node: Fix for ghc 9 --- cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs index 86cbfda2946..46e04a1ddd6 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs @@ -37,6 +37,9 @@ startLedgerMetricsTracer . IsLedger (LedgerState blk) => LedgerQueries blk => AF.HasHeader (Header blk) +#if __GLASGOW_HASKELL__ >= 908 + => AF.HasHeader blk +#endif => Tracer IO LedgerMetrics -> Int -> NodeKernelData blk From 727c3c399fc5be9484d543dea009f3f4842dcdd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Wed, 15 Jan 2025 16:22:24 +0100 Subject: [PATCH 17/21] cardano-node: Next try to fix --- .../src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs index 46e04a1ddd6..f4cb9cd90fa 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs @@ -6,7 +6,7 @@ {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-} - +{-# OPTIONS_GHC -Wno-redundant-constraints #-} module Cardano.Node.Tracing.Tracers.LedgerMetrics ( LedgerMetrics (..) @@ -14,7 +14,6 @@ module Cardano.Node.Tracing.Tracers.LedgerMetrics , startLedgerMetricsTracer ) where - import Cardano.Ledger.BaseTypes (StrictMaybe (..)) import Cardano.Logging hiding (traceWith) import Cardano.Node.Queries (LedgerQueries (..), NodeKernelData (..), mapNodeKernelDataIO, @@ -37,9 +36,7 @@ startLedgerMetricsTracer . IsLedger (LedgerState blk) => LedgerQueries blk => AF.HasHeader (Header blk) -#if __GLASGOW_HASKELL__ >= 908 => AF.HasHeader blk -#endif => Tracer IO LedgerMetrics -> Int -> NodeKernelData blk From 5741bbbd738c12e3acb70fde61ab22ceaf95b357 Mon Sep 17 00:00:00 2001 From: Michael Karg Date: Thu, 16 Jan 2025 14:28:11 +0100 Subject: [PATCH 18/21] s-r-p for o-c --- cabal.project | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cabal.project b/cabal.project index 2ab8caf4794..eb3de44ca31 100644 --- a/cabal.project +++ b/cabal.project @@ -68,3 +68,17 @@ allow-newer: -- IMPORTANT -- Do NOT add more source-repository-package stanzas here unless they are strictly -- temporary! Please read the section in CONTRIBUTING about updating dependencies. + +-- exposes getBlockchainTime in NodeKernel +source-repository-package + type: git + location: https://github.com/mgmeier/ouroboros-consensus.git + tag: 509bf8eafcf8ec7e28a1abe587d8913ed8838404 + --sha256: 1klx7x85bkzl83gmjpc2jhihjcvy3vcm75k5f0rxivgwxg4gh3k2 + subdir: + ouroboros-consensus + ouroboros-consensus-cardano + ouroboros-consensus-diffusion + ouroboros-consensus-protocol + sop-extras + strict-sop-core From 77c3e42c930ace51b53ca89a9d411c5922300a4a Mon Sep 17 00:00:00 2001 From: Michael Karg Date: Thu, 16 Jan 2025 15:52:46 +0100 Subject: [PATCH 19/21] try: ledger metrics 700ms after slot start --- .../Node/Tracing/Tracers/LedgerMetrics.hs | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs index f4cb9cd90fa..101d9fedee3 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} @@ -14,22 +15,24 @@ module Cardano.Node.Tracing.Tracers.LedgerMetrics , startLedgerMetricsTracer ) where -import Cardano.Ledger.BaseTypes (StrictMaybe (..)) +import Cardano.Ledger.BaseTypes (SlotNo (..), StrictMaybe (..)) import Cardano.Logging hiding (traceWith) import Cardano.Node.Queries (LedgerQueries (..), NodeKernelData (..), mapNodeKernelDataIO, nkQueryChain, nkQueryLedger) import Cardano.Node.Tracing.Tracers.ChainDB (fragmentChainDensity) +import Ouroboros.Consensus.BlockchainTime.API import Ouroboros.Consensus.HardFork.Combinator import Ouroboros.Consensus.Ledger.Abstract (IsLedger) import Ouroboros.Consensus.Ledger.Extended (ledgerState) +import Ouroboros.Consensus.Node (NodeKernel (getBlockchainTime)) import qualified Ouroboros.Network.AnchoredFragment as AF import Control.Concurrent (threadDelay) import Control.Concurrent.Async (async) -import Control.Monad (forever) import Control.Monad.Class.MonadAsync (link) +import Control.Monad.STM (atomically, retry) import "contra-tracer" Control.Tracer (Tracer, traceWith) -import Data.Aeson (Value (Number, String), (.=)) +import Data.Aeson (Value (Number, String), toJSON, (.=)) startLedgerMetricsTracer :: forall blk @@ -41,18 +44,32 @@ startLedgerMetricsTracer -> Int -> NodeKernelData blk -> IO () -startLedgerMetricsTracer tr delayMilliseconds nodeKernelData = do +startLedgerMetricsTracer tr _delayMilliseconds nodeKernelData = do as <- async ledgerMetricsThread link as where ledgerMetricsThread :: IO () - ledgerMetricsThread = forever $ do - traceLedgerMetrics nodeKernelData tr - threadDelay (delayMilliseconds * 1000) + ledgerMetricsThread = go (-1) where + go slot = do + !query <- waitForDifferentSlot slot + threadDelay $ 700 * 1000 + case query of + SJust slot' -> traceLedgerMetrics nodeKernelData slot' tr >> go slot' + SNothing -> go slot + + waitForDifferentSlot :: SlotNo -> IO (StrictMaybe SlotNo) + waitForDifferentSlot s = do + mapNodeKernelDataIO (\nk -> atomically $ do + mSlot <- getCurrentSlot (getBlockchainTime nk) + case mSlot of + CurrentSlot s' | s' /= s -> return s' + _ -> retry + ) nodeKernelData data LedgerMetrics = LedgerMetrics { - tsUtxoSize :: Int + tsSlotNo :: SlotNo + , tsUtxoSize :: Int , tsDelegMapSize :: Int , tsChainDensity :: Double } @@ -65,9 +82,10 @@ traceLedgerMetrics :: #endif , AF.HasHeader (Header blk)) => NodeKernelData blk + -> SlotNo -> Tracer IO LedgerMetrics -> IO () -traceLedgerMetrics nodeKern tracer = do +traceLedgerMetrics nodeKern slotNo tracer = do query <- mapNodeKernelDataIO (\nk -> (,,) @@ -79,6 +97,7 @@ traceLedgerMetrics nodeKern tracer = do SNothing -> pure () SJust (utxoSize, delegMapSize, chainDensity) -> let msg = LedgerMetrics + slotNo utxoSize delegMapSize (fromRational chainDensity) @@ -91,6 +110,7 @@ traceLedgerMetrics nodeKern tracer = do instance LogFormatting LedgerMetrics where forMachine _dtal LedgerMetrics {..} = mconcat [ "kind" .= String "LedgerMetrics" + , "slot" .= toJSON (unSlotNo tsSlotNo) , "utxoSize" .= Number (fromIntegral tsUtxoSize) , "delegMapSize" .= Number (fromIntegral tsDelegMapSize) , "chainDensity" .= Number (fromRational (toRational tsChainDensity)) From bab3516f4a271146330d78f5873468f80646b380 Mon Sep 17 00:00:00 2001 From: Michael Karg Date: Mon, 20 Jan 2025 16:24:18 +0100 Subject: [PATCH 20/21] locli: backport GC improvement --- bench/locli/locli.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bench/locli/locli.cabal b/bench/locli/locli.cabal index e5f1bd3b52d..ba05e6455cd 100644 --- a/bench/locli/locli.cabal +++ b/bench/locli/locli.cabal @@ -152,7 +152,7 @@ executable locli ghc-options: -threaded -Wall -rtsopts - "-with-rtsopts=-T -N7 -A2m -qb -H64m" + "-with-rtsopts=-T -N7 -A2m -c -H64m" build-depends: aeson , cardano-prelude From 5cfbeb2a760a9c4870046815ccb110ee7dc7eba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Nicklisch-Franken?= Date: Tue, 21 Jan 2025 11:16:25 +0100 Subject: [PATCH 21/21] cardano-node: ledgerDRepCount & ledgerDRepMapSize --- .../Node/Tracing/Tracers/LedgerMetrics.hs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs index 101d9fedee3..002403abef3 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/LedgerMetrics.hs @@ -71,6 +71,8 @@ data LedgerMetrics = tsSlotNo :: SlotNo , tsUtxoSize :: Int , tsDelegMapSize :: Int + , tsDRepCount :: Int + , tsDRepMapSize :: Int , tsChainDensity :: Double } @@ -88,18 +90,22 @@ traceLedgerMetrics :: traceLedgerMetrics nodeKern slotNo tracer = do query <- mapNodeKernelDataIO (\nk -> - (,,) + (,,,,) <$> nkQueryLedger (ledgerUtxoSize . ledgerState) nk <*> nkQueryLedger (ledgerDelegMapSize . ledgerState) nk + <*> nkQueryLedger (ledgerDRepCount . ledgerState) nk + <*> nkQueryLedger (ledgerDRepMapSize . ledgerState) nk <*> nkQueryChain fragmentChainDensity nk) nodeKern case query of SNothing -> pure () - SJust (utxoSize, delegMapSize, chainDensity) -> + SJust (utxoSize, delegMapSize, drepCount, drepMapSize, chainDensity) -> let msg = LedgerMetrics slotNo utxoSize delegMapSize + drepCount + drepMapSize (fromRational chainDensity) in traceWith tracer msg @@ -113,16 +119,22 @@ instance LogFormatting LedgerMetrics where , "slot" .= toJSON (unSlotNo tsSlotNo) , "utxoSize" .= Number (fromIntegral tsUtxoSize) , "delegMapSize" .= Number (fromIntegral tsDelegMapSize) + , "drepCount" .= Number (fromIntegral tsDRepCount) + , "drepMapSize" .= Number (fromIntegral tsDRepMapSize) , "chainDensity" .= Number (fromRational (toRational tsChainDensity)) ] forHuman LedgerMetrics {..} = "Ledger metrics " <> " utxoSize " <> showT tsUtxoSize <> " delegMapSize " <> showT tsDelegMapSize + <> " drepCount" <> showT tsDRepCount + <> " drepMapSize" <> showT tsDRepMapSize <> " chainDensity " <> showT tsChainDensity asMetrics LedgerMetrics {..} = - [IntM "utxoSize" (fromIntegral tsUtxoSize), - IntM "delegMapSize" (fromIntegral tsDelegMapSize)] + [ IntM "utxoSize" (fromIntegral tsUtxoSize) + , IntM "delegMapSize" (fromIntegral tsDelegMapSize) + , IntM "drepCount" (fromIntegral tsDRepCount) + , IntM "drepMapSize" (fromIntegral tsDRepMapSize)] instance MetaTrace LedgerMetrics where @@ -133,6 +145,8 @@ instance MetaTrace LedgerMetrics where metricsDocFor (Namespace _ ["LedgerMetrics"]) = [ ("utxoSize", "UTxO set size") , ("delegMapSize", "Delegation map size") + , ("drepCount", "") + , ("drepMapSize", "") ] metricsDocFor _ = []