Skip to content

Commit

Permalink
CAD-2572 Fixes in interface to EKG
Browse files Browse the repository at this point in the history
  • Loading branch information
jutaro committed May 13, 2021
1 parent d418370 commit 1a63bb2
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 18 deletions.
34 changes: 29 additions & 5 deletions cardano-node/src/Cardano/Node/Configuration/Logging.hs
Expand Up @@ -7,6 +7,7 @@

module Cardano.Node.Configuration.Logging
( LoggingLayer (..)
, EKGDirect(..)
, createLoggingLayer
, nodeBasicInfo
, shutdownLoggingLayer
Expand All @@ -25,13 +26,18 @@ import Cardano.Prelude hiding (trace)

import qualified Control.Concurrent.Async as Async
import Control.Exception.Safe (MonadCatch)
import GHC.Err (error)
import Control.Monad.Trans.Except.Extra (catchIOExceptT)
import Control.Tracer
import Data.IORef (IORef, newIORef)
import Data.List (nub)
import qualified Data.Map as Map
import Data.Text (pack)
import Data.Time.Clock (UTCTime, getCurrentTime)
import Data.Version (showVersion)
import qualified System.Remote.Monitoring as EKG
import System.Metrics.Gauge (Gauge)
import System.Metrics.Label (Label)

import Cardano.BM.Backend.Aggregation (plugin)
import Cardano.BM.Backend.EKGView (plugin)
Expand Down Expand Up @@ -110,7 +116,13 @@ data LoggingLayer = LoggingLayer
, llConfiguration :: Configuration
, llAddBackend :: Backend Text -> BackendKind -> IO ()
, llSwitchboard :: Switchboard Text
, llEKGServer :: Maybe EKG.Server
, llEKGDirect :: EKGDirect
}

data EKGDirect = EKGDirect
{ ekgServer :: EKG.Server
, ekgGauges :: IORef (Map.Map Text Gauge)
, ekgLabels :: IORef (Map.Map Text Label)
}

--------------------------------
Expand Down Expand Up @@ -167,7 +179,19 @@ createLoggingLayer ver nodeConfig' p = do

mEKGServer <- liftIO $ Switchboard.getSbEKGServer switchBoard

pure $ mkLogLayer logConfig switchBoard mEKGServer trace
ekgDirect <- case mEKGServer of
Nothing -> error
"EKGDirect can't extract EKGServer from iohk-logging"
Just sv -> do
refGauge <- liftIO $ newIORef (Map.empty)
refLabel <- liftIO $ newIORef (Map.empty)
pure EKGDirect {
ekgServer = sv
, ekgGauges = refGauge
, ekgLabels = refLabel
}

pure $ mkLogLayer logConfig switchBoard ekgDirect trace
where
loggingPreInit
:: NodeConfiguration
Expand Down Expand Up @@ -221,8 +245,8 @@ createLoggingLayer ver nodeConfig' p = do
-- Record node metrics, if configured
startCapturingMetrics trace

mkLogLayer :: Configuration -> Switchboard Text -> Maybe EKG.Server -> Trace IO Text -> LoggingLayer
mkLogLayer logConfig switchBoard mEKGServer trace =
mkLogLayer :: Configuration -> Switchboard Text -> EKGDirect -> Trace IO Text -> LoggingLayer
mkLogLayer logConfig switchBoard ekgDirect trace =
LoggingLayer
{ llBasicTrace = Trace.natTrace liftIO trace
, llLogDebug = Trace.logDebug
Expand All @@ -239,7 +263,7 @@ createLoggingLayer ver nodeConfig' p = do
, llConfiguration = logConfig
, llAddBackend = Switchboard.addExternalBackend switchBoard
, llSwitchboard = switchBoard
, llEKGServer = mEKGServer
, llEKGDirect = ekgDirect
}

startCapturingMetrics :: Trace IO Text -> IO ()
Expand Down
2 changes: 1 addition & 1 deletion cardano-node/src/Cardano/Node/Run.hs
Expand Up @@ -129,7 +129,7 @@ runNode cmdPc = do
(ncTraceConfig nc)
trace
nodeKernelData
(llEKGServer loggingLayer)
(llEKGDirect loggingLayer)

Async.withAsync (handlePeersListSimple trace nodeKernelData)
$ \_peerLogingThread ->
Expand Down
39 changes: 27 additions & 12 deletions cardano-node/src/Cardano/Tracing/Tracers.hs
Expand Up @@ -31,6 +31,8 @@ import GHC.Clock (getMonotonicTimeNSec)
import Codec.CBOR.Read (DeserialiseFailure)
import Data.Aeson (ToJSON (..), Value (..))
import qualified Data.HashMap.Strict as Map
import qualified Data.Map as SMap
import Data.IORef (readIORef, writeIORef)
import qualified Data.Text as Text
import Data.Time (UTCTime)
import qualified System.Remote.Monitoring as EKG
Expand Down Expand Up @@ -277,9 +279,9 @@ mkTracers
=> TraceOptions
-> Trace IO Text
-> NodeKernelData blk
-> Maybe EKG.Server
-> EKGDirect
-> IO (Tracers peer localPeer blk)
mkTracers tOpts@(TracingOn trSel) tr nodeKern mEKGServer = do
mkTracers tOpts@(TracingOn trSel) tr nodeKern ekgDirect = do
fStats <- mkForgingStats
consensusTracers <- mkConsensusTracers trSel verb tr nodeKern fStats
elidedChainDB <- newstate -- for eliding messages in ChainDB tracer
Expand All @@ -288,7 +290,7 @@ mkTracers tOpts@(TracingOn trSel) tr nodeKern mEKGServer = do
{ chainDBTracer = tracerOnOff' (traceChainDB trSel) $
annotateSeverity $ teeTraceChainTip
tOpts elidedChainDB
mEKGServer
ekgDirect
(appendName "ChainDB" tr)
(appendName "metrics" tr)
, consensusTracers = consensusTracers
Expand Down Expand Up @@ -366,15 +368,15 @@ teeTraceChainTip
)
=> TraceOptions
-> MVar (Maybe (WithSeverity (ChainDB.TraceEvent blk)), Integer)
-> Maybe EKG.Server
-> EKGDirect
-> Trace IO Text
-> Trace IO Text
-> Tracer IO (WithSeverity (ChainDB.TraceEvent blk))
teeTraceChainTip TracingOff _ _ _ _ = nullTracer
teeTraceChainTip (TracingOn trSel) elided mEKGServer trTrc trMet =
teeTraceChainTip (TracingOn trSel) elided ekgDirect trTrc trMet =
Tracer $ \ev -> do
traceWith (teeTraceChainTipElide (traceVerbosity trSel) elided trTrc) ev
traceWith (ignoringSeverity (traceChainMetrics mEKGServer trMet)) ev
traceWith (ignoringSeverity (traceChainMetrics ekgDirect trMet)) ev

teeTraceChainTipElide
:: ( ConvertRawHash blk
Expand All @@ -396,9 +398,8 @@ ignoringSeverity tr = Tracer $ \(WithSeverity _ ev) -> traceWith tr ev

traceChainMetrics
:: forall blk. HasHeader (Header blk)
=> Maybe EKG.Server -> Trace IO Text -> Tracer IO (ChainDB.TraceEvent blk)
traceChainMetrics Nothing _ = nullTracer
traceChainMetrics (Just eKGServer) _tr = Tracer $ \ev ->
=> EKGDirect -> Trace IO Text -> Tracer IO (ChainDB.TraceEvent blk)
traceChainMetrics ekgDirect _tr = Tracer $ \ev ->
fromMaybe (pure ()) $
doTrace <$> chainTipInformation ev
where
Expand All @@ -421,12 +422,26 @@ traceChainMetrics (Just eKGServer) _tr = Tracer $ \ev ->
sendEKGDirectInt "cardano_node_metrics_epoch" (unEpochNo epoch)

sendEKGDirectInt :: Integral a => Text -> a -> IO ()
sendEKGDirectInt name val =
flip Gauge.set (fromIntegral val) =<< EKG.getGauge name eKGServer
sendEKGDirectInt name val = do
registeredMap <- readIORef (ekgGauges ekgDirect)
case SMap.lookup name registeredMap of
Just gauge -> Gauge.set gauge (fromIntegral val)
Nothing -> do
gauge <- EKG.getGauge name (ekgServer ekgDirect)
let registeredMap' = SMap.insert name gauge registeredMap
writeIORef (ekgGauges ekgDirect) registeredMap'
Gauge.set gauge (fromIntegral val)

sendEKGDirectDouble :: Text -> Double -> IO ()
sendEKGDirectDouble name val = do
flip Label.set (Text.pack (show val)) =<< EKG.getLabel name eKGServer
registeredMap <- readIORef (ekgLabels ekgDirect)
case SMap.lookup name registeredMap of
Just label -> Label.set label (Text.pack (show val))
Nothing -> do
label <- EKG.getLabel name (ekgServer ekgDirect)
let registeredMap' = SMap.insert name label registeredMap
writeIORef (ekgLabels ekgDirect) registeredMap'
Label.set label (Text.pack (show val))

traceI :: Integral i => Trace IO a -> LOMeta -> Text -> i -> IO ()
traceI tr meta msg i = traceNamedObject tr (meta, LogValue msg (PureI (fromIntegral i)))
Expand Down

0 comments on commit 1a63bb2

Please sign in to comment.