Skip to content

Commit 21a206c

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 <baldur.blondal@iohk.io>
1 parent bcba24b commit 21a206c

File tree

15 files changed

+426
-111
lines changed

15 files changed

+426
-111
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.6 (November 2025)
48
* Implement Prometheus HTTP service discovery (SD) under the URL `/targets`
59
* Add optional config field `"prometheusLabels": { "<labelname>": "<labelvalue>", ... }` for custom labels to be attached with Prometheus SD
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
@@ -203,6 +203,7 @@ library
203203
, trace-dispatcher ^>= 2.11.0
204204
, trace-forward ^>= 2.4.0
205205
, trace-resources ^>= 0.2.4
206+
, unagi-chan
206207
, wai ^>= 3.2
207208
, warp ^>= 3.4
208209
, yaml
@@ -297,6 +298,7 @@ library demo-acceptor-lib
297298
exposed-modules: Cardano.Tracer.Test.Acceptor
298299

299300
build-depends: bytestring
301+
, QuickCheck
300302
, cardano-tracer
301303
, containers
302304
, extra
@@ -309,9 +311,9 @@ library demo-acceptor-lib
309311
, text
310312
, trace-dispatcher
311313
, trace-forward
314+
, unagi-chan
312315
, vector
313316
, vector-algorithms
314-
, QuickCheck
315317

316318
executable demo-acceptor
317319
import: project-config
@@ -455,12 +457,13 @@ benchmark cardano-tracer-bench
455457
build-depends: stm <2.5.2 || >=2.5.3
456458
build-depends: cardano-tracer
457459
, criterion
458-
, directory
459460
, deepseq
461+
, directory
460462
, extra
461463
, filepath
462464
, time
463465
, trace-dispatcher
466+
, unagi-chan
464467

465468
ghc-options: -threaded
466469
-rtsopts

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ module Cardano.Tracer.Acceptors.Run
66
) where
77

88
import Cardano.Logging.Types (TraceObject)
9-
import Cardano.Logging.Utils (runInLoop)
9+
import Cardano.Logging.Utils (runInLoop, RunInLoopTermination(..))
1010
import Cardano.Tracer.Acceptors.Client
1111
import Cardano.Tracer.Acceptors.Server
1212
import Cardano.Tracer.Configuration
1313
import Cardano.Tracer.Environment
1414
import Cardano.Tracer.MetaTrace
1515

16+
import Control.Concurrent.Chan.Unagi (dupChan)
1617
import Control.Concurrent.Async (forConcurrently_)
1718
import Control.Exception (SomeException (..))
1819
import "contra-tracer" Control.Tracer (Tracer, contramap, nullTracer, stdoutTracer)
@@ -33,20 +34,24 @@ 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 (show howToConnect))
43-
(handleOnInterruption howToConnect) initialPauseInSec 10
42+
action :: IO ()
43+
action = do
44+
dieOnShutdown =<< dupChan inChan
45+
runAcceptorsServer tracerEnv tracerEnvRTView howToConnect $ acceptorsConfigs (show howToConnect)
46+
in runInLoop action TerminateNever (handleOnInterruption howToConnect) initialPauseInSec 10
4447
ConnectTo localSocks ->
4548
-- Run N clients that initiate connections to the nodes.
46-
forConcurrently_ (NE.nub localSocks) \howToConnect ->
47-
runInLoop
48-
(runAcceptorsClient tracerEnv tracerEnvRTView howToConnect $ acceptorsConfigs (show howToConnect))
49-
(handleOnInterruption howToConnect) initialPauseInSec 30
49+
forConcurrently_ (NE.nub localSocks) \howToConnect -> let
50+
action :: IO ()
51+
action = do
52+
dieOnShutdown =<< dupChan inChan
53+
runAcceptorsClient tracerEnv tracerEnvRTView howToConnect $ acceptorsConfigs (show howToConnect)
54+
in runInLoop action TerminateNever (handleOnInterruption howToConnect) initialPauseInSec 30
5055
where
5156
handleOnInterruption howToConnect (SomeException e)
5257
| verbosity == Just Minimum = pure ()

0 commit comments

Comments
 (0)