Skip to content

Commit 331fba0

Browse files
committed
Network tracing instances for fetch decisions
* Provide instances for `FetchDecisionEvent` for new tracing system. * Provide `ToJSON` instances for `FetchDecision` (via `FetchDecisionToJSON` newtype wrapper), `TraceDecisionEvent`, `Point` which can be used by both new and old tracing system. * Provide `Verbose` newtype wrapper wich `ToJSON` instances provide more verbose output.
1 parent 86d8666 commit 331fba0

File tree

3 files changed

+103
-51
lines changed

3 files changed

+103
-51
lines changed

cardano-node/src/Cardano/Node/Tracing/Tracers/Consensus.hs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import Cardano.Node.Tracing.Formatting ()
3232
import Cardano.Node.Tracing.Render
3333
import Cardano.Node.Tracing.Tracers.ConsensusStartupException ()
3434
import Cardano.Node.Tracing.Tracers.StartLeadershipCheck
35+
import Cardano.Tracing.OrphanInstances.Network (Verbose (..))
3536
import Cardano.Protocol.TPraos.OCert (KESPeriod (..))
3637
import Cardano.Slotting.Slot (WithOrigin (..))
3738
import Ouroboros.Consensus.Block
@@ -65,7 +66,7 @@ import Ouroboros.Network.Block hiding (blockPrevHash)
6566
import Ouroboros.Network.BlockFetch.ClientState (TraceLabelPeer (..))
6667
import qualified Ouroboros.Network.BlockFetch.ClientState as BlockFetch
6768
import Ouroboros.Network.BlockFetch.Decision
68-
import Ouroboros.Network.BlockFetch.Decision.Trace
69+
import Ouroboros.Network.BlockFetch.Decision.Trace (TraceDecisionEvent (..))
6970
import Ouroboros.Network.ConnectionId (ConnectionId (..))
7071
import Ouroboros.Network.DeltaQ (GSV (..), PeerGSV (..))
7172
import Ouroboros.Network.KeepAlive (TraceKeepAliveClient (..))
@@ -699,7 +700,6 @@ calculateBlockFetchClientMetrics cm _lc _ = pure cm
699700
-- BlockFetchDecision Tracer
700701
--------------------------------------------------------------------------------
701702

702-
-- TODO @ouroboros-network
703703
instance MetaTrace (TraceDecisionEvent peer (Header blk)) where
704704
namespaceFor PeersFetch{} = Namespace [] ["PeersFetch"]
705705
namespaceFor PeerStarvedUs{} = Namespace [] ["PeerStarvedUs"]
@@ -709,25 +709,28 @@ instance MetaTrace (TraceDecisionEvent peer (Header blk)) where
709709
severityFor _ _ = Nothing
710710

711711
documentFor (Namespace [] ["PeersFetch"]) =
712-
Just "TODO: @ouroboros-network"
712+
Just "list of block-fetch decisions"
713713
documentFor (Namespace [] ["PeerStarvedUs"]) =
714-
Just "TODO: @ouroboros-network"
714+
Just "current peer starved us, the node will switch to a different peer"
715715
documentFor _ = Nothing
716716

717717
allNamespaces =
718718
[ Namespace [] ["PeersFetch"], Namespace [] ["PeerStarvedUs"] ]
719719

720-
-- TODO @ouroboros-network
721-
instance LogFormatting (TraceDecisionEvent peer (Header blk)) where
722-
forHuman (PeersFetch _traces) =
723-
"TODO: @ouroboros-network"
724-
forHuman (PeerStarvedUs _traces) =
725-
"TODO: @ouroboros-network"
726-
727-
forMachine _dtal (PeersFetch _traces) =
728-
mconcat [ "kind" .= String "TODO: @ouroboros-network" ]
729-
forMachine _dtal (PeerStarvedUs _traces) =
730-
mconcat [ "kind" .= String "TODO: @ouroboros-network" ]
720+
instance (Show peer, ToJSON peer, ConvertRawHash (Header blk), HasHeader blk)
721+
=> LogFormatting (TraceDecisionEvent peer (Header blk)) where
722+
forHuman = Text.pack . show
723+
724+
forMachine dtal (PeersFetch xs) =
725+
mconcat [ "kind" .= String "PeerFetch"
726+
, "decisions" .= if dtal >= DMaximum
727+
then toJSON (Verbose <$> xs)
728+
else toJSON xs
729+
]
730+
forMachine _dtal (PeerStarvedUs peer) =
731+
mconcat [ "kind" .= String "PeerStarvedUs"
732+
, "peer" .= toJSON peer
733+
]
731734

732735
instance (LogFormatting peer, Show peer) =>
733736
LogFormatting [TraceLabelPeer peer (FetchDecision [Point header])] where

cardano-node/src/Cardano/Tracing/OrphanInstances/Network.hs

Lines changed: 77 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
{-# OPTIONS_GHC -Wno-name-shadowing #-}
2323
#endif
2424

25-
module Cardano.Tracing.OrphanInstances.Network () where
25+
module Cardano.Tracing.OrphanInstances.Network
26+
( Verbose (..)
27+
, FetchDecisionToJSON (..)
28+
) where
2629

2730
import Cardano.Node.Queries (ConvertTxId)
2831
import Cardano.Tracing.OrphanInstances.Common
@@ -630,7 +633,7 @@ instance HasTextFormatter NtN.AcceptConnectionsPolicyTrace where
630633
formatText a _ = pack (show a)
631634

632635

633-
instance (StandardHash header, Show peer, ToObject peer)
636+
instance (StandardHash header, Show peer, ToJSON peer, ConvertRawHash header)
634637
=> Transformable Text IO [TraceLabelPeer peer (FetchDecision [Point header])] where
635638
trTransformer = trStructuredText
636639
instance (StandardHash header, Show peer)
@@ -644,7 +647,7 @@ instance (Show header, StandardHash header, Show peer)
644647
=> HasTextFormatter (TraceLabelPeer peer (TraceFetchClientState header)) where
645648
formatText a _ = pack (show a)
646649

647-
instance (StandardHash header, Show peer, ToObject peer)
650+
instance (StandardHash header, Show peer, ToJSON peer, ConvertRawHash header)
648651
=> Transformable Text IO (BlockFetch.TraceDecisionEvent peer header) where
649652
trTransformer = trStructuredText
650653
instance (StandardHash header, Show peer)
@@ -1129,16 +1132,6 @@ instance Aeson.ToJSON ConnectionManagerCounters where
11291132
, "outbound" .= outboundConns
11301133
]
11311134

1132-
instance ToObject (FetchDecision [Point header]) where
1133-
toObject _verb (Left decline) =
1134-
mconcat [ "kind" .= String "FetchDecision declined"
1135-
, "declined" .= String (pack (show decline))
1136-
]
1137-
toObject _verb (Right results) =
1138-
mconcat [ "kind" .= String "FetchDecision results"
1139-
, "length" .= String (pack $ show $ length results)
1140-
]
1141-
11421135
-- TODO: use 'ToJSON' constraints
11431136
instance (Show ntnAddr, Show ntcAddr) => ToObject (ND.DiffusionTracer ntnAddr ntcAddr) where
11441137
toObject _verb (ND.RunServer sockAddr) = mconcat
@@ -1244,17 +1237,45 @@ instance ToObject NtN.AcceptConnectionsPolicyTrace where
12441237
]
12451238

12461239

1240+
instance ConvertRawHash header
1241+
=> ToJSON (Point header) where
1242+
toJSON GenesisPoint = String "GenesisPoint"
1243+
toJSON (BlockPoint (SlotNo slotNo) hash) =
1244+
-- it is unlikely that there will be two short hashes in the same slot
1245+
String $ renderHeaderHashForVerbosity
1246+
(Proxy @header)
1247+
MinimalVerbosity
1248+
hash
1249+
<> "@"
1250+
<> pack (show slotNo)
1251+
1252+
1253+
newtype Verbose a = Verbose a
1254+
1255+
instance ConvertRawHash header
1256+
=> ToJSON (Verbose (Point header)) where
1257+
toJSON (Verbose GenesisPoint) = String "GenesisPoint"
1258+
toJSON (Verbose (BlockPoint (SlotNo slotNo) hash)) =
1259+
-- it is unlikely that there will be two short hashes in the same slot
1260+
String $ renderHeaderHashForVerbosity
1261+
(Proxy @header)
1262+
MaximalVerbosity
1263+
hash
1264+
<> "@"
1265+
<> pack (show slotNo)
1266+
1267+
12471268
instance ConvertRawHash blk
12481269
=> ToObject (Point blk) where
12491270
toObject _verb GenesisPoint =
1250-
mconcat
1251-
[ "kind" .= String "GenesisPoint" ]
1252-
toObject verb (BlockPoint slot h) =
1253-
mconcat
1254-
[ "kind" .= String "BlockPoint"
1255-
, "slot" .= toJSON (unSlotNo slot)
1256-
, "headerHash" .= renderHeaderHashForVerbosity (Proxy @blk) verb h
1257-
]
1271+
mconcat [ "point" .= String "GenesisPoint" ]
1272+
toObject verb point@BlockPoint{} =
1273+
mconcat [ "point" .=
1274+
case verb of
1275+
MaximalVerbosity
1276+
-> toJSON (Verbose point)
1277+
_ -> toJSON point
1278+
]
12581279

12591280

12601281
instance ToObject SlotNo where
@@ -1330,26 +1351,51 @@ instance (HasHeader header, ConvertRawHash header)
13301351
, "outstanding" .= outstanding
13311352
]
13321353

1333-
1334-
instance (ToObject peer)
1354+
instance (ToJSON peer, ConvertRawHash header)
13351355
=> ToObject [TraceLabelPeer peer (FetchDecision [Point header])] where
13361356
toObject MinimalVerbosity _ = mempty
13371357
toObject _ [] = mempty
13381358
toObject _ xs = mconcat
1339-
[ "kind" .= String "PeersFetch"
1340-
, "peers" .= toJSON
1341-
(foldl' (\acc x -> toObject MaximalVerbosity x : acc) [] xs) ]
1359+
[ "kind" .= String "FetchDecisions"
1360+
, "decisions" .= toJSON xs
1361+
]
13421362

13431363
instance (ToObject peer, ToObject a) => ToObject (TraceLabelPeer peer a) where
13441364
toObject verb (TraceLabelPeer peerid a) =
13451365
mconcat [ "peer" .= toObject verb peerid ] <> toObject verb a
13461366

1347-
instance ToObject peer
1367+
instance (ToJSON peer, ToJSON point)
1368+
=> ToJSON (TraceLabelPeer peer (FetchDecision [point])) where
1369+
toJSON (TraceLabelPeer peer decision) =
1370+
Aeson.object
1371+
[ "peer" .= toJSON peer
1372+
, "decision" .= toJSON (FetchDecisionToJSON decision)
1373+
]
1374+
1375+
instance (ToJSON peer, ToJSON (Verbose point))
1376+
=> ToJSON (Verbose (TraceLabelPeer peer (FetchDecision [point]))) where
1377+
toJSON (Verbose (TraceLabelPeer peer decision)) =
1378+
Aeson.object
1379+
[ "peer" .= toJSON peer
1380+
, "decision" .= toJSON (FetchDecisionToJSON $ map Verbose <$> decision)
1381+
]
1382+
1383+
newtype FetchDecisionToJSON point =
1384+
FetchDecisionToJSON (FetchDecision [point])
1385+
1386+
instance ToJSON point
1387+
=> ToJSON (FetchDecisionToJSON point) where
1388+
toJSON (FetchDecisionToJSON (Left decline)) =
1389+
Aeson.object [ "declined" .= String (pack . show $ decline) ]
1390+
toJSON (FetchDecisionToJSON (Right points)) =
1391+
toJSON points
1392+
1393+
instance (ToJSON peer, ConvertRawHash header)
13481394
=> ToObject (BlockFetch.TraceDecisionEvent peer header) where
1349-
toObject verb (BlockFetch.PeersFetch as) = toObject verb as
1350-
toObject verb (BlockFetch.PeerStarvedUs peer) = mconcat
1351-
[ "kind" .= String "PeersStarvedUs"
1352-
, "peer" .= toObject verb peer
1395+
toObject verb (BlockFetch.PeersFetch as) = toObject verb as
1396+
toObject _verb (BlockFetch.PeerStarvedUs peer) = mconcat
1397+
[ "kind" .= String "PeerStarvedUs"
1398+
, "peer" .= toJSON peer
13531399
]
13541400

13551401
instance ToObject (AnyMessage ps)

cardano-node/src/Cardano/Tracing/Tracers.hs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,8 @@ mkConsensusTracers
725725
:: forall blk peer localPeer.
726726
( Show peer
727727
, Eq peer
728+
, ToObject peer
729+
, ToJSON peer
728730
, LedgerQueries blk
729731
, ToJSON (GenTxId blk)
730732
, ToObject (ApplyTxErr blk)
@@ -734,7 +736,6 @@ mkConsensusTracers
734736
, ToObject (OtherHeaderEnvelopeError blk)
735737
, ToObject (ValidationErr (BlockProtocol blk))
736738
, ToObject (ForgeStateUpdateError blk)
737-
, ToObject peer
738739
, Consensus.RunNode blk
739740
, HasKESMetricsData blk
740741
, HasKESInfo blk
@@ -1459,9 +1460,10 @@ nodeToNodeTracers' trSel verb tr =
14591460
-- TODO @ouroboros-network
14601461
teeTraceBlockFetchDecision
14611462
:: ( Eq peer
1462-
, HasHeader blk
14631463
, Show peer
1464-
, ToObject peer
1464+
, ToJSON peer
1465+
, HasHeader blk
1466+
, ConvertRawHash blk
14651467
)
14661468
=> TracingVerbosity
14671469
-> MVar (Maybe (WithSeverity [TraceLabelPeer peer (FetchDecision [Point (Header blk)])]),Integer)
@@ -1489,9 +1491,10 @@ teeTraceBlockFetchDecision' tr =
14891491

14901492
teeTraceBlockFetchDecisionElide
14911493
:: ( Eq peer
1492-
, HasHeader blk
14931494
, Show peer
1494-
, ToObject peer
1495+
, ToJSON peer
1496+
, HasHeader blk
1497+
, ConvertRawHash blk
14951498
)
14961499
=> TracingVerbosity
14971500
-> MVar (Maybe (WithSeverity [TraceLabelPeer peer (FetchDecision [Point (Header blk)])]),Integer)

0 commit comments

Comments
 (0)