Skip to content

Commit 8271057

Browse files
committed
cardano-tracer: Add functionality to run cardano-tracer as a library, with shut-down functionality and internal/user messaging.
Signed-off-by: Baldur Blöndal <[email protected]>
1 parent 0614f23 commit 8271057

File tree

12 files changed

+385
-99
lines changed

12 files changed

+385
-99
lines changed

cardano-tracer/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# ChangeLog
22

3+
## NEXT
4+
* Cardano-tracer library functionality, allows shutting down and sending signals to running
5+
instances through channels.
6+
37
## 0.3.5 (October, 2025)
48
* Updated to `ekg-forward-1.0`, `ouroboros-network-0.22.3`, `ouroboros-network-api-0.16` and `ouroboros-network-0.22.3`.
59
* Updated metric names
Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
1-
import Cardano.Tracer.CLI (TracerParams, parseTracerParams)
1+
{-# LANGUAGE OverloadedRecordDot #-}
2+
3+
import Cardano.Tracer.CLI (TracerParams(..), parseTracerParams)
4+
import Cardano.Tracer.MetaTrace
25
import Cardano.Tracer.Run (runCardanoTracer)
36

7+
import Data.Functor (void)
48
import Data.Version (showVersion)
59
import Options.Applicative
610

711
import Paths_cardano_tracer (version)
812

913
main :: IO ()
10-
main =
11-
runCardanoTracer =<< customExecParser (prefs showHelpOnEmpty) tracerInfo
14+
main = void do
15+
tracerParams :: TracerParams
16+
<- customExecParser (prefs showHelpOnEmpty) tracerInfo
17+
trace :: Trace IO TracerTrace <-
18+
-- Default `Nothing' severity filter to Info.
19+
mkTracerTracer $ SeverityF (tracerParams.logSeverity <|> Just Info)
20+
runCardanoTracer trace tracerParams
1221

1322
tracerInfo :: ParserInfo TracerParams
1423
tracerInfo = info
@@ -21,7 +30,9 @@ tracerInfo = info
2130

2231
versionOption :: Parser (a -> a)
2332
versionOption = infoOption
24-
(showVersion version)
25-
(long "version" <>
26-
short 'v' <>
27-
help "Show version")
33+
do showVersion version
34+
do mconcat
35+
[ long "version"
36+
, short 'v'
37+
, help "Show version"
38+
]

cardano-tracer/bench/cardano-tracer-bench.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import Control.Concurrent.Extra (newLock)
1919
#if RTVIEW
2020
import Control.Concurrent.STM.TVar (newTVarIO)
2121
#endif
22+
import Control.Concurrent.Chan.Unagi (newChan)
2223
import Control.DeepSeq
2324
import qualified Data.List.NonEmpty as NE
2425
import Data.Time.Clock (UTCTime, getCurrentTime)
@@ -63,6 +64,8 @@ main = do
6364

6465
tracer <- mkTracerTracer $ SeverityF $ Just Warning
6566

67+
(inChan, _outChan) <- newChan
68+
6669
let tracerEnv :: TracerConfig -> HandleRegistry -> TracerEnv
6770
tracerEnv config handleRegistry = TracerEnv
6871
{ teConfig = config
@@ -74,6 +77,7 @@ main = do
7477
, teDPRequestors = dpRequestors
7578
, teProtocolsBrake = protocolsBrake
7679
, teTracer = tracer
80+
, teInChan = inChan
7781
, teReforwardTraceObjects = \_-> pure ()
7882
, teRegistry = handleRegistry
7983
, teStateDir = Nothing

cardano-tracer/cardano-tracer.cabal

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ library
200200
, trace-dispatcher ^>= 2.10.0
201201
, trace-forward ^>= 2.3.0
202202
, trace-resources ^>= 0.2.4
203+
, unagi-chan
203204
, wai ^>= 3.2
204205
, warp ^>= 3.4
205206
, yaml
@@ -294,6 +295,7 @@ library demo-acceptor-lib
294295
exposed-modules: Cardano.Tracer.Test.Acceptor
295296

296297
build-depends: bytestring
298+
, QuickCheck
297299
, cardano-tracer
298300
, containers
299301
, extra
@@ -306,9 +308,9 @@ library demo-acceptor-lib
306308
, text
307309
, trace-dispatcher
308310
, trace-forward
311+
, unagi-chan
309312
, vector
310313
, vector-algorithms
311-
, QuickCheck
312314

313315
executable demo-acceptor
314316
import: project-config
@@ -452,12 +454,13 @@ benchmark cardano-tracer-bench
452454
build-depends: stm <2.5.2 || >=2.5.3
453455
build-depends: cardano-tracer
454456
, criterion
455-
, directory
456457
, deepseq
458+
, directory
457459
, extra
458460
, filepath
459461
, time
460462
, trace-dispatcher
463+
, unagi-chan
461464

462465
ghc-options: -threaded
463466
-rtsopts

cardano-tracer/src/Cardano/Tracer/Acceptors/Run.hs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Cardano.Tracer.Utils
1414
import Cardano.Logging.Types (TraceObject)
1515
import qualified Cardano.Logging.Types as Net
1616

17+
import Control.Concurrent.Chan.Unagi (dupChan)
1718
import Control.Concurrent.Async (forConcurrently_)
1819
import "contra-tracer" Control.Tracer (Tracer, contramap, nullTracer, stdoutTracer)
1920
import qualified Data.List.NonEmpty as NE
@@ -33,20 +34,28 @@ import qualified Trace.Forward.Protocol.TraceObject.Type as TOF
3334
-- 1. Server mode, when the tracer accepts connections from any number of nodes.
3435
-- 2. Client mode, when the tracer initiates connections to specified number of nodes.
3536
runAcceptors :: TracerEnv -> TracerEnvRTView -> IO ()
36-
runAcceptors tracerEnv@TracerEnv{teTracer} tracerEnvRTView = do
37+
runAcceptors tracerEnv@TracerEnv{teTracer, teInChan = inChan} tracerEnvRTView = do
3738
traceWith teTracer $ TracerStartedAcceptors network
3839
case network of
39-
AcceptAt howToConnect ->
40+
AcceptAt howToConnect -> let
4041
-- Run one server that accepts connections from the nodes.
41-
runInLoop
42-
(runAcceptorsServer tracerEnv tracerEnvRTView howToConnect $ acceptorsConfigs (Net.howToConnectString howToConnect))
43-
verbosity howToConnect initialPauseInSec
44-
ConnectTo localSocks ->
42+
43+
action :: IO ()
44+
action = do
45+
dieOnShutdown =<< dupChan inChan
46+
runAcceptorsServer tracerEnv tracerEnvRTView howToConnect $ acceptorsConfigs (Net.howToConnectString howToConnect)
47+
48+
in runInLoop action verbosity howToConnect initialPauseInSec
49+
ConnectTo localSocks -> do
4550
-- Run N clients that initiate connections to the nodes.
46-
forConcurrently_ (NE.nub localSocks) \howToConnect ->
47-
runInLoop
48-
(runAcceptorsClient tracerEnv tracerEnvRTView howToConnect $ acceptorsConfigs (Net.howToConnectString howToConnect))
49-
verbosity howToConnect initialPauseInSec
51+
forConcurrently_ (NE.nub localSocks) \howToConnect -> let
52+
53+
action :: IO ()
54+
action = runAcceptorsClient tracerEnv tracerEnvRTView howToConnect $ acceptorsConfigs (Net.howToConnectString howToConnect)
55+
56+
in do
57+
dieOnShutdown =<< dupChan inChan
58+
runInLoop action verbosity howToConnect initialPauseInSec
5059
where
5160
TracerConfig{network, ekgRequestFreq, verbosity, ekgRequestFull} = teConfig tracerEnv
5261
ekgUseFullRequests = fromMaybe False ekgRequestFull

0 commit comments

Comments
 (0)