Skip to content

Commit

Permalink
connection-manager: dump state on SIGUSR1
Browse files Browse the repository at this point in the history
  • Loading branch information
coot committed May 25, 2021
1 parent a21721a commit 1eec1c1
Showing 1 changed file with 86 additions and 9 deletions.
95 changes: 86 additions & 9 deletions cardano-node/src/Cardano/Tracing/OrphanInstances/Network.hs
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,18 @@ import Prelude (String, show)

import Control.Monad.Class.MonadTime (DiffTime, Time (..))
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Types as Aeson
import qualified Data.IP as IP
import qualified Data.Set as Set
import qualified Data.Map.Strict as Map
import Data.Text (pack)

import Network.TypedProtocol.Core (ClientHasAgency,
PeerHasAgency (..), ServerHasAgency)


import Network.Mux (MuxTrace (..), WithMuxBearer (..))
import qualified Network.Socket as Socket (SockAddr)
import qualified Network.Socket as Socket (SockAddr (..))

import Cardano.Tracing.ConvertTxId (ConvertTxId)
import Cardano.Tracing.OrphanInstances.Common
Expand All @@ -44,7 +47,8 @@ import Ouroboros.Network.BlockFetch.ClientState (TraceFetchClientState
import qualified Ouroboros.Network.BlockFetch.ClientState as BlockFetch
import Ouroboros.Network.BlockFetch.Decision (FetchDecision, FetchDecline (..))
import Ouroboros.Network.ConnectionId (ConnectionId (..))
import Ouroboros.Network.ConnectionManager.Types (ConnectionManagerCounters (..))
import Ouroboros.Network.ConnectionManager.Types (AbstractState (..),
ConnectionManagerCounters (..))
import Ouroboros.Network.Codec (AnyMessageAndAgency (..))
import Ouroboros.Network.DeltaQ (GSV (..), PeerGSV (..))
import Ouroboros.Network.KeepAlive (TraceKeepAliveClient (..))
Expand Down Expand Up @@ -433,6 +437,7 @@ instance HasSeverityAnnotation (ConnectionManagerTrace addr (ConnectionHandlerTr
TrConnectionTimeWait {} -> Debug
TrConnectionTimeWaitDone {} -> Debug
TrConnectionManagerCounters {} -> Info
TrState {} -> Info

instance HasPrivacyAnnotation (ServerTrace addr)
instance HasSeverityAnnotation (ServerTrace addr) where
Expand Down Expand Up @@ -602,7 +607,9 @@ instance Transformable Text IO PeerSelectionCounters where
instance HasTextFormatter PeerSelectionCounters where
formatText a _ = pack (show a)

instance (Show addr, Show versionNumber, Show agreedOptions, ToObject addr)
instance (Show addr, Show versionNumber, Show agreedOptions, ToObject addr,
Aeson.ToJSON addr
)
=> Transformable Text IO (ConnectionManagerTrace
addr
(ConnectionHandlerTrace versionNumber agreedOptions)) where
Expand Down Expand Up @@ -932,9 +939,13 @@ instance ToObject NtN.HandshakeTr where


instance ToObject LocalAddress where
toObject _verb (LocalAddress path) =
mkObject [ "path" .= String (pack path) ]
toObject _verb addr =
mkObject [ "path" .= toJSON addr ]

instance ToJSON LocalAddress where
toJSON (LocalAddress path) = String (pack path)

instance Aeson.ToJSONKey LocalAddress where

instance ToObject NtN.AcceptConnectionsPolicyTrace where
toObject _verb (NtN.ServerTraceAcceptConnectionRateLimiting delay numOfConnections) =
Expand Down Expand Up @@ -1039,9 +1050,32 @@ instance ToObject (TraceTxSubmissionInbound txid tx) where

-- TODO: ouroboros-network should provide a newtype wrapper for 'SockAddr'.
instance ToObject Socket.SockAddr where
toObject _verb sockAddr =
mkObject [ "sockAddr" .= String (pack $ show sockAddr) ]

toObject _verb (Socket.SockAddrInet port addr) =
let ip = IP.fromHostAddress addr in
mkObject [ "addr" .= show ip
, "port" .= show port
]
toObject _verb (Socket.SockAddrInet6 port _ addr _) =
let ip = IP.fromHostAddress6 addr in
mkObject [ "addr" .= show ip
, "port" .= show port
]
toObject _verb (Socket.SockAddrUnix path) =
mkObject [ "path" .= show path ]

instance Aeson.ToJSON Socket.SockAddr where
toJSON (Socket.SockAddrInet port addr) =
let ip = IP.fromHostAddress addr in
Aeson.object [ "addr" .= show ip
, "port" .= show port
]
toJSON (Socket.SockAddrInet6 port _ addr _) =
let ip = IP.fromHostAddress6 addr in
Aeson.object [ "addr" .= show ip
, "port" .= show port
]
toJSON (Socket.SockAddrUnix path) =
Aeson.object [ "path" .= show path ]

instance (Show txid, Show tx)
=> ToObject (TraceTxSubmissionOutbound txid tx) where
Expand Down Expand Up @@ -1187,6 +1221,38 @@ instance ToObject (TracePeerSelection Socket.SockAddr) where
mkObject [ "kind" .= String "TracePeerSelection"
, "event" .= show ev ]

instance Aeson.ToJSON AbstractState where
toJSON UnknownConnectionSt =
Aeson.object [ "kind" .= String "UnknownConnectionSt" ]
toJSON ReservedOutboundSt =
Aeson.object [ "kind" .= String "ReservedOutboundSt" ]
toJSON (UnnegotiatedSt provenance) =
Aeson.object [ "kind" .= String "UnnegotiatedSt"
, "provenance" .= String (pack . show $ provenance)
]
toJSON (InboundIdleSt dataFlow) =
Aeson.object [ "kind" .= String "InboundIdleSt"
, "dataFlow" .= String (pack . show $ dataFlow)
]
toJSON (InboundSt dataFlow) =
Aeson.object [ "kind" .= String "InboundSt"
, "dataFlow" .= String (pack . show $ dataFlow)
]
toJSON OutboundUniSt =
Aeson.object [ "kind" .= String "OutboundUniSt" ]
toJSON (OutboundDupSt timeoutExpired) =
Aeson.object [ "kind" .= String "OutboundDupSt"
, "timeoutState" .= String (pack . show $ timeoutExpired)
]
toJSON DuplexSt =
Aeson.object [ "kind" .= String "DuplexSt" ]
toJSON WaitRemoteIdleSt =
Aeson.object [ "kind" .= String "WaitRemoteIdleSt" ]
toJSON TerminatingSt =
Aeson.object [ "kind" .= String "TerminatingSt" ]
toJSON TerminatedSt =
Aeson.object [ "kind" .= String "TerminatedSt" ]


peerSelectionTargetsToObject :: PeerSelectionTargets -> Value
peerSelectionTargetsToObject
Expand Down Expand Up @@ -1232,7 +1298,8 @@ instance ToObject PeerSelectionCounters where
mkObject [ "kind" .= String "PeerSelectionCounters"
, "event" .= show ev ]

instance (Show addr, Show versionNumber, Show agreedOptions, ToObject addr)
instance (Show addr, Show versionNumber, Show agreedOptions, ToObject addr,
ToJSON addr)
=> ToObject (ConnectionManagerTrace addr (ConnectionHandlerTrace versionNumber agreedOptions)) where
toObject verb ev =
case ev of
Expand Down Expand Up @@ -1352,6 +1419,16 @@ instance (Show addr, Show versionNumber, Show agreedOptions, ToObject addr)
[ "kind" .= String "ConnectionManagerCounters"
, "state" .= toJSON cmCounters
]
TrState cmState ->
mkObject
[ "kind" .= String "ConnectionManagerState"
, "state" .= Aeson.listValue (\(addr, connState) ->
Aeson.object
[ "remoteAddress" .= toJSON addr
, "connectionState" .= toJSON connState
])
(Map.toList cmState)
]


instance Show addr
Expand Down

0 comments on commit 1eec1c1

Please sign in to comment.