Skip to content

Commit d9bda00

Browse files
committed
trace-forward: use config record type InitForwardingConfig
1 parent a198a3e commit d9bda00

File tree

5 files changed

+115
-78
lines changed

5 files changed

+115
-78
lines changed

bench/tx-generator/src/Cardano/Benchmarking/Tracer.hs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ import qualified Data.Text as Text
4949
import Data.Time.Clock
5050
import GHC.Generics
5151

52-
import Trace.Forward.Forwarding (initForwardingDelayed)
52+
import Trace.Forward.Forwarding (InitForwardingConfig (..), initForwardingDelayed)
5353
import Trace.Forward.Utils.TraceObject
5454

5555
pattern TracerNameBench :: Text
@@ -120,9 +120,18 @@ initTxGenTracers mbForwarding = do
120120
prepareForwardingTracer :: IO (Maybe (Trace IO FormattedMessage))
121121
prepareForwardingTracer = forM mbForwarding $
122122
\(iomgr, networkId, tracerSocket) -> do
123-
let forwardingConf = fromMaybe defaultForwarder (tcForwarder initialTraceConfig)
123+
let
124+
forwardingConf = fromMaybe defaultForwarder (tcForwarder initialTraceConfig)
125+
initForwConf = InitForwardingWith
126+
{ initNetworkMagic = toNetworkMagic networkId
127+
, initEKGStore = Nothing
128+
, initHowToConnect = Net.LocalPipe tracerSocket
129+
, initForwarderMode = Initiator
130+
, initOnForwardInterruption = Nothing
131+
, initOnQueueOverflow = Nothing
132+
}
124133
(forwardSink, dpStore, kickoffForwarder) <-
125-
initForwardingDelayed iomgr forwardingConf (toNetworkMagic networkId) Nothing $ Just (Net.LocalPipe tracerSocket, Initiator)
134+
initForwardingDelayed iomgr forwardingConf initForwConf
126135

127136
-- we need to provide NodeInfo DataPoint, to forward generator's name
128137
-- to the acceptor application (for example, 'cardano-tracer').

cardano-node/src/Cardano/Node/Tracing/API.hs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{-# LANGUAGE MonoLocalBinds #-}
33
{-# LANGUAGE PackageImports #-}
44
{-# LANGUAGE RankNTypes #-}
5+
{-# LANGUAGE RecordWildCards #-}
56
{-# LANGUAGE ScopedTypeVariables #-}
67

78
module Cardano.Node.Tracing.API
@@ -46,7 +47,7 @@ import Network.Mux.Trace (TraceLabelPeer (..))
4647
import Network.Socket (HostName)
4748
import System.Metrics as EKG
4849

49-
import Trace.Forward.Forwarding (initForwardingDelayed)
50+
import Trace.Forward.Forwarding (InitForwardingConfig (..), initForwardingDelayed)
5051
import Trace.Forward.Utils.TraceObject (writeToSink)
5152

5253

@@ -126,13 +127,23 @@ initTraceDispatcher nc p networkMagic nodeKernel noBlockForging = do
126127
if forwarderBackendEnabled
127128
then do
128129
-- TODO: check if this is the correct way to use withIOManager
129-
(forwardSink, dpStore, kickoffForwarder) <- withIOManager $ \iomgr -> do
130-
let tracerSocketMode :: Maybe (HowToConnect, ForwarderMode)
131-
tracerSocketMode = ncTraceForwardSocket nc
130+
(forwardSink, dpStore, kickoffForwarder) <- withIOManager $ \iomgr ->
131+
let initForwConf :: InitForwardingConfig
132+
initForwConf = case ncTraceForwardSocket nc of
133+
Nothing -> InitForwardingNone
134+
Just (initHowToConnect, initForwarderMode) ->
135+
InitForwardingWith
136+
{ initNetworkMagic = networkMagic
137+
, initEKGStore = Just ekgStore
138+
, initOnForwardInterruption = Nothing -- TODO:MKarg
139+
, initOnQueueOverflow = Nothing
140+
, ..
141+
}
132142

133143
forwardingConf :: TraceOptionForwarder
134144
forwardingConf = fromMaybe defaultForwarder (tcForwarder trConfig)
135-
initForwardingDelayed iomgr forwardingConf networkMagic (Just ekgStore) tracerSocketMode
145+
in initForwardingDelayed iomgr forwardingConf initForwConf
146+
136147
pure (forwardTracer (writeToSink forwardSink), dataPointTracer dpStore, kickoffForwarder)
137148
else
138149
-- Since 'Forwarder' backend isn't enabled, there is no forwarding.

cardano-tracer/src/Cardano/Tracer/Handlers/ReForwarder.hs

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{-# LANGUAGE NamedFieldPuns #-}
22
{-# LANGUAGE OverloadedStrings #-}
3+
{-# LANGUAGE RecordWildCards #-}
34
{-# LANGUAGE ScopedTypeVariables #-}
45
{-# LANGUAGE TypeApplications #-}
56
{-# LANGUAGE ViewPatterns #-}
@@ -19,7 +20,6 @@ module Cardano.Tracer.Handlers.ReForwarder
1920
import Cardano.Logging.Trace
2021
import Cardano.Logging.Tracer.DataPoint
2122
import qualified Cardano.Logging.Types as Log
22-
import qualified Cardano.Logging.Types as Net
2323
import Cardano.Tracer.Configuration
2424
import Cardano.Tracer.Handlers.Utils (normalizeNamespace)
2525
import Cardano.Tracer.MetaTrace
@@ -47,34 +47,17 @@ initReForwarder TracerConfig{networkMagic, hasForwarding}
4747
teTracer = do
4848
mForwarding <- case hasForwarding of
4949
Nothing -> pure Nothing
50-
Just x -> case x of
51-
(ConnectTo{}, _, _) ->
50+
Just (ConnectTo{}, _, _) ->
5251
error "initReForwarder: unsupported mode of operation: ConnectTo. Use AcceptAt."
53-
(AcceptAt (LocalPipe socket), flattenNS -> mFwdNames, forwConf) -> do
52+
Just (AcceptAt howToConnect, flattenNS -> mFwdNames, forwConf) -> do
5453
(fwdsink, dpStore :: DataPointStore) <- withIOManager \iomgr -> do
5554
traceWith teTracer TracerStartedReforwarder
56-
initForwarding iomgr forwConf
57-
(NetworkMagic networkMagic)
58-
Nothing
59-
(Just (Net.LocalPipe socket, Log.Responder))
55+
initForwarding iomgr forwConf $ initForwardingWith howToConnect
6056
pure $ Just ( filteredWriteToSink
6157
(traceObjectHasPrefixIn mFwdNames)
6258
fwdsink
6359
, dataPointTracer @IO dpStore
6460
)
65-
(AcceptAt (RemoteSocket host port), flattenNS -> mFwdNames, forwConf) -> do
66-
(fwdsink, dpStore :: DataPointStore) <- withIOManager \iomgr -> do
67-
traceWith teTracer TracerStartedReforwarder
68-
initForwarding iomgr forwConf
69-
(NetworkMagic networkMagic)
70-
Nothing
71-
(Just (Net.RemoteSocket host port, Log.Responder))
72-
pure $ Just ( filteredWriteToSink
73-
(traceObjectHasPrefixIn mFwdNames)
74-
fwdsink
75-
, dataPointTracer @IO dpStore
76-
)
77-
7861
let traceDP = case mForwarding of
7962
Just (_,tr) -> tr
8063
Nothing -> mempty
@@ -90,14 +73,22 @@ initReForwarder TracerConfig{networkMagic, hasForwarding}
9073
where
9174
flattenNS = fmap (map (Text.intercalate "."))
9275

76+
initForwardingWith initHowToConnect =
77+
InitForwardingWith
78+
{ initNetworkMagic = NetworkMagic networkMagic
79+
, initEKGStore = Nothing
80+
, initForwarderMode = Log.Responder
81+
, initOnForwardInterruption = Nothing -- TODO:MKarg
82+
, initOnQueueOverflow = Nothing
83+
, ..
84+
}
9385

9486
traceObjectHasPrefixIn :: Maybe [Text.Text] -> Log.TraceObject -> Bool
9587
traceObjectHasPrefixIn mFwdNames (normalizeNamespace . Log.toNamespace -> ns) =
9688
case mFwdNames of
9789
Nothing -> True -- forward everything in this case
9890
Just fwdNames -> any (`Text.isPrefixOf` ns) fwdNames
9991

100-
10192
filteredWriteToSink :: (Log.TraceObject -> Bool)
10293
-> ForwardSink Log.TraceObject
10394
-> Log.TraceObject -> IO ()

cardano-tracer/test/cardano-tracer-test-ext.hs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import qualified System.Process as Sys
3030
import Test.Tasty
3131
import Test.Tasty.QuickCheck
3232

33-
import Trace.Forward.Forwarding (initForwarding)
33+
import Trace.Forward.Forwarding (InitForwardingConfig (..), initForwarding)
3434
import Trace.Forward.Utils.TraceObject (writeToSink)
3535

3636
main :: IO ()
@@ -137,7 +137,14 @@ getExternalTracerState TestSetup{..} ref = do
137137
(forwardSink, _dpStore) <- withIOManager \iomgr -> do
138138
-- For simplicity, we are always 'Initiator',
139139
-- so 'cardano-tracer' is always a 'Responder'.
140-
let tracerSocketMode = Just (Net.LocalPipe (unI tsSockExternal), Initiator)
141-
forwardingConf = fromMaybe defaultForwarder (tcForwarder simpleTestConfig)
142-
initForwarding iomgr forwardingConf (unI tsNetworkMagic) Nothing tracerSocketMode
140+
let forwardingConf = fromMaybe defaultForwarder (tcForwarder simpleTestConfig)
141+
initForwarding iomgr forwardingConf $
142+
InitForwardingWith
143+
{ initNetworkMagic = unI tsNetworkMagic
144+
, initEKGStore = Nothing
145+
, initHowToConnect = Net.LocalPipe (unI tsSockExternal)
146+
, initForwarderMode = Initiator
147+
, initOnForwardInterruption = Nothing
148+
, initOnQueueOverflow = Nothing
149+
}
143150
pure (externalTracerHdl, forwardTracer (writeToSink forwardSink))

trace-forward/src/Trace/Forward/Forwarding.hs

Lines changed: 63 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
{-# LANGUAGE DataKinds #-}
44
{-# LANGUAGE FlexibleInstances #-}
55
{-# LANGUAGE PackageImports #-}
6+
{-# LANGUAGE RecordWildCards #-}
67
{-# LANGUAGE ScopedTypeVariables #-}
78
{-# LANGUAGE TypeApplications #-}
89
{-# LANGUAGE ViewPatterns #-}
910

11+
{-# OPTIONS_GHC -Wno-partial-fields #-}
12+
1013
module Trace.Forward.Forwarding
11-
( initForwarding
14+
( InitForwardingConfig(..)
15+
, initForwarding
1216
, initForwardingDelayed
1317
) where
1418

@@ -26,22 +30,21 @@ import Ouroboros.Network.Protocol.Handshake.Codec (cborTermVersionData
2630
import Ouroboros.Network.Protocol.Handshake.Type (Handshake)
2731
import Ouroboros.Network.Protocol.Handshake.Version (acceptableVersion, queryVersion,
2832
simpleSingletonVersions)
29-
import Ouroboros.Network.Snocket (MakeBearer, Snocket, localAddressFromPath, localSnocket,
30-
makeLocalBearer, LocalAddress, socketSnocket, makeSocketBearer, LocalSocket)
31-
import Ouroboros.Network.Socket (ConnectToArgs (..),
32-
HandshakeCallbacks (..), SomeResponderApplication (..),
33-
connectToNode, nullNetworkConnectTracers)
3433
import qualified Ouroboros.Network.Server.Simple as Server
34+
import Ouroboros.Network.Snocket (LocalAddress, LocalSocket, MakeBearer, Snocket,
35+
localAddressFromPath, localSnocket, makeLocalBearer, makeSocketBearer,
36+
socketSnocket)
37+
import Ouroboros.Network.Socket (ConnectToArgs (..), HandshakeCallbacks (..),
38+
SomeResponderApplication (..), connectToNode, nullNetworkConnectTracers)
3539

3640
import Codec.CBOR.Term (Term)
3741
import Control.Concurrent.Async (async, wait)
38-
import Control.Exception (throwIO)
42+
import Control.Exception (SomeException, throwIO)
3943
import Control.Monad.IO.Class
4044
import "contra-tracer" Control.Tracer (Tracer, contramap, nullTracer, stdoutTracer)
4145
import qualified Data.ByteString.Lazy as LBS
4246
import Data.Functor
4347
import Data.List.NonEmpty (NonEmpty ((:|)))
44-
import Data.Maybe (isNothing)
4548
import qualified Data.Text as Text
4649
import Data.Void (Void, absurd)
4750
import Data.Word (Word16)
@@ -61,15 +64,37 @@ import Trace.Forward.Utils.ForwardSink (ForwardSink)
6164
import Trace.Forward.Utils.TraceObject
6265
import Trace.Forward.Utils.Version
6366

67+
68+
-- | Config record to initialise trace forwarding
69+
data InitForwardingConfig
70+
= -- | Only construct relevant values, but do not actually run forwarding
71+
InitForwardingNone
72+
| -- | Run forwarding with the provided settings
73+
InitForwardingWith
74+
{ initNetworkMagic :: !NetworkMagic
75+
-- ^ Forwarding is always tied to a singular networkId
76+
, initEKGStore :: !(Maybe EKG.Store)
77+
-- ^ A metrics store to be forwarded (optional)
78+
, initHowToConnect :: !HowToConnect
79+
-- ^ A LocalPipe or RemoteSocket
80+
, initForwarderMode :: !ForwarderMode
81+
-- ^ Run as Initiator or Responder
82+
, initOnForwardInterruption :: !(Maybe (SomeException -> IO ()))
83+
-- ^ Optional handler when forwarding connection is interrupted (may be temporary or permanent)
84+
-- default: no action
85+
, initOnQueueOverflow :: !(Maybe ([TraceObject] -> IO ()))
86+
-- ^ Optional handler when forwarding queue overflows (argument are objects dropped from queue)
87+
-- default: print one-liner to stderr, indicating object count and timestamps of first and last object
88+
}
89+
90+
6491
initForwarding :: forall m. (MonadIO m)
6592
=> IOManager
6693
-> TraceOptionForwarder
67-
-> NetworkMagic
68-
-> Maybe EKG.Store
69-
-> Maybe (HowToConnect, ForwarderMode)
94+
-> InitForwardingConfig
7095
-> m (ForwardSink TraceObject, DataPointStore)
71-
initForwarding iomgr config magic ekgStore tracerSocketMode = do
72-
(a, b, kickoffForwarder) <- initForwardingDelayed iomgr config magic ekgStore tracerSocketMode
96+
initForwarding iomgr config forwarding = do
97+
(a, b, kickoffForwarder) <- initForwardingDelayed iomgr config forwarding
7398
liftIO kickoffForwarder
7499
pure (a, b)
75100

@@ -79,38 +104,34 @@ initForwardingDelayed :: forall m. ()
79104
=> MonadIO m
80105
=> IOManager
81106
-> TraceOptionForwarder
82-
-> NetworkMagic
83-
-> Maybe EKG.Store
84-
-> Maybe (HowToConnect, ForwarderMode)
107+
-> InitForwardingConfig
85108
-> m (ForwardSink TraceObject, DataPointStore, IO ())
86-
initForwardingDelayed iomgr config magic ekgStore tracerSocketMode = liftIO $ do
87-
let ignoreOverflow, onOverflow :: [TraceObject] -> IO ()
88-
ignoreOverflow _ =
89-
pure ()
90-
onOverflow | isNothing tracerSocketMode = ignoreOverflow
91-
| otherwise = handleOverflow
109+
initForwardingDelayed iomgr config forwarding = liftIO $ do
110+
let onOverflow :: [TraceObject] -> IO ()
111+
onOverflow = case forwarding of
112+
InitForwardingNone -> const $ pure ()
113+
InitForwardingWith{initOnQueueOverflow = Just handler} -> handler
114+
InitForwardingWith{initOnQueueOverflow = Nothing} -> handleOverflow
92115
forwardSink <- initForwardSink tfConfig onOverflow
93116
dpStore <- initDataPointStore
94117
let
95118
kickoffForwarder = launchForwarders
96119
iomgr
97-
magic
120+
forwarding
98121
ekgConfig
99122
tfConfig
100123
dpfConfig
101-
ekgStore
102124
forwardSink
103125
dpStore
104-
tracerSocketMode
105126
maxReconnectDelay
106127
pure (forwardSink, dpStore, kickoffForwarder)
107128
where
108129
endpoint :: EKGF.HowToConnect
109130
endpoint =
110-
case tracerSocketMode of
111-
Nothing -> EKGF.LocalPipe ""
112-
Just (LocalPipe str, _mode) -> EKGF.LocalPipe str
113-
Just (RemoteSocket host port, _mode) -> EKGF.RemoteSocket host port
131+
case forwarding of
132+
InitForwardingNone -> EKGF.LocalPipe ""
133+
InitForwardingWith{initHowToConnect = LocalPipe str} -> EKGF.LocalPipe str
134+
InitForwardingWith{initHowToConnect = RemoteSocket host port} -> EKGF.RemoteSocket host port
114135
queueSize = tofQueueSize config
115136
verbosity = tofVerbosity config
116137
maxReconnectDelay = tofMaxReconnectDelay config
@@ -157,39 +178,37 @@ handleOverflow (msg : msgs) =
157178

158179
launchForwarders
159180
:: IOManager
160-
-> NetworkMagic
181+
-> InitForwardingConfig
161182
-> EKGF.ForwarderConfiguration
162183
-> TF.ForwarderConfiguration TraceObject
163184
-> DPF.ForwarderConfiguration
164-
-> Maybe EKG.Store
165185
-> ForwardSink TraceObject
166186
-> DataPointStore
167-
-> Maybe (HowToConnect, ForwarderMode)
168187
-> Word
169188
-> IO ()
170-
launchForwarders iomgr magic
189+
launchForwarders iomgr forwarding
171190
ekgConfig tfConfig dpfConfig
172-
ekgStore sink dpStore tracerSocketMode maxReconnectDelay =
173-
-- If 'tracerSocketMode' is not specified, it's impossible to establish
174-
-- network connection with acceptor application (for example, 'cardano-tracer').
191+
sink dpStore maxReconnectDelay =
192+
-- If InitForwardingNone is specified, it's impossible to establish
193+
-- a connection with an acceptor application (for example, 'cardano-tracer').
175194
-- In this case, we should not launch forwarders.
176-
case tracerSocketMode of
177-
Nothing -> return ()
178-
Just (socketPath, mode) ->
195+
case forwarding of
196+
InitForwardingNone -> return ()
197+
InitForwardingWith{..} ->
179198
void . async $
180199
runInLoop
181200
(launchForwardersViaLocalSocket
182201
iomgr
183-
magic
184-
socketPath
185-
mode
202+
initNetworkMagic
203+
initHowToConnect
204+
initForwarderMode
186205
ekgConfig
187206
tfConfig
188207
dpfConfig
189208
sink
190-
ekgStore
209+
initEKGStore
191210
dpStore)
192-
socketPath
211+
initHowToConnect
193212
1
194213
maxReconnectDelay
195214

0 commit comments

Comments
 (0)