11{-# LANGUAGE DataKinds #-}
22{-# LANGUAGE DisambiguateRecordFields #-}
33{-# LANGUAGE MultiWayIf #-}
4+ {-# LANGUAGE NamedFieldPuns #-}
45{-# LANGUAGE OverloadedRecordDot #-}
56{-# LANGUAGE OverloadedStrings #-}
7+ {-# LANGUAGE PackageImports #-}
68{-# LANGUAGE ScopedTypeVariables #-}
79{-# LANGUAGE TemplateHaskell #-}
810{-# LANGUAGE TypeApplications #-}
911{-# LANGUAGE TypeOperators #-}
1012
1113module Main where
1214
13- import Control.Concurrent.Class.MonadMVar
1415import Control.Concurrent.Class.MonadSTM.Strict
1516import Control.Monad (unless , void , when )
17+ import Control.Monad.Class.MonadAsync
1618import Control.Monad.Class.MonadThrow
17- import Control.Tracer (Tracer ( .. ), nullTracer , traceWith )
19+ import "contra-tracer" Control.Tracer (nullTracer , traceWith )
1820
1921import Data.Act
20- import Data.Aeson (ToJSON )
2122import Data.ByteString.Lazy qualified as BSL
2223import Data.Foldable (traverse_ )
2324import Data.Functor.Contravariant ((>$<) )
@@ -31,28 +32,29 @@ import Options.Applicative
3132import System.Directory qualified as Dir
3233import System.Exit (die , exitSuccess )
3334import System.IOManager (withIOManager )
35+ import System.Metrics qualified as EKG
3436import System.Random qualified as Random
3537
3638import Cardano.Git.Rev (gitRev )
3739import Cardano.KESAgent.Protocols.StandardCrypto (StandardCrypto )
40+ import Cardano.Logging.Prometheus.TCPServer qualified as Prometheus
3841
3942import DMQ.Configuration
4043import DMQ.Configuration.CLIOptions (parseCLIOptions )
4144import DMQ.Configuration.Topology (readTopologyFileOrError )
4245import DMQ.Diffusion.Applications (diffusionApplications )
4346import DMQ.Diffusion.Arguments
4447import DMQ.Diffusion.NodeKernel
48+ import DMQ.Diffusion.PeerSelection (policy )
4549import DMQ.Handlers.TopLevel (toplevelExceptionHandler )
4650import DMQ.NodeToClient qualified as NtC
51+ import DMQ.NodeToClient.LocalStateQueryClient
4752import DMQ.NodeToNode (NodeToNodeVersion , dmqCodecs , dmqLimitsAndTimeouts ,
4853 ntnApps )
4954import DMQ.Policy qualified as Policy
5055import DMQ.Protocol.SigSubmission.Type (Sig (.. ))
51- import DMQ.Tracer
52-
53- import DMQ.Diffusion.PeerSelection (policy )
54- import DMQ.NodeToClient.LocalStateQueryClient
5556import DMQ.Protocol.SigSubmission.Validate
57+ import DMQ.Tracer (DMQStartupTrace (.. ), DMQTracers (.. ), mkDMQTracers )
5658import Ouroboros.Network.Diffusion qualified as Diffusion
5759import Ouroboros.Network.PeerSelection.LedgerPeers.Type
5860import Ouroboros.Network.PeerSelection.PeerSharing.Codec (decodeRemoteAddress ,
@@ -78,30 +80,43 @@ runDMQ commandLineConfig = do
7880 $ dmqcConfigFile commandLineConfig
7981 `act` dmqcConfigFile defaultConfiguration
8082
83+ ekgStore <- EKG. newStore
84+ EKG. registerGcMetrics ekgStore
85+
8186 -- read & parse configuration file
8287 config' <- readConfigurationFileOrError configFilePath
8388 -- combine default configuration, configuration file and command line
8489 -- options
85- let dmqConfig@ Configuration {
86- dmqcPrettyLog = I prettyLog,
90+ let dmqConfig :: Configuration
91+ dmqConfig @ Configuration {
8792 dmqcTopologyFile = I topologyFile,
88- dmqcHandshakeTracer = I handshakeTracer,
89- dmqcValidationTracer = I validationTracer,
90- dmqcLocalHandshakeTracer = I localHandshakeTracer,
9193 dmqcCardanoNodeSocket = I socketPath,
9294 dmqcVersion = I version,
93- dmqcLocalStateQueryTracer = I localStateQueryTracer,
9495 dmqcLedgerPeers = I ledgerPeers
9596 } = config' <> commandLineConfig
9697 `act`
9798 defaultConfiguration
9899
99- lock <- newMVar ()
100- let tracer', tracer :: ToJSON ev => Tracer IO (WithEventType ev )
101- tracer' = dmqTracer prettyLog
102- -- use a lock to prevent writing two lines at the same time
103- -- TODO: this won't be needed with `cardano-tracer` integration
104- tracer = Tracer $ \ a -> withMVar lock $ \ _ -> traceWith tracer' a
100+ ( dmqTracers@ DMQTracers {
101+ dmqStartupTracer,
102+ localStateQueryClientTracer,
103+ sigValidationTracer,
104+ localSigValidationTracer,
105+ cardanoNodeHandshakeTracer
106+ }
107+ , dmqDiffusionTracers
108+ , prometheusConfig
109+ )
110+ <- mkDMQTracers ekgStore configFilePath
111+
112+ case prometheusConfig of
113+ Nothing -> return ()
114+ Just ps ->
115+ -- morally it belongs to `NodeKernel`, but it runs in `IO`, not `m`.
116+ Prometheus. runPrometheusSimple
117+ (DMQPrometheus >$< dmqStartupTracer)
118+ ekgStore ps
119+ >>= link
105120
106121 when version $ do
107122 let gitrev = $ (gitRev)
@@ -120,12 +135,11 @@ runDMQ commandLineConfig = do
120135 ]
121136 exitSuccess
122137
123- traceWith tracer ( WithEventType " Configuration " dmqConfig)
138+ traceWith dmqStartupTracer ( DMQConfiguration dmqConfig)
124139 Dir. doesFileExist socketPath >>= \ a ->
125140 unless a (die $ " CardanoNodeSocket " ++ show socketPath ++ " : file does not exist" )
126141 nt <- readTopologyFileOrError topologyFile
127- traceWith tracer (WithEventType " NetworkTopology" nt)
128-
142+ traceWith dmqStartupTracer (DMQTopology nt)
129143
130144 stdGen <- Random. newStdGen
131145 let (psRng, policyRng) = Random. splitGen stdGen
@@ -135,15 +149,13 @@ runDMQ commandLineConfig = do
135149 withIOManager \ iocp -> do
136150 let localSnocket' = localSnocket iocp
137151 mkStakePoolMonitor = connectToCardanoNode
138- (if localStateQueryTracer
139- then WithEventType " LocalStateQuery" >$< tracer
140- else nullTracer)
152+ localStateQueryClientTracer
141153 ledgerPeers
142154 localSnocket'
143155 socketPath
144156
145157 withNodeKernel @ StandardCrypto
146- tracer
158+ dmqTracers
147159 dmqConfig
148160 psRng
149161 mkStakePoolMonitor $ \ nodeKernel -> do
@@ -153,9 +165,6 @@ runDMQ commandLineConfig = do
153165 let sigSize :: Sig StandardCrypto -> SizeInBytes
154166 sigSize = fromIntegral . BSL. length . sigRawBytes
155167 mempoolReader = Mempool. getReader sigId sigSize (mempool nodeKernel)
156- ntnValidationTracer = if validationTracer
157- then WithEventType " NtN Validation" >$< tracer
158- else nullTracer
159168 dmqNtNApps =
160169 let ntnMempoolWriter =
161170 Mempool. getWriter SigDuplicate
@@ -164,7 +173,7 @@ runDMQ commandLineConfig = do
164173 withPoolValidationCtx (stakePools nodeKernel) (validateSig now sigs)
165174 )
166175 (traverse_ $ \ (sigid, reason) -> do
167- traceWith ntnValidationTracer $ InvalidSignature sigid reason
176+ traceWith sigValidationTracer $ InvalidSignature sigid reason
168177 case reason of
169178 SigDuplicate -> return ()
170179 SigExpired -> return ()
@@ -174,7 +183,7 @@ runDMQ commandLineConfig = do
174183 err -> throwIO (SigValidationException sigid err)
175184 )
176185 (mempool nodeKernel)
177- in ntnApps tracer
186+ in ntnApps dmqTracers
178187 dmqConfig
179188 mempoolReader
180189 ntnMempoolWriter
@@ -185,9 +194,6 @@ runDMQ commandLineConfig = do
185194 (decodeRemoteAddress (maxBound @ NodeToNodeVersion )))
186195 dmqLimitsAndTimeouts
187196 Policy. sigDecisionPolicy
188- ntcValidationTracer = if validationTracer
189- then WithEventType " NtC Validation" >$< tracer
190- else nullTracer
191197 dmqNtCApps =
192198 let ntcMempoolWriter =
193199 Mempool. getWriter SigDuplicate
@@ -196,19 +202,15 @@ runDMQ commandLineConfig = do
196202 withPoolValidationCtx (stakePools nodeKernel) (validateSig now sigs)
197203 )
198204 (traverse_ $ \ (sigid, reason) ->
199- traceWith ntcValidationTracer $ InvalidSignature sigid reason
205+ traceWith localSigValidationTracer $ InvalidSignature sigid reason
200206 )
201207 (mempool nodeKernel)
202- in NtC. ntcApps tracer dmqConfig
208+ in NtC. ntcApps dmqTracers dmqConfig
203209 mempoolReader ntcMempoolWriter
204210 NtC. dmqCodecs
205211 dmqDiffusionArguments =
206- diffusionArguments (if handshakeTracer
207- then WithEventType " Handshake" >$< tracer
208- else nullTracer)
209- (if localHandshakeTracer
210- then WithEventType " Handshake" >$< tracer
211- else nullTracer)
212+ diffusionArguments nullTracer
213+ cardanoNodeHandshakeTracer
212214 $ maybe [] out <$> tryReadTMVar nodeKernel. stakePools. ledgerPeersVar
213215 where
214216 out :: LedgerPeerSnapshot AllLedgerPeers
@@ -225,6 +227,6 @@ runDMQ commandLineConfig = do
225227 (policy policyRngVar)
226228
227229 Diffusion. run dmqDiffusionArguments
228- ( dmqDiffusionTracers dmqConfig tracer)
230+ dmqDiffusionTracers
229231 dmqDiffusionConfiguration
230232 dmqDiffusionApplications
0 commit comments