From 378beefe63feb3498d2e25c9189894bb26d448e8 Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Fri, 23 Jan 2026 13:35:32 +0100 Subject: [PATCH 1/5] leios: Fixes compilation due to missing pattern matches --- .../Cardano/Node/Tracing/Tracers/Consensus.hs | 9 ++++++++ .../Tracing/OrphanInstances/Consensus.hs | 6 +++++ cardano-node/src/Cardano/Tracing/Tracers.hs | 23 +++++++++++-------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs index 1eaa93077a8..14ccf301a21 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs @@ -1583,6 +1583,10 @@ instance ( tx ~ GenTx blk (blockHash blk) , "blockSize" .= toJSON (getSizeInBytes $ estimateBlockSize (getHeader blk)) ] + forMachine _dtal TraceForgedEndorserBlock = + mconcat + [ "kind" .= String "TraceForgedEndorserBlock" + ] forHuman (TraceStartLeadershipCheck slotNo) = "Checking for leadership in slot " <> showT (unSlotNo slotNo) @@ -1658,6 +1662,7 @@ instance ( tx ~ GenTx blk "Adoption thread died in slot " <> showT (unSlotNo slotNo) <> ": " <> renderHeaderHash (Proxy @blk) (blockHash blk) + forHuman TraceForgedEndorserBlock = "Forged an Endorser Block" asMetrics (TraceForgeStateUpdateError slot reason) = IntM "Forge.StateUpdateError" (fromIntegral $ unSlotNo slot) : @@ -1711,6 +1716,8 @@ instance ( tx ~ GenTx blk [CounterM "Forge.adopted" Nothing] asMetrics (TraceAdoptionThreadDied _slot _) = [CounterM "Forge.adoption-thread-died" Nothing] + asMetrics TraceForgedEndorserBlock = + [] instance MetaTrace (TraceForgeEvent blk) where namespaceFor TraceStartLeadershipCheck {} = @@ -1751,6 +1758,8 @@ instance MetaTrace (TraceForgeEvent blk) where Namespace [] ["AdoptedBlock"] namespaceFor TraceAdoptionThreadDied {} = Namespace [] ["AdoptionThreadDied"] + namespaceFor TraceForgedEndorserBlock {} = + Namespace [] ["ForgedEndorserBlock"] severityFor (Namespace _ ["StartLeadershipCheck"]) _ = Just Info severityFor (Namespace _ ["SlotIsImmutable"]) _ = Just Error diff --git a/cardano-node/src/Cardano/Tracing/OrphanInstances/Consensus.hs b/cardano-node/src/Cardano/Tracing/OrphanInstances/Consensus.hs index 587ac517702..e1bb2b3cb56 100644 --- a/cardano-node/src/Cardano/Tracing/OrphanInstances/Consensus.hs +++ b/cardano-node/src/Cardano/Tracing/OrphanInstances/Consensus.hs @@ -323,6 +323,7 @@ instance HasSeverityAnnotation (TraceForgeEvent blk) where getSeverityAnnotation TraceForgedInvalidBlock {} = Error getSeverityAnnotation TraceAdoptedBlock {} = Info getSeverityAnnotation TraceAdoptionThreadDied {} = Error + getSeverityAnnotation TraceForgedEndorserBlock {} = Info instance HasPrivacyAnnotation (TraceLocalTxSubmissionServerEvent blk) @@ -493,6 +494,7 @@ instance ( tx ~ GenTx blk "Adoption Thread died in slot " <> showT (unSlotNo slotNo) <> ": " <> renderHeaderHash (Proxy @blk) (blockHash blk) + TraceForgedEndorserBlock -> const "Forged Endorser Block" -- TODO(bladyjoker) instance Transformable Text IO (TraceLocalTxSubmissionServerEvent blk) where @@ -1749,6 +1751,10 @@ instance ( RunNode blk (blockHash blk) , "blockSize" .= toJSON (getSizeInBytes $ estimateBlockSize (getHeader blk)) ] + toObject _verb TraceForgedEndorserBlock = + mconcat + [ "kind" .= String "TraceForgedEndorserBlock" + ] instance ToObject (TraceLocalTxSubmissionServerEvent blk) where diff --git a/cardano-node/src/Cardano/Tracing/Tracers.hs b/cardano-node/src/Cardano/Tracing/Tracers.hs index 5154aeb95c4..f21ab39ab6b 100644 --- a/cardano-node/src/Cardano/Tracing/Tracers.hs +++ b/cardano-node/src/Cardano/Tracing/Tracers.hs @@ -21,11 +21,11 @@ {-# OPTIONS_GHC -Wno-orphans #-} {-# OPTIONS_GHC -fno-warn-redundant-constraints #-} -- needs different instances on ghc8 and on ghc9 -#if __GLASGOW_HASKELL__ < 904 --- Pattern synonym record fields with GHC-8.10 is issuing the `-Wname-shadowing` --- warning. -{-# OPTIONS_GHC -Wno-name-shadowing #-} -#endif + + + + + module Cardano.Tracing.Tracers @@ -603,7 +603,7 @@ teeTraceChainTip , InspectLedger blk , ToObject (Header blk) , ToObject (LedgerEvent blk) - , ToObject (SelectView (BlockProtocol blk)) + , ToObject (Ouroboros.Consensus.Protocol.Abstract.SelectView (BlockProtocol blk)) ) => BlockConfig blk -> ForgingStats @@ -627,7 +627,7 @@ teeTraceChainTipElide , InspectLedger blk , ToObject (Header blk) , ToObject (LedgerEvent blk) - , ToObject (SelectView (BlockProtocol blk)) + , ToObject (Ouroboros.Consensus.Protocol.Abstract.SelectView (BlockProtocol blk)) ) => TracingVerbosity -> MVar (Maybe (WithSeverity (ChainDB.TraceEvent blk)), Integer) @@ -782,7 +782,7 @@ mkConsensusTracers , ToObject (GenTx blk) , ToObject (LedgerErr (LedgerState blk)) , ToObject (OtherHeaderEnvelopeError blk) - , ToObject (ValidationErr (BlockProtocol blk)) + , ToObject (Ouroboros.Consensus.Protocol.Abstract.ValidationErr (BlockProtocol blk)) , ToObject (ForgeStateUpdateError blk) , Consensus.RunNode blk , HasKESMetricsData blk @@ -1126,7 +1126,7 @@ teeForge :: , ToObject (CannotForge blk) , ToObject (LedgerErr (LedgerState blk)) , ToObject (OtherHeaderEnvelopeError blk) - , ToObject (ValidationErr (BlockProtocol blk)) + , ToObject (Ouroboros.Consensus.Protocol.Abstract.ValidationErr (BlockProtocol blk)) , ToObject (ForgeStateUpdateError blk) ) => ForgeTracers @@ -1156,6 +1156,7 @@ teeForge ft tverb tr = Tracer $ Consensus.TraceForgedInvalidBlock{} -> teeForge' (ftForgedInvalid ft) Consensus.TraceAdoptedBlock{} -> teeForge' (ftAdopted ft) Consensus.TraceAdoptionThreadDied{} -> teeForge' (ftTraceAdoptionThreadDied ft) + Consensus.TraceForgedEndorserBlock{} -> teeForge' (ftForged ft) case event of Consensus.TraceStartLeadershipCheck _slot -> pure () _ -> traceWith (toLogObject' tverb tr) ev @@ -1206,6 +1207,8 @@ teeForge' tr = LogValue "adoptedSlotLast" $ PureI $ fromIntegral $ unSlotNo slot Consensus.TraceAdoptionThreadDied slot _ -> LogValue "adoptionThreadDied" $ PureI $ fromIntegral $ unSlotNo slot + Consensus.TraceForgedEndorserBlock -> + LogValue "forgedEndorserBlock" $ PureI 0 forgeTracer :: forall blk. @@ -1213,7 +1216,7 @@ forgeTracer , ToObject (CannotForge blk) , ToObject (LedgerErr (LedgerState blk)) , ToObject (OtherHeaderEnvelopeError blk) - , ToObject (ValidationErr (BlockProtocol blk)) + , ToObject (Ouroboros.Consensus.Protocol.Abstract.ValidationErr (BlockProtocol blk)) , ToObject (ForgeStateUpdateError blk) , HasKESInfo blk ) From e5cd1fe76e21fefadc5819238558c76a6edb1b02 Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Tue, 27 Jan 2026 23:29:22 +0100 Subject: [PATCH 2/5] leios: Defines new metrics, wires in ConsensusJson --- cardano-node/cardano-node.cabal | 1 + .../src/Cardano/Node/TraceConstraints.hs | 11 +++- .../Cardano/Node/Tracing/Tracers/Consensus.hs | 57 ++++++++++++------- .../Tracing/OrphanInstances/Consensus.hs | 24 ++++---- cardano-node/src/Cardano/Tracing/Tracers.hs | 33 +++++------ 5 files changed, 69 insertions(+), 57 deletions(-) diff --git a/cardano-node/cardano-node.cabal b/cardano-node/cardano-node.cabal index 1624a529e08..4040dba52c3 100644 --- a/cardano-node/cardano-node.cabal +++ b/cardano-node/cardano-node.cabal @@ -197,6 +197,7 @@ library , ouroboros-consensus-cardano ^>= 0.25 , ouroboros-consensus-diffusion ^>= 0.23 , ouroboros-consensus-protocol + , ouroboros-consensus-observe , ouroboros-network-api ^>= 0.14.1 , ouroboros-network ^>= 0.21.3 , ouroboros-network-framework ^>= 0.18 diff --git a/cardano-node/src/Cardano/Node/TraceConstraints.hs b/cardano-node/src/Cardano/Node/TraceConstraints.hs index ec4b9f61034..13143aa39bd 100644 --- a/cardano-node/src/Cardano/Node/TraceConstraints.hs +++ b/cardano-node/src/Cardano/Node/TraceConstraints.hs @@ -15,14 +15,17 @@ import Cardano.Node.Queries (ConvertTxId, GetKESInfo (..), HasKESInfo import Cardano.Protocol.Crypto (StandardCrypto) import Cardano.Tracing.HasIssuer (HasIssuer) import Ouroboros.Consensus.Block (BlockProtocol, CannotForge, ForgeStateUpdateError, - GetHeader, HasHeader, Header) + GetHeader, HasHeader, Header, HeaderHash) import Ouroboros.Consensus.HeaderValidation (OtherHeaderEnvelopeError) import Ouroboros.Consensus.Ledger.Abstract (LedgerError) import Ouroboros.Consensus.Ledger.Inspect (LedgerEvent, LedgerUpdate, LedgerWarning) -import Ouroboros.Consensus.Ledger.SupportsMempool (ApplyTxErr, HasTxId, HasTxs (..)) +import Ouroboros.Consensus.Ledger.SupportsMempool (ApplyTxErr, HasTxId, HasTxs (..), + TxMeasure) import Ouroboros.Consensus.Node.NetworkProtocolVersion (HasNetworkProtocolVersion (BlockNodeToClientVersion, BlockNodeToNodeVersion)) import Ouroboros.Consensus.Node.Run (RunNode, SerialiseNodeToNodeConstraints) +import Ouroboros.Consensus.Node.Tracers (ForgedBlock) +import Ouroboros.Consensus.Observe.ConsensusJson (ConsensusJson) import Ouroboros.Consensus.Protocol.Abstract (SelectView, ValidationErr) import Ouroboros.Consensus.Shelley.Ledger.Mempool (GenTx, TxId) import Ouroboros.Network.Block (Serialised) @@ -58,7 +61,6 @@ type TraceConstraints blk = , ToJSON (BlockNodeToClientVersion blk) , ToJSON (BlockNodeToNodeVersion blk) - , LogFormatting (ApplyTxErr blk) , LogFormatting (GenTx blk) , LogFormatting (Header blk) @@ -72,4 +74,7 @@ type TraceConstraints blk = , LogFormatting (ForgeStateUpdateError blk) , LogFormatting (Set (Credential 'Staking)) , LogFormatting (NonEmpty.NonEmpty (KeyHash 'Staking)) + + , ConsensusJson (HeaderHash blk) + , ConsensusJson (TxMeasure blk) ) diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs index 14ccf301a21..78cb9441e9c 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs @@ -40,7 +40,7 @@ import Ouroboros.Consensus.Genesis.Governor (DensityBounds (..), GDDDe import Ouroboros.Consensus.Ledger.Extended (ExtValidationError) import Ouroboros.Consensus.Ledger.Inspect (LedgerEvent (..), LedgerUpdate, LedgerWarning) import Ouroboros.Consensus.Ledger.SupportsMempool (ApplyTxErr, ByteSize32 (..), GenTxId, - HasTxId, LedgerSupportsMempool, txForgetValidated, txId) + HasTxId, LedgerSupportsMempool, txForgetValidated, txId, TxMeasureMetrics (txMeasureMetricTxSizeBytes, txMeasureMetricExUnitsMemory, txMeasureMetricExUnitsSteps, txMeasureMetricRefScriptsSizeBytes), TxLimits (TxMeasure)) import Ouroboros.Consensus.Ledger.SupportsProtocol import Ouroboros.Consensus.Mempool (MempoolSize (..), TraceEventMempool (..)) import Ouroboros.Consensus.MiniProtocol.BlockFetch.Server @@ -82,6 +82,7 @@ import Data.Word (Word32, Word64) import Network.TypedProtocol.Core import LeiosDemoTypes (TraceLeiosKernel, TraceLeiosPeer, traceLeiosKernelToObject, traceLeiosPeerToObject) +import Ouroboros.Consensus.Observe.ConsensusJson (ConsensusJson(toConsensusJson)) instance (LogFormatting adr, Show adr) => LogFormatting (ConnectionId adr) where forMachine _dtal (ConnectionId local' remote) = @@ -1447,7 +1448,10 @@ instance ( tx ~ GenTx blk , Show (TxId (GenTx blk)) , LogFormatting (CannotForge blk) , LogFormatting (ExtValidationError blk) - , LogFormatting (ForgeStateUpdateError blk)) + , LogFormatting (ForgeStateUpdateError blk) + , ConsensusJson (HeaderHash blk) + , ConsensusJson (TxMeasure blk) + ) => LogFormatting (TraceForgeEvent blk) where forMachine _dtal (TraceStartLeadershipCheck slotNo) = mconcat @@ -1530,16 +1534,11 @@ instance ( tx ~ GenTx blk , "mempoolHash" .= String (renderChainHash @blk (renderHeaderHash (Proxy @blk)) mpHash) , "mempoolSlot" .= toJSON (unSlotNo mpSlot) ] - forMachine _dtal (TraceForgedBlock slotNo _ blk _) = + forMachine _dtal (TraceForgedBlock slotNo fb) = mconcat [ "kind" .= String "TraceForgedBlock" , "slot" .= toJSON (unSlotNo slotNo) - , "block" .= String (renderHeaderHash (Proxy @blk) $ blockHash blk) - , "blockNo" .= toJSON (unBlockNo $ blockNo blk) - , "blockPrev" .= String (renderChainHash - @blk - (renderHeaderHash (Proxy @blk)) - $ blockPrevHash blk) + , "forgedBlock" .= toConsensusJson fb ] forMachine _dtal (TraceDidntAdoptBlock slotNo _) = mconcat @@ -1583,10 +1582,6 @@ instance ( tx ~ GenTx blk (blockHash blk) , "blockSize" .= toJSON (getSizeInBytes $ estimateBlockSize (getHeader blk)) ] - forMachine _dtal TraceForgedEndorserBlock = - mconcat - [ "kind" .= String "TraceForgedEndorserBlock" - ] forHuman (TraceStartLeadershipCheck slotNo) = "Checking for leadership in slot " <> showT (unSlotNo slotNo) @@ -1646,7 +1641,7 @@ instance ( tx ~ GenTx blk <> renderChainHash @blk (renderHeaderHash (Proxy @blk)) mpHash <> " ticked to slot " <> showT (unSlotNo mpSlot) - forHuman (TraceForgedBlock slotNo _ _ _) = + forHuman (TraceForgedBlock slotNo _) = "Forged block in slot " <> showT (unSlotNo slotNo) forHuman (TraceDidntAdoptBlock slotNo _) = "Didn't adopt forged block in slot " <> showT (unSlotNo slotNo) @@ -1662,7 +1657,6 @@ instance ( tx ~ GenTx blk "Adoption thread died in slot " <> showT (unSlotNo slotNo) <> ": " <> renderHeaderHash (Proxy @blk) (blockHash blk) - forHuman TraceForgedEndorserBlock = "Forged an Endorser Block" asMetrics (TraceForgeStateUpdateError slot reason) = IntM "Forge.StateUpdateError" (fromIntegral $ unSlotNo slot) : @@ -1705,9 +1699,32 @@ instance ( tx ~ GenTx blk [CounterM "Forge.node-is-leader" Nothing] asMetrics TraceForgeTickedLedgerState {} = [] asMetrics TraceForgingMempoolSnapshot {} = [] - asMetrics (TraceForgedBlock slot _ _ _) = - [IntM "forgedSlotLast" (fromIntegral $ unSlotNo slot), - CounterM "Forge.forged" Nothing] + asMetrics (TraceForgedBlock slot fb) = + [ IntM "forgedSlotLast" (fromIntegral $ unSlotNo slot) + , CounterM "Forge.forged" Nothing + -- NOTE(bladyjoker): New!!! + , CounterM "Forge.ranking-block.total-count" Nothing + + , CounterM "Forge.ranking-block.total-tx-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricTxSizeBytes . fbNewBlockSize $ fb) + , CounterM "Forge.endorser-block.total-tx-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricTxSizeBytes . fbNewEndorserBlockSize $ fb) + , CounterM "Forge.rest-in-mempool.total-tx-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricTxSizeBytes . fbMempoolRestSize $ fb) + + , CounterM "Forge.ranking-block.total-tx-xu-memory" (Just . fromInteger . toInteger . txMeasureMetricExUnitsMemory . fbNewBlockSize $ fb) + , CounterM "Forge.endorser-block.total-tx-xu-memory" (Just . fromInteger . toInteger . txMeasureMetricExUnitsMemory . fbNewEndorserBlockSize $ fb) + , CounterM "Forge.rest-in-mempool.total-tx-xu-memory" (Just . fromInteger . toInteger . txMeasureMetricExUnitsMemory . fbMempoolRestSize $ fb) + + , CounterM "Forge.ranking-block.total-tx-xu-time" (Just . fromInteger . toInteger . txMeasureMetricExUnitsSteps . fbNewBlockSize $ fb) + , CounterM "Forge.endorser-block.total-tx-xu-time" (Just . fromInteger . toInteger . txMeasureMetricExUnitsSteps . fbNewEndorserBlockSize $ fb) + , CounterM "Forge.rest-in-mempool.total-tx-xu-time" (Just . fromInteger . toInteger . txMeasureMetricExUnitsSteps . fbMempoolRestSize $ fb) + + , CounterM "Forge.ranking-block.total-tx-ref-script-size-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricRefScriptsSizeBytes . fbNewBlockSize $ fb) + , CounterM "Forge.endorser-block.total-tx-ref-script-size-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricRefScriptsSizeBytes . fbNewEndorserBlockSize $ fb) + , CounterM "Forge.rest-in-mempool.total-tx-ref-script-size-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricRefScriptsSizeBytes . fbMempoolRestSize $ fb) + ] ++ case fbMaybeNewEndorserBlock fb of + Nothing -> [] + Just _ -> [ + CounterM "Forge.endorser-block.total-count" Nothing + ] asMetrics (TraceDidntAdoptBlock _slot _) = [CounterM "Forge.didnt-adopt" Nothing] asMetrics (TraceForgedInvalidBlock _slot _ _) = @@ -1716,8 +1733,6 @@ instance ( tx ~ GenTx blk [CounterM "Forge.adopted" Nothing] asMetrics (TraceAdoptionThreadDied _slot _) = [CounterM "Forge.adoption-thread-died" Nothing] - asMetrics TraceForgedEndorserBlock = - [] instance MetaTrace (TraceForgeEvent blk) where namespaceFor TraceStartLeadershipCheck {} = @@ -1758,8 +1773,6 @@ instance MetaTrace (TraceForgeEvent blk) where Namespace [] ["AdoptedBlock"] namespaceFor TraceAdoptionThreadDied {} = Namespace [] ["AdoptionThreadDied"] - namespaceFor TraceForgedEndorserBlock {} = - Namespace [] ["ForgedEndorserBlock"] severityFor (Namespace _ ["StartLeadershipCheck"]) _ = Just Info severityFor (Namespace _ ["SlotIsImmutable"]) _ = Just Error diff --git a/cardano-node/src/Cardano/Tracing/OrphanInstances/Consensus.hs b/cardano-node/src/Cardano/Tracing/OrphanInstances/Consensus.hs index e1bb2b3cb56..f5231b663a9 100644 --- a/cardano-node/src/Cardano/Tracing/OrphanInstances/Consensus.hs +++ b/cardano-node/src/Cardano/Tracing/OrphanInstances/Consensus.hs @@ -31,8 +31,8 @@ import Cardano.Tracing.Render (renderChainHash, renderChunkNo, renderH renderWithOrigin) import Ouroboros.Consensus.Block (BlockProtocol, BlockSupportsProtocol, CannotForge, ConvertRawHash (..), ForgeStateUpdateError, GenesisWindow (..), GetHeader (..), - Header, RealPoint, blockNo, blockPoint, blockPrevHash, getHeader, pointHash, - realPointHash, realPointSlot, withOriginToMaybe) + Header, RealPoint, blockPoint, getHeader, pointHash, realPointHash, + realPointSlot, withOriginToMaybe) import Ouroboros.Consensus.Block.SupportsSanityCheck import Ouroboros.Consensus.Genesis.Governor (DensityBounds (..), GDDDebugInfo (..), TraceGDDEvent (..)) @@ -58,6 +58,7 @@ import Ouroboros.Consensus.Node.GSM import Ouroboros.Consensus.Node.Run (RunNode, estimateBlockSize) import Ouroboros.Consensus.Node.Tracers (TraceForgeEvent (..)) import qualified Ouroboros.Consensus.Node.Tracers as Consensus +import Ouroboros.Consensus.Observe.ConsensusJson (ConsensusJson (toConsensusJson)) import Ouroboros.Consensus.Protocol.Abstract import qualified Ouroboros.Consensus.Protocol.BFT as BFT import qualified Ouroboros.Consensus.Protocol.PBFT as PBFT @@ -323,7 +324,6 @@ instance HasSeverityAnnotation (TraceForgeEvent blk) where getSeverityAnnotation TraceForgedInvalidBlock {} = Error getSeverityAnnotation TraceAdoptedBlock {} = Info getSeverityAnnotation TraceAdoptionThreadDied {} = Error - getSeverityAnnotation TraceForgedEndorserBlock {} = Info instance HasPrivacyAnnotation (TraceLocalTxSubmissionServerEvent blk) @@ -403,6 +403,7 @@ instance ( tx ~ GenTx blk , ToObject (ValidationErr (BlockProtocol blk)) , ToObject (CannotForge blk) , ToObject (ForgeStateUpdateError blk) + , ConsensusJson (Consensus.ForgedBlock blk) , LedgerSupportsMempool blk) => Transformable Text IO (TraceForgeEvent blk) where trTransformer = trStructuredText @@ -477,7 +478,7 @@ instance ( tx ~ GenTx blk <> renderChainHash (Text.decodeLatin1 . toRawHash (Proxy @blk)) mpHash <> " ticked to slot " <> showT (unSlotNo mpSlot) - TraceForgedBlock slotNo _ _ _ -> const $ + TraceForgedBlock slotNo _forgedBlock -> const $ "Forged block in slot " <> showT (unSlotNo slotNo) TraceDidntAdoptBlock slotNo _ -> const $ "Didn't adopt forged block in slot " <> showT (unSlotNo slotNo) @@ -494,7 +495,6 @@ instance ( tx ~ GenTx blk "Adoption Thread died in slot " <> showT (unSlotNo slotNo) <> ": " <> renderHeaderHash (Proxy @blk) (blockHash blk) - TraceForgedEndorserBlock -> const "Forged Endorser Block" -- TODO(bladyjoker) instance Transformable Text IO (TraceLocalTxSubmissionServerEvent blk) where @@ -1618,7 +1618,9 @@ instance ( RunNode blk , ToObject (OtherHeaderEnvelopeError blk) , ToObject (ValidationErr (BlockProtocol blk)) , ToObject (CannotForge blk) - , ToObject (ForgeStateUpdateError blk)) + , ToObject (ForgeStateUpdateError blk) + , ConsensusJson (Consensus.ForgedBlock blk) + ) => ToObject (TraceForgeEvent blk) where toObject _verb (TraceStartLeadershipCheck slotNo) = mconcat @@ -1701,13 +1703,11 @@ instance ( RunNode blk , "mempoolHash" .= String (renderChainHash @blk (renderHeaderHash (Proxy @blk)) mpHash) , "mempoolSlot" .= toJSON (unSlotNo mpSlot) ] - toObject _verb (TraceForgedBlock slotNo _ blk _) = + toObject _verb (TraceForgedBlock slotNo forgedBlock) = mconcat [ "kind" .= String "TraceForgedBlock" , "slot" .= toJSON (unSlotNo slotNo) - , "block" .= String (renderHeaderHash (Proxy @blk) $ blockHash blk) - , "blockNo" .= toJSON (unBlockNo $ blockNo blk) - , "blockPrev" .= String (renderChainHash @blk (renderHeaderHash (Proxy @blk)) $ blockPrevHash blk) + , "forgedBlock" .= toConsensusJson forgedBlock ] toObject _verb (TraceDidntAdoptBlock slotNo _) = mconcat @@ -1751,10 +1751,6 @@ instance ( RunNode blk (blockHash blk) , "blockSize" .= toJSON (getSizeInBytes $ estimateBlockSize (getHeader blk)) ] - toObject _verb TraceForgedEndorserBlock = - mconcat - [ "kind" .= String "TraceForgedEndorserBlock" - ] instance ToObject (TraceLocalTxSubmissionServerEvent blk) where diff --git a/cardano-node/src/Cardano/Tracing/Tracers.hs b/cardano-node/src/Cardano/Tracing/Tracers.hs index f21ab39ab6b..0bc20dd2cc9 100644 --- a/cardano-node/src/Cardano/Tracing/Tracers.hs +++ b/cardano-node/src/Cardano/Tracing/Tracers.hs @@ -43,6 +43,7 @@ import Cardano.BM.Data.Transformers import Cardano.BM.Internal.ElidingTracer import Cardano.BM.Trace (traceNamedObject) import Cardano.BM.Tracing +import Cardano.Network.PeerSelection.PeerTrustable (PeerTrustable) import Cardano.Node.Configuration.Logging import Cardano.Node.Protocol.Byron () import Cardano.Node.Protocol.Shelley () @@ -61,6 +62,9 @@ import Cardano.Tracing.OrphanInstances.Network () import Cardano.Tracing.Render (renderChainHash, renderHeaderHash) import Cardano.Tracing.Shutdown () import Cardano.Tracing.Startup () +import qualified Ouroboros.Cardano.Network.PeerSelection.Governor.PeerSelectionState as Cardano +import qualified Ouroboros.Cardano.Network.PeerSelection.Governor.Types as Cardano +import qualified Ouroboros.Cardano.Network.PublicRootPeers as Cardano.PublicRootPeers import Ouroboros.Consensus.Block (BlockConfig, BlockProtocol, CannotForge, ConvertRawHash (..), ForgeStateInfo, ForgeStateUpdateError, Header, realPointHash, realPointSlot) @@ -71,8 +75,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, Query) -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 @@ -82,17 +86,12 @@ import qualified Ouroboros.Consensus.Network.NodeToNode as NodeToNode import Ouroboros.Consensus.Node (NetworkP2PMode (..)) import qualified Ouroboros.Consensus.Node.Run as Consensus (RunNode) import qualified Ouroboros.Consensus.Node.Tracers as Consensus +import Ouroboros.Consensus.Observe.ConsensusJson (ConsensusJson) import Ouroboros.Consensus.Protocol.Abstract (SelectView, ValidationErr) import qualified Ouroboros.Consensus.Protocol.Ledger.HotKey as HotKey import qualified Ouroboros.Consensus.Storage.ChainDB as ChainDB import qualified Ouroboros.Consensus.Storage.LedgerDB as LedgerDB import Ouroboros.Consensus.Util.Enclose - -import Cardano.Network.PeerSelection.PeerTrustable (PeerTrustable) -import qualified Ouroboros.Cardano.Network.PeerSelection.Governor.PeerSelectionState as Cardano -import qualified Ouroboros.Cardano.Network.PeerSelection.Governor.Types as Cardano -import qualified Ouroboros.Cardano.Network.PublicRootPeers as Cardano.PublicRootPeers - import qualified Ouroboros.Network.AnchoredFragment as AF import Ouroboros.Network.Block (BlockNo (..), ChainUpdate (..), HasHeader (..), Point, StandardHash, blockNo, pointSlot, unBlockNo) @@ -113,8 +112,8 @@ import Ouroboros.Network.InboundGovernor.State as InboundGovernor import Ouroboros.Network.NodeToClient (LocalAddress) import Ouroboros.Network.NodeToNode (RemoteAddress) import Ouroboros.Network.PeerSelection.Churn (ChurnCounters (..)) -import Ouroboros.Network.PeerSelection.Governor ( - PeerSelectionCounters, PeerSelectionView (..)) +import Ouroboros.Network.PeerSelection.Governor (PeerSelectionCounters, + PeerSelectionView (..)) import qualified Ouroboros.Network.PeerSelection.Governor as Governor import Ouroboros.Network.Point (fromWithOrigin) import Ouroboros.Network.Protocol.LocalStateQuery.Type (LocalStateQuery, ShowQuery) @@ -351,7 +350,8 @@ instance (StandardHash header, Eq peer) => ElidingTracer mkTracers :: forall blk p2p . ( Consensus.RunNode blk - , TraceConstraints blk + , TraceConstraints blk, + ConsensusJson (Consensus.ForgedBlock blk) ) => BlockConfig blk -> TraceOptions @@ -786,7 +786,7 @@ mkConsensusTracers , ToObject (ForgeStateUpdateError blk) , Consensus.RunNode blk , HasKESMetricsData blk - , HasKESInfo blk + , HasKESInfo blk, ConsensusJson (Consensus.ForgedBlock blk) ) => Maybe EKGDirect -> TraceSelection @@ -1127,7 +1127,7 @@ teeForge :: , ToObject (LedgerErr (LedgerState blk)) , ToObject (OtherHeaderEnvelopeError blk) , ToObject (Ouroboros.Consensus.Protocol.Abstract.ValidationErr (BlockProtocol blk)) - , ToObject (ForgeStateUpdateError blk) + , ToObject (ForgeStateUpdateError blk), ConsensusJson (Consensus.ForgedBlock blk) ) => ForgeTracers -> TracingVerbosity @@ -1156,7 +1156,6 @@ teeForge ft tverb tr = Tracer $ Consensus.TraceForgedInvalidBlock{} -> teeForge' (ftForgedInvalid ft) Consensus.TraceAdoptedBlock{} -> teeForge' (ftAdopted ft) Consensus.TraceAdoptionThreadDied{} -> teeForge' (ftTraceAdoptionThreadDied ft) - Consensus.TraceForgedEndorserBlock{} -> teeForge' (ftForged ft) case event of Consensus.TraceStartLeadershipCheck _slot -> pure () _ -> traceWith (toLogObject' tverb tr) ev @@ -1197,7 +1196,7 @@ teeForge' tr = LogValue "forgeTickedLedgerState" $ PureI $ fromIntegral $ unSlotNo slot Consensus.TraceForgingMempoolSnapshot slot _prevPt _mpHash _mpSlotNo -> LogValue "forgingMempoolSnapshot" $ PureI $ fromIntegral $ unSlotNo slot - Consensus.TraceForgedBlock slot _ _ _ -> + Consensus.TraceForgedBlock slot _forgedBlock -> LogValue "forgedSlotLast" $ PureI $ fromIntegral $ unSlotNo slot Consensus.TraceDidntAdoptBlock slot _ -> LogValue "notAdoptedSlotLast" $ PureI $ fromIntegral $ unSlotNo slot @@ -1207,8 +1206,6 @@ teeForge' tr = LogValue "adoptedSlotLast" $ PureI $ fromIntegral $ unSlotNo slot Consensus.TraceAdoptionThreadDied slot _ -> LogValue "adoptionThreadDied" $ PureI $ fromIntegral $ unSlotNo slot - Consensus.TraceForgedEndorserBlock -> - LogValue "forgedEndorserBlock" $ PureI 0 forgeTracer :: forall blk. @@ -1218,7 +1215,7 @@ forgeTracer , ToObject (OtherHeaderEnvelopeError blk) , ToObject (Ouroboros.Consensus.Protocol.Abstract.ValidationErr (BlockProtocol blk)) , ToObject (ForgeStateUpdateError blk) - , HasKESInfo blk + , HasKESInfo blk, ConsensusJson (Consensus.ForgedBlock blk) ) => TracingVerbosity -> Trace IO Text From 16b828c95e2b53e3eb25546db2789f9f3ba88c70 Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Wed, 28 Jan 2026 10:32:53 +0100 Subject: [PATCH 3/5] leios: Add transaction counts to metrics --- .../Cardano/Node/Tracing/Tracers/Consensus.hs | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs index 78cb9441e9c..0246155ee61 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs @@ -83,6 +83,7 @@ import Network.TypedProtocol.Core import LeiosDemoTypes (TraceLeiosKernel, TraceLeiosPeer, traceLeiosKernelToObject, traceLeiosPeerToObject) import Ouroboros.Consensus.Observe.ConsensusJson (ConsensusJson(toConsensusJson)) +import Ouroboros.Consensus.Mempool.TxSeq (TxSeqMeasure(mCount, mSize)) instance (LogFormatting adr, Show adr) => LogFormatting (ConnectionId adr) where forMachine _dtal (ConnectionId local' remote) = @@ -1705,21 +1706,25 @@ instance ( tx ~ GenTx blk -- NOTE(bladyjoker): New!!! , CounterM "Forge.ranking-block.total-count" Nothing - , CounterM "Forge.ranking-block.total-tx-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricTxSizeBytes . fbNewBlockSize $ fb) - , CounterM "Forge.endorser-block.total-tx-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricTxSizeBytes . fbNewEndorserBlockSize $ fb) - , CounterM "Forge.rest-in-mempool.total-tx-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricTxSizeBytes . fbMempoolRestSize $ fb) + , CounterM "Forge.ranking-block.total-tx-count" (Just . fromInteger . toInteger . mCount . fbNewBlockSize $ fb) + , CounterM "Forge.endorser-block.total-tx-count" (Just . fromInteger . toInteger . mCount . fbNewEndorserBlockSize $ fb) + , CounterM "Forge.rest-in-mempool.total-tx-count" (Just . fromInteger . toInteger . mCount . fbMempoolRestSize $ fb) - , CounterM "Forge.ranking-block.total-tx-xu-memory" (Just . fromInteger . toInteger . txMeasureMetricExUnitsMemory . fbNewBlockSize $ fb) - , CounterM "Forge.endorser-block.total-tx-xu-memory" (Just . fromInteger . toInteger . txMeasureMetricExUnitsMemory . fbNewEndorserBlockSize $ fb) - , CounterM "Forge.rest-in-mempool.total-tx-xu-memory" (Just . fromInteger . toInteger . txMeasureMetricExUnitsMemory . fbMempoolRestSize $ fb) + , CounterM "Forge.ranking-block.total-tx-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricTxSizeBytes . mSize . fbNewBlockSize $ fb) + , CounterM "Forge.endorser-block.total-tx-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricTxSizeBytes . mSize . fbNewEndorserBlockSize $ fb) + , CounterM "Forge.rest-in-mempool.total-tx-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricTxSizeBytes . mSize . fbMempoolRestSize $ fb) - , CounterM "Forge.ranking-block.total-tx-xu-time" (Just . fromInteger . toInteger . txMeasureMetricExUnitsSteps . fbNewBlockSize $ fb) - , CounterM "Forge.endorser-block.total-tx-xu-time" (Just . fromInteger . toInteger . txMeasureMetricExUnitsSteps . fbNewEndorserBlockSize $ fb) - , CounterM "Forge.rest-in-mempool.total-tx-xu-time" (Just . fromInteger . toInteger . txMeasureMetricExUnitsSteps . fbMempoolRestSize $ fb) + , CounterM "Forge.ranking-block.total-tx-xu-memory" (Just . fromInteger . toInteger . txMeasureMetricExUnitsMemory . mSize . fbNewBlockSize $ fb) + , CounterM "Forge.endorser-block.total-tx-xu-memory" (Just . fromInteger . toInteger . txMeasureMetricExUnitsMemory . mSize . fbNewEndorserBlockSize $ fb) + , CounterM "Forge.rest-in-mempool.total-tx-xu-memory" (Just . fromInteger . toInteger . txMeasureMetricExUnitsMemory . mSize . fbMempoolRestSize $ fb) - , CounterM "Forge.ranking-block.total-tx-ref-script-size-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricRefScriptsSizeBytes . fbNewBlockSize $ fb) - , CounterM "Forge.endorser-block.total-tx-ref-script-size-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricRefScriptsSizeBytes . fbNewEndorserBlockSize $ fb) - , CounterM "Forge.rest-in-mempool.total-tx-ref-script-size-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricRefScriptsSizeBytes . fbMempoolRestSize $ fb) + , CounterM "Forge.ranking-block.total-tx-xu-time" (Just . fromInteger . toInteger . txMeasureMetricExUnitsSteps . mSize . fbNewBlockSize $ fb) + , CounterM "Forge.endorser-block.total-tx-xu-time" (Just . fromInteger . toInteger . txMeasureMetricExUnitsSteps . mSize . fbNewEndorserBlockSize $ fb) + , CounterM "Forge.rest-in-mempool.total-tx-xu-time" (Just . fromInteger . toInteger . txMeasureMetricExUnitsSteps . mSize . fbMempoolRestSize $ fb) + + , CounterM "Forge.ranking-block.total-tx-ref-script-size-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricRefScriptsSizeBytes . mSize . fbNewBlockSize $ fb) + , CounterM "Forge.endorser-block.total-tx-ref-script-size-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricRefScriptsSizeBytes . mSize . fbNewEndorserBlockSize $ fb) + , CounterM "Forge.rest-in-mempool.total-tx-ref-script-size-bytes" (Just . fromInteger . toInteger . unByteSize32 . txMeasureMetricRefScriptsSizeBytes . mSize . fbMempoolRestSize $ fb) ] ++ case fbMaybeNewEndorserBlock fb of Nothing -> [] Just _ -> [ From 70911d171739b486daa0f98a467583b93975dced Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Wed, 28 Jan 2026 13:50:13 +0100 Subject: [PATCH 4/5] leios: Update ouroboros-consensus and ouroboros-network SRPs --- cabal.project | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/cabal.project b/cabal.project index b8a7399b94a..809819c5715 100644 --- a/cabal.project +++ b/cabal.project @@ -101,19 +101,23 @@ constraints: source-repository-package type: git location: https://github.com/IntersectMBO/ouroboros-consensus - tag: a571776defab2aff8e1e0a9e62646494a1a8af08 - --sha256: sha256-eucib6kUGFbiIM09nNHC+XR+gUSjiAtpKxcuKO/Kl1Q= + tag: c4318c0d8d0111ed0e4b70031a802a324d68ce12 + --sha256: sha256-K/q+sxmDrCaNEjAicoDYZwLc8gSw+Kw4mO0qbM8MujU= subdir: ouroboros-consensus ouroboros-consensus-cardano + ouroboros-consensus-protocol ouroboros-consensus-diffusion + ouroboros-consensus-observe + sop-extras + strict-sop-core --- Points to ouroboros-network/nfrisby/leios-202511-demo +-- Points to ouroboros-network/leios-prototype source-repository-package type: git location: https://github.com/IntersectMBO/ouroboros-network.git - tag: 479f0d0d82413162c8444b912394dd74c052831f - --sha256: sha256-Up+Zh3+nHuwlHmpXgH0nNIvQ/yHm/Hxb9ZYQHibrDLc= + tag: fb5f16f48af84950db0c2ecefd8cbda532c77d1a + --sha256: sha256-0LWD1zwOzhdcPJtBuw7pRDVcBd9CKJOFjm9o4BvsIMM= subdir: cardano-ping monoidal-synchronisation From 7ef9ef7134b563d00ed60b736d1359066f30f95b Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Wed, 28 Jan 2026 14:35:08 +0100 Subject: [PATCH 5/5] leios: Update ouroboros-consensus SRP --- cabal.project | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cabal.project b/cabal.project index 809819c5715..b8cb5e185a9 100644 --- a/cabal.project +++ b/cabal.project @@ -101,7 +101,7 @@ constraints: source-repository-package type: git location: https://github.com/IntersectMBO/ouroboros-consensus - tag: c4318c0d8d0111ed0e4b70031a802a324d68ce12 + tag: 86cc78704115007dc6c75185ae83decaa8e89348 --sha256: sha256-K/q+sxmDrCaNEjAicoDYZwLc8gSw+Kw4mO0qbM8MujU= subdir: ouroboros-consensus