Skip to content

Commit 3d5df51

Browse files
authored
Merge pull request #5764 from IntersectMBO/jutaro/prometheus-types
NodeVersion tracer for providing metrics
2 parents 144d53f + ee6dca2 commit 3d5df51

File tree

14 files changed

+273
-14
lines changed

14 files changed

+273
-14
lines changed

cardano-node/cardano-node.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ library
113113
Cardano.Node.Tracing.Tracers.KESInfo
114114
Cardano.Node.Tracing.Tracers.NodeToClient
115115
Cardano.Node.Tracing.Tracers.NodeToNode
116+
Cardano.Node.Tracing.Tracers.NodeVersion
116117
Cardano.Node.Tracing.Tracers.NonP2P
117118
Cardano.Node.Tracing.Tracers.P2P
118119
Cardano.Node.Tracing.Tracers.Peer

cardano-node/src/Cardano/Node/Run.hs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
{-# LANGUAGE NamedFieldPuns #-}
99
{-# LANGUAGE PackageImports #-}
1010
{-# LANGUAGE ScopedTypeVariables #-}
11-
{-# LANGUAGE TypeApplications #-}
1211
{-# LANGUAGE TupleSections #-}
1312

13+
{-# LANGUAGE TypeApplications #-}
14+
15+
1416
{-# OPTIONS_GHC -Wno-unused-imports #-}
1517

1618
#if !defined(mingw32_HOST_OS)
@@ -74,6 +76,8 @@ import Paths_cardano_node (version)
7476

7577
import qualified Cardano.Crypto.Init as Crypto
7678

79+
import Cardano.Node.Tracing.Tracers.NodeVersion (getNodeVersion)
80+
7781
import Cardano.Node.Configuration.Logging (LoggingLayer (..), createLoggingLayer,
7882
nodeBasicInfo, shutdownLoggingLayer)
7983
import Cardano.Node.Configuration.NodeAddress
@@ -102,12 +106,12 @@ import qualified Ouroboros.Network.Diffusion.P2P as P2P
102106
import Ouroboros.Network.NodeToClient (LocalAddress (..), LocalSocket (..))
103107
import Ouroboros.Network.NodeToNode (AcceptedConnectionsLimit (..), ConnectionId,
104108
PeerSelectionTargets (..), RemoteAddress)
109+
import Ouroboros.Network.PeerSelection.Bootstrap (UseBootstrapPeers (..))
110+
105111
import Ouroboros.Network.PeerSelection.RelayAccessPoint (RelayAccessPoint (..))
106112
import Ouroboros.Network.Protocol.ChainSync.Codec
107113
import Ouroboros.Network.Subscription (DnsSubscriptionTarget (..),
108114
IPSubscriptionTarget (..))
109-
import Ouroboros.Network.PeerSelection.Bootstrap
110-
(UseBootstrapPeers (..))
111115

112116
import Cardano.Node.Configuration.Socket (SocketOrSocketInfo (..),
113117
gatherConfiguredSockets, getSocketOrSocketInfoAddr)
@@ -124,11 +128,14 @@ import Cardano.Node.Protocol.Types
124128
import Cardano.Node.Queries
125129
import Cardano.Node.TraceConstraints (TraceConstraints)
126130
import Cardano.Tracing.Tracers
127-
import Ouroboros.Network.PeerSelection.PeerSharing (PeerSharing (..))
128-
import Ouroboros.Network.PeerSelection.State.LocalRootPeers (HotValency, WarmValency)
131+
import Ouroboros.Network.PeerSelection.Bootstrap (UseBootstrapPeers)
129132
import Ouroboros.Network.PeerSelection.LedgerPeers.Type (UseLedgerPeers)
133+
134+
import Ouroboros.Network.PeerSelection.PeerSharing (PeerSharing (..))
130135
import Ouroboros.Network.PeerSelection.PeerTrustable (PeerTrustable)
131-
import Ouroboros.Network.PeerSelection.Bootstrap (UseBootstrapPeers)
136+
137+
import Ouroboros.Network.PeerSelection.State.LocalRootPeers (HotValency, WarmValency)
138+
132139

133140
{- HLINT ignore "Fuse concatMap/map" -}
134141
{- HLINT ignore "Redundant <$>" -}
@@ -240,8 +247,8 @@ handleNodeWithTracers cmdPc nc0 p networkMagic blockType runP = do
240247
blockForging <- snd (Api.protocolInfo runP)
241248
traceWith (startupTracer tracers)
242249
(BlockForgingUpdate (if null blockForging
243-
then EnabledBlockForging
244-
else DisabledBlockForging))
250+
then DisabledBlockForging
251+
else EnabledBlockForging))
245252

246253
handleSimpleNode blockType runP p2pMode tracers nc
247254
(\nk -> do
@@ -280,12 +287,13 @@ handleNodeWithTracers cmdPc nc0 p networkMagic blockType runP = do
280287
getStartupInfo nc p fp
281288
>>= mapM_ (traceWith $ startupTracer tracers)
282289

290+
traceWith (nodeVersionTracer tracers) getNodeVersion
291+
283292
blockForging <- snd (Api.protocolInfo runP)
284293
traceWith (startupTracer tracers)
285294
(BlockForgingUpdate (if null blockForging
286-
then EnabledBlockForging
287-
else DisabledBlockForging))
288-
295+
then DisabledBlockForging
296+
else EnabledBlockForging))
289297

290298
-- We ignore peer logging thread if it dies, but it will be killed
291299
-- when 'handleSimpleNode' terminates.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import Cardano.Node.Tracing.StateRep (NodeState)
1616
import Cardano.Node.Tracing.Tracers.ConsensusStartupException
1717
(ConsensusStartupException (..))
1818
import Cardano.Node.Tracing.Tracers.Peer (PeerT)
19+
import Cardano.Node.Tracing.Tracers.NodeVersion (NodeVersionTrace)
20+
1921
import qualified Ouroboros.Consensus.Network.NodeToClient as NodeToClient
2022
import qualified Ouroboros.Consensus.Network.NodeToNode as NodeToNode
2123
import qualified Ouroboros.Consensus.Node.Tracers as Consensus
@@ -48,6 +50,7 @@ data Tracers peer localPeer blk p2p = Tracers
4850
, startupTracer :: !(Tracer IO (StartupTrace blk))
4951
, shutdownTracer :: !(Tracer IO ShutdownTrace)
5052
, nodeInfoTracer :: !(Tracer IO NodeInfo)
53+
, nodeVersionTracer :: !(Tracer IO NodeVersionTrace)
5154
, nodeStartupInfoTracer :: !(Tracer IO NodeStartupInfo)
5255
, nodeStateTracer :: !(Tracer IO NodeState)
5356
, resourcesTracer :: !(Tracer IO ResourceStats)

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import Cardano.Node.Tracing.Tracers.Diffusion ()
2727
import Cardano.Node.Tracing.Tracers.KESInfo ()
2828
import Cardano.Node.Tracing.Tracers.NodeToClient ()
2929
import Cardano.Node.Tracing.Tracers.NodeToNode ()
30+
import Cardano.Node.Tracing.Tracers.NodeVersion (NodeVersionTrace)
31+
3032
import Cardano.Node.Tracing.Tracers.NonP2P ()
3133
import Cardano.Node.Tracing.Tracers.P2P ()
3234
import Cardano.Node.Tracing.Tracers.Peer
@@ -130,6 +132,9 @@ getAllNamespaces =
130132
(allNamespaces :: [Namespace (StartupTrace blk)])
131133
shutdownNS = map (nsGetTuple . nsReplacePrefix ["Shutdown"])
132134
(allNamespaces :: [Namespace ShutdownTrace])
135+
nodeVersionNS = map (nsGetTuple . nsReplacePrefix ["Version"])
136+
(allNamespaces :: [Namespace NodeVersionTrace])
137+
133138
chainDBNS = map (nsGetTuple . nsReplacePrefix ["ChainDB"])
134139
(allNamespaces :: [Namespace (ChainDB.TraceEvent blk)])
135140
replayBlockNS = map (nsGetTuple . nsReplacePrefix ["ChainDB", "ReplayBlock"])
@@ -366,6 +371,7 @@ getAllNamespaces =
366371
<> resourcesNS
367372
<> startupNS
368373
<> shutdownNS
374+
<> nodeVersionNS
369375
<> chainDBNS
370376
<> replayBlockNS
371377
-- Consensus

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ import Cardano.Node.Tracing.Tracers.ForgingThreadStats (ForgeThreadSta
3535
import Cardano.Node.Tracing.Tracers.KESInfo ()
3636
import Cardano.Node.Tracing.Tracers.NodeToClient ()
3737
import Cardano.Node.Tracing.Tracers.NodeToNode ()
38+
import Cardano.Node.Tracing.Tracers.NodeVersion (NodeVersionTrace)
39+
3840
import Cardano.Node.Tracing.Tracers.NonP2P ()
3941
import Cardano.Node.Tracing.Tracers.P2P ()
4042
import Cardano.Node.Tracing.Tracers.Peer
@@ -192,6 +194,12 @@ docTracersFirstPhase condConfigFileName = do
192194
nodeStartupInfoDpDoc <- documentTracer
193195
(nodeStartupInfoDp :: Trace IO NodeStartupInfo)
194196

197+
nodeVersionTr <- mkCardanoTracer
198+
trBase trForward mbTrEKG
199+
["Version"]
200+
configureTracers configReflection trConfig [nodeVersionTr]
201+
nodeVersionDoc <- documentTracer (nodeVersionTr :: Trace IO NodeVersionTrace)
202+
195203
-- State tracer
196204
stateTr <- mkCardanoTracer
197205
trBase trForward mbTrEKG
@@ -677,6 +685,7 @@ docTracersFirstPhase condConfigFileName = do
677685
<> resourcesTrDoc
678686
<> startupTrDoc
679687
<> shutdownTrDoc
688+
<> nodeVersionDoc
680689
<> peersTrDoc
681690
<> chainDBTrDoc
682691
<> replayBlockTrDoc

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import Cardano.Node.Tracing.Tracers.ForgingThreadStats (forgeThreadSta
3333
import Cardano.Node.Tracing.Tracers.KESInfo
3434
import Cardano.Node.Tracing.Tracers.NodeToClient ()
3535
import Cardano.Node.Tracing.Tracers.NodeToNode ()
36+
import Cardano.Node.Tracing.Tracers.NodeVersion (getNodeVersion)
37+
3638
import Cardano.Node.Tracing.Tracers.NonP2P ()
3739
import Cardano.Node.Tracing.Tracers.P2P ()
3840
import Cardano.Node.Tracing.Tracers.Peer ()
@@ -125,6 +127,10 @@ mkDispatchTracers nodeKernel trBase trForward mbTrEKG trDataPoint trConfig enabl
125127
!chainDBTr <- mkCardanoTracer' trBase trForward mbTrEKG ["ChainDB"]
126128
withAddedToCurrentChainEmptyLimited
127129
configureTracers configReflection trConfig [chainDBTr]
130+
131+
!nodeVersionTr <- mkCardanoTracer trBase trForward mbTrEKG ["Version"]
132+
configureTracers configReflection trConfig [nodeVersionTr]
133+
128134
-- Filter out replayed blocks for this tracer
129135
let chainDBTr' = filterTrace
130136
(\case (_, ChainDB.TraceLedgerReplayEvent
@@ -170,6 +176,8 @@ mkDispatchTracers nodeKernel trBase trForward mbTrEKG trDataPoint trConfig enabl
170176

171177
traceEffectiveConfiguration trBase trForward trConfig
172178

179+
traceWith nodeVersionTr getNodeVersion
180+
173181
pure Tracers
174182
{
175183
chainDBTracer = Tracer (traceWith chainDBTr')
@@ -188,6 +196,7 @@ mkDispatchTracers nodeKernel trBase trForward mbTrEKG trDataPoint trConfig enabl
188196
, nodeStartupInfoTracer = Tracer (traceWith nodeStartupInfoDP)
189197
, nodeStateTracer = Tracer (traceWith stateTr)
190198
<> Tracer (traceWith nodeStateDP)
199+
, nodeVersionTracer = Tracer (traceWith nodeVersionTr)
191200
, resourcesTracer = Tracer (traceWith resourcesTr)
192201
, peersTracer = Tracer (traceWith peersTr)
193202
<> Tracer (traceNodePeers nodePeersDP)
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
{-# LANGUAGE CPP #-}
2+
{-# LANGUAGE OverloadedStrings #-}
3+
{-# LANGUAGE RecordWildCards #-}
4+
{-# LANGUAGE TemplateHaskell #-}
5+
6+
{-# OPTIONS_GHC -Wno-name-shadowing #-}
7+
8+
module Cardano.Node.Tracing.Tracers.NodeVersion
9+
(
10+
NodeVersionTrace (..)
11+
, getNodeVersion
12+
, getCardanoBuildInfo
13+
)
14+
where
15+
16+
import Data.Aeson (toJSON, (.=))
17+
import Data.Text (Text, pack)
18+
import Data.Version (Version (..), showVersion)
19+
#if MIN_VERSION_base(4,15,0)
20+
import System.Info (arch, compilerName, fullCompilerVersion, os)
21+
#else
22+
import System.Info (arch, compilerName, compilerVersion, os)
23+
#endif
24+
25+
import Cardano.Git.Rev (gitRev)
26+
import Cardano.Logging
27+
28+
import Paths_cardano_node (version)
29+
30+
31+
32+
-- | Node version information
33+
34+
data NodeVersionTrace = NodeVersionTrace
35+
{ applicationName :: Text
36+
, applicationVersion :: Version
37+
, osName :: Text
38+
, architecture :: Text
39+
, compilerName :: Text
40+
, compilerVersion :: Version
41+
, gitRevision :: Text
42+
} deriving (Eq, Show)
43+
44+
-- | Get the node version information
45+
46+
getComplierVersion :: Version
47+
#if MIN_VERSION_base(4,15,0)
48+
getComplierVersion = System.Info.fullCompilerVersion
49+
#else
50+
getComplierVersion = System.Info.compilerVersion
51+
#endif
52+
53+
getNodeVersion :: NodeVersionTrace
54+
getNodeVersion =
55+
let applicationName = "cardano-node"
56+
applicationVersion = version
57+
osName = pack os
58+
architecture = pack arch
59+
compilerName = pack System.Info.compilerName
60+
compilerVersion = getComplierVersion
61+
gitRevision = $(gitRev)
62+
in NodeVersionTrace {..}
63+
64+
65+
instance MetaTrace NodeVersionTrace where
66+
namespaceFor NodeVersionTrace {} =
67+
Namespace [] ["NodeVersion"]
68+
severityFor (Namespace _ ["NodeVersion"]) _ = Just Info
69+
severityFor _ _ = Nothing
70+
71+
documentFor (Namespace _ ["NodeVersion"]) = Just "Node version information"
72+
73+
documentFor _ = Nothing
74+
75+
metricsDocFor (Namespace _ ["NodeVersion"]) =
76+
[("cardano_version_major", "Cardano node version information")
77+
,("cardano_version_minor", "Cardano node version information")
78+
,("cardano_version_patch", "Cardano node version information")
79+
,("haskell_compiler_major", "Cardano compiler version information")
80+
,("haskell_compiler_minor", "Cardano compiler version information")
81+
82+
#if MIN_VERSION_base(4,15,0)
83+
,("haskell_compiler_patch", "Cardano compiler version information")
84+
#endif
85+
,("cardano_build_info", "Cardano node build info")
86+
]
87+
metricsDocFor _ = []
88+
89+
allNamespaces = [Namespace [] ["NodeVersion"]]
90+
91+
instance LogFormatting NodeVersionTrace where
92+
forHuman NodeVersionTrace {..} = mconcat
93+
[ "cardano-node ", pack (showVersion applicationVersion)
94+
, " git rev ", gitRevision
95+
, " - ", pack os, "-", pack arch
96+
, " - ", compilerName, "-", pack (showVersion compilerVersion)
97+
]
98+
99+
forMachine _dtal NodeVersionTrace {..} = mconcat
100+
101+
[ "applicationName" .= applicationName
102+
, "applicationVersion" .= toJSON applicationVersion
103+
, "gitRevision" .= gitRevision
104+
, "osName" .= osName
105+
, "architecture" .= architecture
106+
, "compilerName" .= compilerName
107+
, "compilerVersion" .= toJSON compilerVersion
108+
]
109+
110+
asMetrics nvt@NodeVersionTrace {..} =
111+
[ IntM "cardano_version_major" (fromIntegral (getMajor applicationVersion))
112+
, IntM "cardano_version_minor" (fromIntegral (getMinor applicationVersion))
113+
, IntM "cardano_version_patch" (fromIntegral (getPatch applicationVersion))
114+
, IntM "haskell_compiler_major" (fromIntegral (getMajor compilerVersion))
115+
, IntM "haskell_compiler_minor" (fromIntegral (getMinor compilerVersion))
116+
#if MIN_VERSION_base(4,15,0)
117+
, IntM "haskell_compiler_patch" (fromIntegral (getPatch compilerVersion))
118+
#endif
119+
, PrometheusM "cardano_build_info" (getCardanoBuildInfo nvt)
120+
]
121+
122+
getCardanoBuildInfo :: NodeVersionTrace -> [(Text,Text)]
123+
getCardanoBuildInfo NodeVersionTrace {..} =
124+
[ ("version_major", pack (show (getMajor applicationVersion)))
125+
, ("version_minor", pack (show (getMinor applicationVersion)))
126+
, ("version_patch", pack (show (getPatch applicationVersion)))
127+
, ("version", pack (showVersion applicationVersion))
128+
, ("revision", gitRevision)
129+
, ("compiler_name", compilerName)
130+
, ("compiler_version", pack (showVersion compilerVersion))
131+
, ("compiler_version_major", pack (show (getMajor compilerVersion)))
132+
, ("compiler_version_minor", pack (show (getMinor compilerVersion)))
133+
#if MIN_VERSION_base(4,15,0)
134+
, ("compiler_version_patch", pack (show (getPatch compilerVersion)))
135+
#endif
136+
, ("architecture", architecture)
137+
, ("os_name", osName)
138+
]
139+
140+
getMajor :: Version -> Int
141+
getMajor (Version (x:_) _) = x
142+
getMajor _ = 0
143+
144+
getMinor :: Version -> Int
145+
getMinor (Version (_:x:_) _) = x
146+
getMinor _ = 0
147+
148+
getPatch :: Version -> Int
149+
getPatch (Version (_:_:x:_) _) = x
150+
getPatch _ = 0
151+
152+
153+

cardano-node/src/Cardano/Node/Tracing/Tracers/Startup.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ import Cardano.Logging
2525
import Cardano.Node.Configuration.POM (NodeConfiguration, ncProtocol)
2626
import Cardano.Node.Configuration.Socket
2727
import Cardano.Node.Protocol (SomeConsensusProtocol (..))
28+
2829
import Cardano.Node.Startup
30+
2931
import Cardano.Slotting.Slot (EpochSize (..))
3032
import qualified Ouroboros.Consensus.BlockchainTime.WallClock.Types as WCT
3133
import Ouroboros.Consensus.Byron.Ledger.Conversions (fromByronEpochSlots,
@@ -54,6 +56,7 @@ import Data.Text (Text, pack)
5456
import Data.Time (getCurrentTime)
5557
import Data.Time.Clock.POSIX (POSIXTime, utcTimeToPOSIXSeconds)
5658
import Data.Version (showVersion)
59+
5760
import Network.Socket (SockAddr)
5861

5962
import Paths_cardano_node (version)

0 commit comments

Comments
 (0)