diff --git a/bench/tx-generator/src/Cardano/Benchmarking/Tracer.hs b/bench/tx-generator/src/Cardano/Benchmarking/Tracer.hs index 813752f983e..868efddd8fd 100644 --- a/bench/tx-generator/src/Cardano/Benchmarking/Tracer.hs +++ b/bench/tx-generator/src/Cardano/Benchmarking/Tracer.hs @@ -49,8 +49,8 @@ import qualified Data.Text as Text import Data.Time.Clock import GHC.Generics -import Trace.Forward.Utils.DataPoint import Trace.Forward.Utils.TraceObject +import Trace.Forward.Forwarding (initForwardingDelayed) pattern TracerNameBench :: Text pattern TracerNameBench = "Benchmark" @@ -121,7 +121,7 @@ initTxGenTracers mbForwarding = do prepareForwardingTracer = forM mbForwarding $ \(iomgr, networkId, tracerSocket) -> do let forwardingConf = fromMaybe defaultForwarder (tcForwarder initialTraceConfig) - (forwardSink :: ForwardSink TraceObject, dpStore, kickoffForwarder) <- + (forwardSink, dpStore, kickoffForwarder) <- initForwardingDelayed iomgr forwardingConf (toNetworkMagic networkId) Nothing $ Just (Net.LocalPipe tracerSocket, Initiator) -- we need to provide NodeInfo DataPoint, to forward generator's name @@ -134,7 +134,7 @@ initTxGenTracers mbForwarding = do traceWith nodeInfoTracer genInfo kickoffForwarder - pure $ forwardTracer forwardSink + pure $ forwardTracer (writeToSink forwardSink) prepareGenInfo :: IO NodeInfo prepareGenInfo = diff --git a/cardano-node/cardano-node.cabal b/cardano-node/cardano-node.cabal index e9271d0aa9c..d52470c544e 100644 --- a/cardano-node/cardano-node.cabal +++ b/cardano-node/cardano-node.cabal @@ -211,8 +211,8 @@ library , sop-extras , text >= 2.0 , time - , trace-dispatcher ^>= 2.9.2 - , trace-forward ^>= 2.2.11 + , trace-dispatcher ^>= 2.10.0 + , trace-forward ^>= 2.3.0 , trace-resources ^>= 0.2.3 , tracer-transformers , transformers diff --git a/cardano-node/src/Cardano/Node/Tracing/API.hs b/cardano-node/src/Cardano/Node/Tracing/API.hs index 40785f79356..fade2d23052 100644 --- a/cardano-node/src/Cardano/Node/Tracing/API.hs +++ b/cardano-node/src/Cardano/Node/Tracing/API.hs @@ -51,6 +51,8 @@ import Data.Time.Clock (getCurrentTime) import Network.Mux.Trace (TraceLabelPeer (..)) import Network.Socket (HostName) import System.Metrics as EKG +import Trace.Forward.Forwarding (initForwardingDelayed) +import Trace.Forward.Utils.TraceObject (writeToSink) initTraceDispatcher :: @@ -130,7 +132,7 @@ initTraceDispatcher nc p networkMagic nodeKernel p2pMode noBlockForging = do forwardingConf :: TraceOptionForwarder forwardingConf = fromMaybe defaultForwarder (tcForwarder trConfig) initForwardingDelayed iomgr forwardingConf networkMagic (Just ekgStore) tracerSocketMode - pure (forwardTracer forwardSink, dataPointTracer dpStore, kickoffForwarder) + pure (forwardTracer (writeToSink forwardSink), dataPointTracer dpStore, kickoffForwarder) else -- Since 'Forwarder' backend isn't enabled, there is no forwarding. -- So we use nullTracers to ignore 'TraceObject's and 'DataPoint's. diff --git a/cardano-node/src/Cardano/Node/Tracing/Tracers.hs b/cardano-node/src/Cardano/Node/Tracing/Tracers.hs index da4c82fd265..9182fbb0842 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Tracers.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Tracers.hs @@ -73,8 +73,6 @@ import Data.Proxy (Proxy (..)) import Network.Mux.Trace (TraceLabelPeer (..)) import Network.Socket (SockAddr) -import Trace.Forward.Utils.DataPoint (DataPoint) - -- | Construct tracers for all system components. -- mkDispatchTracers diff --git a/cardano-tracer/cardano-tracer.cabal b/cardano-tracer/cardano-tracer.cabal index 02de92da2c6..491e30c5b87 100644 --- a/cardano-tracer/cardano-tracer.cabal +++ b/cardano-tracer/cardano-tracer.cabal @@ -197,8 +197,8 @@ library , string-qq , text , time - , trace-dispatcher ^>= 2.9.2 - , trace-forward ^>= 2.2.11 + , trace-dispatcher ^>= 2.10.0 + , trace-forward ^>= 2.3.0 , trace-resources ^>= 0.2.3 , wai ^>= 3.2 , warp ^>= 3.4 diff --git a/cardano-tracer/src/Cardano/Tracer/Handlers/ReForwarder.hs b/cardano-tracer/src/Cardano/Tracer/Handlers/ReForwarder.hs index 1f28b06b60b..5bac9be662a 100644 --- a/cardano-tracer/src/Cardano/Tracer/Handlers/ReForwarder.hs +++ b/cardano-tracer/src/Cardano/Tracer/Handlers/ReForwarder.hs @@ -15,7 +15,7 @@ module Cardano.Tracer.Handlers.ReForwarder ( initReForwarder ) where -import Cardano.Logging.Forwarding +import Trace.Forward.Forwarding import Cardano.Logging.Trace import Cardano.Logging.Tracer.DataPoint import qualified Cardano.Logging.Types as Log @@ -29,8 +29,8 @@ import Control.Monad (when) import Data.List (isPrefixOf) import qualified Data.Text as Text -import Trace.Forward.Utils.DataPoint -import Trace.Forward.Utils.TraceObject (ForwardSink, writeToSink) +import Trace.Forward.Utils.TraceObject (writeToSink) +import Trace.Forward.Utils.ForwardSink (ForwardSink) -- | Initialize the reforwarding service if configured to be active. -- Returns diff --git a/cardano-tracer/test/Cardano/Tracer/Test/Forwarder.hs b/cardano-tracer/test/Cardano/Tracer/Test/Forwarder.hs index 3a7c8863c5c..4009be163c8 100644 --- a/cardano-tracer/test/Cardano/Tracer/Test/Forwarder.hs +++ b/cardano-tracer/test/Cardano/Tracer/Test/Forwarder.hs @@ -71,6 +71,7 @@ import Trace.Forward.Run.DataPoint.Forwarder import Trace.Forward.Run.TraceObject.Forwarder import Trace.Forward.Utils.DataPoint import Trace.Forward.Utils.TraceObject +import Trace.Forward.Utils.ForwardSink (ForwardSink) data ForwardersMode = Initiator | Responder diff --git a/cardano-tracer/test/cardano-tracer-test-ext.hs b/cardano-tracer/test/cardano-tracer-test-ext.hs index 4b578f4c0fc..9990f4e0307 100644 --- a/cardano-tracer/test/cardano-tracer-test-ext.hs +++ b/cardano-tracer/test/cardano-tracer-test-ext.hs @@ -29,6 +29,8 @@ import qualified System.Process as Sys import Test.Tasty import Test.Tasty.QuickCheck +import Trace.Forward.Forwarding (initForwarding) +import Trace.Forward.Utils.TraceObject (writeToSink) main :: IO () main = do @@ -137,4 +139,4 @@ getExternalTracerState TestSetup{..} ref = do let tracerSocketMode = Just (Net.LocalPipe (unI tsSockExternal), Initiator) forwardingConf = fromMaybe defaultForwarder (tcForwarder simpleTestConfig) initForwarding iomgr forwardingConf (unI tsNetworkMagic) Nothing tracerSocketMode - pure (externalTracerHdl, forwardTracer forwardSink) + pure (externalTracerHdl, forwardTracer (writeToSink forwardSink)) diff --git a/trace-dispatcher/src/Cardano/Logging.hs b/trace-dispatcher/src/Cardano/Logging.hs index dd666a2f6d3..9ae3531d7d6 100644 --- a/trace-dispatcher/src/Cardano/Logging.hs +++ b/trace-dispatcher/src/Cardano/Logging.hs @@ -7,7 +7,6 @@ import Cardano.Logging.ConfigurationParser as X import Cardano.Logging.Consistency as X import Cardano.Logging.DocuGenerator as X import Cardano.Logging.Formatter as X -import Cardano.Logging.Forwarding as X import Cardano.Logging.FrequencyLimiter as X import Cardano.Logging.Trace as X import Cardano.Logging.TraceDispatcherMessage as X diff --git a/trace-dispatcher/src/Cardano/Logging/DocuGenerator.hs b/trace-dispatcher/src/Cardano/Logging/DocuGenerator.hs index 89e0d4f3572..6d0ef22811e 100644 --- a/trace-dispatcher/src/Cardano/Logging/DocuGenerator.hs +++ b/trace-dispatcher/src/Cardano/Logging/DocuGenerator.hs @@ -45,8 +45,6 @@ import Data.Text.Lazy (toStrict) import Data.Text.Lazy.Builder (Builder, fromString, fromText, singleton) import Data.Time (getZonedTime) -import Trace.Forward.Utils.DataPoint (DataPoint (..)) - type InconsistencyWarning = Text utf16CircledT :: Text @@ -351,7 +349,7 @@ docTracer backendConfig = Trace $ TR.arrow $ TR.emit output docTracerDatapoint :: MonadIO m => BackendConfig - -> Trace m DataPoint + -> Trace m a docTracerDatapoint backendConfig = Trace $ TR.arrow $ TR.emit output where output p@(_, Left TCDocument {}) = diff --git a/trace-dispatcher/src/Cardano/Logging/Tracer/DataPoint.hs b/trace-dispatcher/src/Cardano/Logging/Tracer/DataPoint.hs index 3d05f3264d5..95ce048cf7d 100644 --- a/trace-dispatcher/src/Cardano/Logging/Tracer/DataPoint.hs +++ b/trace-dispatcher/src/Cardano/Logging/Tracer/DataPoint.hs @@ -1,11 +1,18 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE GADTs #-} module Cardano.Logging.Tracer.DataPoint ( - dataPointTracer + DataPoint (..) + , DataPointName + , DataPointStore + , initDataPointStore + , writeToStore + , dataPointTracer , mkDataPointTracer ) where @@ -13,15 +20,45 @@ import Cardano.Logging.DocuGenerator import Cardano.Logging.Trace import Cardano.Logging.Types -import Control.DeepSeq (NFData) +import Control.Concurrent.STM (atomically) +import Control.Concurrent.STM.TVar +import Control.DeepSeq (NFData, deepseq) import Control.Monad.IO.Class import qualified Control.Tracer as NT -import Data.Aeson.Types (ToJSON) +import Data.Aeson +import qualified Data.Map.Strict as M import Data.Text (Text, intercalate) -import Trace.Forward.Utils.DataPoint (DataPoint (..), DataPointStore, writeToStore) - --------------------------------------------------------------------------- +-- +-- | Type wrapper for some value of type 'v'. The only reason we need this +-- wrapper is an ability to store different values in the same 'DataPointStore'. +-- +-- Please note that when the acceptor application will read the value of type 'v' +-- from the store, this value is just as unstructured JSON, but not Haskell +-- value of type 'v'. That's why 'FromJSON' instance for type 'v' should be +-- available for the acceptor application, to decode unstructured JSON. +-- +data DataPoint where + DataPoint :: (ToJSON v, NFData v) => v -> DataPoint + +type DataPointName = Text +type DataPointStore = TVar (M.Map DataPointName DataPoint) + +initDataPointStore :: IO DataPointStore +initDataPointStore = newTVarIO M.empty + +-- | Write 'DataPoint' to the store. +writeToStore + :: DataPointStore + -> DataPointName + -> DataPoint + -> IO () +writeToStore dpStore dpName (DataPoint obj) = atomically $ + modifyTVar' dpStore $ \store -> + if dpName `M.member` store + then M.adjust (const (DataPoint (deepseq obj obj))) dpName store + else M.insert dpName (DataPoint (deepseq obj obj)) store dataPointTracer :: forall m. MonadIO m => DataPointStore diff --git a/trace-dispatcher/src/Cardano/Logging/Tracer/Forward.hs b/trace-dispatcher/src/Cardano/Logging/Tracer/Forward.hs index df01a842342..4801818d155 100644 --- a/trace-dispatcher/src/Cardano/Logging/Tracer/Forward.hs +++ b/trace-dispatcher/src/Cardano/Logging/Tracer/Forward.hs @@ -13,29 +13,26 @@ import Cardano.Logging.Types import Control.Monad.IO.Class import qualified Control.Tracer as T -import Trace.Forward.Utils.TraceObject (ForwardSink, writeToSink) - --------------------------------------------------------------------------- -- | It is mandatory to construct only one forwardTracer tracer in any application! -- Throwing away a forwardTracer tracer and using a new one will result in an exception forwardTracer :: forall m. (MonadIO m) - => ForwardSink TraceObject + => (TraceObject -> IO ()) -> Trace m FormattedMessage -forwardTracer forwardSink = - Trace $ T.arrow $ T.emit $ uncurry (output forwardSink) +forwardTracer write = + Trace $ T.arrow $ T.emit $ uncurry output where output :: - ForwardSink TraceObject - -> LoggingContext + LoggingContext -> Either TraceControl FormattedMessage -> m () - output sink LoggingContext {} (Right (FormattedForwarder lo)) = liftIO $ - writeToSink sink lo - output _sink LoggingContext {} (Left TCReset) = liftIO $ do + output LoggingContext {} (Right (FormattedForwarder lo)) = liftIO $ + write lo + output LoggingContext {} (Left TCReset) = liftIO $ do pure () - output _sink lk (Left c@TCDocument {}) = + output lk (Left c@TCDocument {}) = docIt Forwarder (lk, Left c) - output _sink LoggingContext {} (Right _) = pure () - output _sink LoggingContext {} _ = pure () + output LoggingContext {} (Right _) = pure () + output LoggingContext {} _ = pure () diff --git a/trace-dispatcher/src/Cardano/Logging/Types.hs b/trace-dispatcher/src/Cardano/Logging/Types.hs index ea287e51aed..aa6037175b5 100644 --- a/trace-dispatcher/src/Cardano/Logging/Types.hs +++ b/trace-dispatcher/src/Cardano/Logging/Types.hs @@ -59,7 +59,7 @@ module Cardano.Logging.Types ( ) where -import Ouroboros.Network.Util.ShowProxy (ShowProxy (..)) +-- import Ouroboros.Network.Util.ShowProxy (ShowProxy (..)) import Codec.Serialise (Serialise (..)) import qualified Control.Tracer as T @@ -386,7 +386,7 @@ data TraceObject = TraceObject { (Eq, Show, Generic) -- ^ Instances for 'TraceObject' to forward it using 'trace-forward' library. deriving anyclass - (Serialise, ShowProxy) + (Serialise) -- | data BackendConfig = diff --git a/trace-dispatcher/src/Cardano/Logging/Version.hs b/trace-dispatcher/src/Cardano/Logging/Version.hs deleted file mode 100644 index a5ab7246e60..00000000000 --- a/trace-dispatcher/src/Cardano/Logging/Version.hs +++ /dev/null @@ -1,61 +0,0 @@ -module Cardano.Logging.Version - ( ForwardingVersion (..) - , ForwardingVersionData (..) - , forwardingVersionCodec - , forwardingCodecCBORTerm - ) where - -import Ouroboros.Network.CodecCBORTerm -import Ouroboros.Network.Magic -import Ouroboros.Network.Protocol.Handshake.Version (Accept (..), Acceptable (..), - Queryable (..)) - -import qualified Codec.CBOR.Term as CBOR -import Data.Text (Text) -import qualified Data.Text as T - -data ForwardingVersion - = ForwardingV_1 - | ForwardingV_2 - deriving (Eq, Ord, Enum, Bounded, Show) - -forwardingVersionCodec :: CodecCBORTerm (Text, Maybe Int) ForwardingVersion -forwardingVersionCodec = CodecCBORTerm { encodeTerm, decodeTerm } - where - encodeTerm ForwardingV_1 = CBOR.TInt 1 - encodeTerm ForwardingV_2 = CBOR.TInt 2 - - decodeTerm (CBOR.TInt 1) = Right ForwardingV_1 - decodeTerm (CBOR.TInt 2) = Right ForwardingV_2 - decodeTerm (CBOR.TInt n) = Left ( T.pack "decode ForwardingVersion: unknown tag: " <> T.pack (show n) - , Just n - ) - decodeTerm _ = Left ( T.pack "decode ForwardingVersion: unexpected term" - , Nothing - ) - -newtype ForwardingVersionData = ForwardingVersionData - { networkMagic :: NetworkMagic - } deriving (Eq, Show) - -instance Acceptable ForwardingVersionData where - acceptableVersion local remote - | local == remote = Accept local - | otherwise = Refuse $ T.pack $ "ForwardingVersionData mismatch: " - ++ show local - ++ " /= " ++ show remote - -instance Queryable ForwardingVersionData where - queryVersion _ = False - -forwardingCodecCBORTerm :: ForwardingVersion -> CodecCBORTerm Text ForwardingVersionData -forwardingCodecCBORTerm _ = CodecCBORTerm { encodeTerm, decodeTerm } - where - encodeTerm :: ForwardingVersionData -> CBOR.Term - encodeTerm ForwardingVersionData { networkMagic } = - CBOR.TInt (fromIntegral $ unNetworkMagic networkMagic) - - decodeTerm :: CBOR.Term -> Either Text ForwardingVersionData - decodeTerm (CBOR.TInt x) | x >= 0 && x <= 0xffffffff = Right (ForwardingVersionData $ NetworkMagic $ fromIntegral x) - | otherwise = Left $ T.pack $ "networkMagic out of bound: " <> show x - decodeTerm t = Left $ T.pack $ "unknown encoding: " ++ show t diff --git a/trace-dispatcher/test/Cardano/Logging/Test/Unit/DataPoint.hs b/trace-dispatcher/test/Cardano/Logging/Test/Unit/DataPoint.hs index 83ba675a1af..09938adce77 100644 --- a/trace-dispatcher/test/Cardano/Logging/Test/Unit/DataPoint.hs +++ b/trace-dispatcher/test/Cardano/Logging/Test/Unit/DataPoint.hs @@ -20,9 +20,6 @@ import qualified Data.Map.Strict as M import GHC.Conc import GHC.Generics (Generic) -import Trace.Forward.Protocol.DataPoint.Type (DataPointName) -import Trace.Forward.Utils.DataPoint (DataPoint (..)) - data BaseStats = BaseStats { bsMeasure :: Double, diff --git a/trace-dispatcher/trace-dispatcher.cabal b/trace-dispatcher/trace-dispatcher.cabal index 262a943d4c0..a98cc51529a 100644 --- a/trace-dispatcher/trace-dispatcher.cabal +++ b/trace-dispatcher/trace-dispatcher.cabal @@ -1,7 +1,7 @@ cabal-version: 3.0 name: trace-dispatcher -version: 2.9.2 +version: 2.10.0 synopsis: Tracers for Cardano description: Package for development of simple and efficient tracers based on the arrow based contra-tracer package @@ -35,7 +35,7 @@ common project-config -Wno-incomplete-patterns if impl(ghc >= 9.8) - ghc-options: -Wno-x-partial + ghc-options: -Wno-x-partial library @@ -47,7 +47,6 @@ library Cardano.Logging.Consistency Cardano.Logging.DocuGenerator Cardano.Logging.Formatter - Cardano.Logging.Forwarding Cardano.Logging.FrequencyLimiter Cardano.Logging.Prometheus.Exposition Cardano.Logging.Prometheus.NetworkRun @@ -64,7 +63,6 @@ library Cardano.Logging.Types.NodePeers Cardano.Logging.Types.NodeStartupInfo Cardano.Logging.Utils - Cardano.Logging.Version Control.Tracer.Arrow Control.Tracer @@ -78,7 +76,6 @@ library , contra-tracer , deepseq , ekg-core - , ekg-forward >= 0.9 , hashable , hostname , http-date @@ -86,15 +83,11 @@ library , network , network-mux , optparse-applicative-fork - , ouroboros-network ^>= 0.21.2 - , ouroboros-network-api - , ouroboros-network-framework , serialise , stm , text , time , time-manager - , trace-forward , unagi-chan >= 0.4.1.4 , unix-compat , unliftio @@ -146,7 +139,6 @@ test-suite trace-dispatcher-test , tasty-quickcheck , time , trace-dispatcher - , trace-forward , unagi-chan , unliftio , unliftio-core diff --git a/trace-forward/src/Trace/Forward/Configuration/DataPoint.hs b/trace-forward/src/Trace/Forward/Configuration/DataPoint.hs index 093644d61be..88b92f28d0e 100644 --- a/trace-forward/src/Trace/Forward/Configuration/DataPoint.hs +++ b/trace-forward/src/Trace/Forward/Configuration/DataPoint.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE PackageImports #-} + module Trace.Forward.Configuration.DataPoint ( AcceptorConfiguration (..) , ForwarderConfiguration (..) @@ -6,7 +8,7 @@ module Trace.Forward.Configuration.DataPoint import Ouroboros.Network.Driver (TraceSendRecv) import Control.Concurrent.STM.TVar (TVar) -import Control.Tracer (Tracer) +import "contra-tracer" Control.Tracer (Tracer) import Trace.Forward.Protocol.DataPoint.Type diff --git a/trace-forward/src/Trace/Forward/Configuration/TraceObject.hs b/trace-forward/src/Trace/Forward/Configuration/TraceObject.hs index 39031d30ae5..ba924de23a1 100644 --- a/trace-forward/src/Trace/Forward/Configuration/TraceObject.hs +++ b/trace-forward/src/Trace/Forward/Configuration/TraceObject.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE PackageImports #-} + module Trace.Forward.Configuration.TraceObject ( AcceptorConfiguration (..) , ForwarderConfiguration (..) @@ -6,7 +8,7 @@ module Trace.Forward.Configuration.TraceObject import Ouroboros.Network.Driver (TraceSendRecv) import Control.Concurrent.STM.TVar (TVar) -import Control.Tracer (Tracer) +import "contra-tracer" Control.Tracer (Tracer) import Trace.Forward.Protocol.TraceObject.Type diff --git a/trace-dispatcher/src/Cardano/Logging/Forwarding.hs b/trace-forward/src/Trace/Forward/Forwarding.hs similarity index 97% rename from trace-dispatcher/src/Cardano/Logging/Forwarding.hs rename to trace-forward/src/Trace/Forward/Forwarding.hs index f267d20ccc3..8285950e567 100644 --- a/trace-dispatcher/src/Cardano/Logging/Forwarding.hs +++ b/trace-forward/src/Trace/Forward/Forwarding.hs @@ -7,7 +7,7 @@ {-# LANGUAGE PackageImports #-} {-# LANGUAGE ScopedTypeVariables #-} -module Cardano.Logging.Forwarding +module Trace.Forward.Forwarding ( initForwarding , initForwardingDelayed @@ -60,6 +60,7 @@ import Trace.Forward.Run.DataPoint.Forwarder import Trace.Forward.Run.TraceObject.Forwarder import Trace.Forward.Utils.DataPoint import Trace.Forward.Utils.TraceObject +import Trace.Forward.Utils.ForwardSink (ForwardSink) initForwarding :: forall m. (MonadIO m) => IOManager @@ -149,13 +150,13 @@ initForwardingDelayed iomgr config magic ekgStore tracerSocketMode = liftIO $ do -- It writes an error message on stderr handleOverflow :: [TraceObject] -> IO () handleOverflow [] = pure () -handleOverflow msgs = - let lengthM = length msgs - beginning = toTimestamp (head msgs) - end = toTimestamp (last msgs) - msg = "TraceObject queue overflowed. Dropped " <> show lengthM <> +handleOverflow (msg : msgs) = + let lengthM = 1 + length msgs + beginning = toTimestamp msg + end = toTimestamp (last (msg : msgs)) + str = "TraceObject queue overflowed. Dropped " <> show lengthM <> " messages from " <> show beginning <> " to " <> show end - in hPutStrLn stderr msg + in hPutStrLn stderr str launchForwarders :: IOManager diff --git a/trace-forward/src/Trace/Forward/Protocol/DataPoint/Type.hs b/trace-forward/src/Trace/Forward/Protocol/DataPoint/Type.hs index 5f2036ffc91..e4fbafd14af 100644 --- a/trace-forward/src/Trace/Forward/Protocol/DataPoint/Type.hs +++ b/trace-forward/src/Trace/Forward/Protocol/DataPoint/Type.hs @@ -18,13 +18,13 @@ module Trace.Forward.Protocol.DataPoint.Type , SingDataPointForward (..) ) where -import Data.Singletons -import Network.TypedProtocol.Core +import Cardano.Logging.Tracer.DataPoint (DataPointName) import Ouroboros.Network.Util.ShowProxy (ShowProxy (..)) import qualified Data.ByteString.Lazy as LBS import Data.Kind (Type) -import Data.Text (Text) +import Data.Singletons +import Network.TypedProtocol.Core -- | A kind to identify our protocol, and the types of the states in the state -- transition diagram of the protocol. @@ -41,7 +41,6 @@ import Data.Text (Text) -- After the connection is established, the acceptor asks for 'DataPoint's, -- the forwarder replies to it. -type DataPointName = Text type DataPointValue = LBS.ByteString type DataPointValues = [(DataPointName, Maybe DataPointValue)] diff --git a/trace-forward/src/Trace/Forward/Run/TraceObject/Forwarder.hs b/trace-forward/src/Trace/Forward/Run/TraceObject/Forwarder.hs index bd460ba36c7..d48839c5364 100644 --- a/trace-forward/src/Trace/Forward/Run/TraceObject/Forwarder.hs +++ b/trace-forward/src/Trace/Forward/Run/TraceObject/Forwarder.hs @@ -18,6 +18,7 @@ import Trace.Forward.Configuration.TraceObject (ForwarderConfiguration import qualified Trace.Forward.Protocol.TraceObject.Codec as Forwarder import qualified Trace.Forward.Protocol.TraceObject.Forwarder as Forwarder import Trace.Forward.Utils.TraceObject +import Trace.Forward.Utils.ForwardSink (ForwardSink) forwardTraceObjectsInit :: (CBOR.Serialise lo, diff --git a/trace-forward/src/Trace/Forward/Utils/DataPoint.hs b/trace-forward/src/Trace/Forward/Utils/DataPoint.hs index 3fb771cf9e9..fa179b0d671 100644 --- a/trace-forward/src/Trace/Forward/Utils/DataPoint.hs +++ b/trace-forward/src/Trace/Forward/Utils/DataPoint.hs @@ -17,41 +17,13 @@ module Trace.Forward.Utils.DataPoint import Control.Concurrent.STM (atomically, check, orElse) import Control.Concurrent.STM.TMVar import Control.Concurrent.STM.TVar -import Control.DeepSeq (NFData, deepseq) import Data.Aeson import qualified Data.Map.Strict as M +import Cardano.Logging.Tracer.DataPoint import Trace.Forward.Protocol.DataPoint.Forwarder import Trace.Forward.Protocol.DataPoint.Type --- | Type wrapper for some value of type 'v'. The only reason we need this --- wrapper is an ability to store different values in the same 'DataPointStore'. --- --- Please note that when the acceptor application will read the value of type 'v' --- from the store, this value is just as unstructured JSON, but not Haskell --- value of type 'v'. That's why 'FromJSON' instance for type 'v' should be --- available for the acceptor application, to decode unstructured JSON. --- -data DataPoint where - DataPoint :: (ToJSON v, NFData v) => v -> DataPoint - -type DataPointStore = TVar (M.Map DataPointName DataPoint) - -initDataPointStore :: IO DataPointStore -initDataPointStore = newTVarIO M.empty - --- | Write 'DataPoint' to the store. -writeToStore - :: DataPointStore - -> DataPointName - -> DataPoint - -> IO () -writeToStore dpStore dpName (DataPoint obj) = atomically $ - modifyTVar' dpStore $ \store -> - if dpName `M.member` store - then M.adjust (const (DataPoint (deepseq obj obj))) dpName store - else M.insert dpName (DataPoint (deepseq obj obj)) store - -- | Read 'DataPoint's from the store. Please note that we don't care what's -- inside of 'DataPoint', we just know it can be encoded to JSON. readFromStore diff --git a/trace-forward/src/Trace/Forward/Utils/ForwardSink.hs b/trace-forward/src/Trace/Forward/Utils/ForwardSink.hs new file mode 100644 index 00000000000..ba7bf61b978 --- /dev/null +++ b/trace-forward/src/Trace/Forward/Utils/ForwardSink.hs @@ -0,0 +1,17 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE GADTs #-} + +module Trace.Forward.Utils.ForwardSink + ( ForwardSink (..) + ) where + +import Control.Concurrent.STM.TBQueue +import Control.Concurrent.STM.TVar + +data ForwardSink lo = ForwardSink + { forwardQueue :: !(TVar (TBQueue lo)) + , disconnectedSize :: !Word + , connectedSize :: !Word + , wasUsed :: !(TVar Bool) + , overflowCallback :: !([lo] -> IO ()) + } diff --git a/trace-forward/src/Trace/Forward/Utils/TraceObject.hs b/trace-forward/src/Trace/Forward/Utils/TraceObject.hs index 6b4ea14724f..1c08b279dab 100644 --- a/trace-forward/src/Trace/Forward/Utils/TraceObject.hs +++ b/trace-forward/src/Trace/Forward/Utils/TraceObject.hs @@ -4,8 +4,7 @@ {-# LANGUAGE NamedFieldPuns #-} module Trace.Forward.Utils.TraceObject - ( ForwardSink (..) - , initForwardSink + ( initForwardSink , writeToSink , readFromSink , getTraceObjectsFromReply @@ -22,16 +21,9 @@ import Data.Word (Word16) import Trace.Forward.Configuration.TraceObject import qualified Trace.Forward.Protocol.TraceObject.Forwarder as Forwarder import Trace.Forward.Protocol.TraceObject.Type +import Trace.Forward.Utils.ForwardSink (ForwardSink(..)) -data ForwardSink lo = ForwardSink - { forwardQueue :: !(TVar (TBQueue lo)) - , disconnectedSize :: !Word - , connectedSize :: !Word - , wasUsed :: !(TVar Bool) - , overflowCallback :: !([lo] -> IO ()) - } - initForwardSink :: ForwarderConfiguration lo -> ([lo] -> IO ()) diff --git a/trace-forward/trace-forward.cabal b/trace-forward/trace-forward.cabal index c4ee968b643..6ca86d94044 100644 --- a/trace-forward/trace-forward.cabal +++ b/trace-forward/trace-forward.cabal @@ -1,7 +1,7 @@ cabal-version: 3.0 name: trace-forward -version: 2.2.11 +version: 2.3.0 synopsis: The forwarding protocols library for cardano node. description: The library providing typed protocols for forwarding different information from the cardano node to an external application. @@ -43,6 +43,7 @@ library Trace.Forward.Protocol.TraceObject.Codec Trace.Forward.Protocol.TraceObject.Forwarder Trace.Forward.Protocol.TraceObject.Type + Trace.Forward.Forwarding Trace.Forward.Run.DataPoint.Acceptor Trace.Forward.Run.DataPoint.Forwarder @@ -54,6 +55,7 @@ library Trace.Forward.Utils.DataPoint Trace.Forward.Utils.TraceObject + Trace.Forward.Utils.ForwardSink build-depends: aeson , async @@ -61,18 +63,19 @@ library , cborg , containers , contra-tracer - , deepseq , extra , io-classes , network-mux , ouroboros-network-api + , ekg-core + , ekg-forward , singletons ^>= 3.0 , ouroboros-network-framework ^>= 0.18.0.1 , serialise , stm - , text , typed-protocols ^>= 0.3 , typed-protocols-cborg + , trace-dispatcher test-suite test import: project-config @@ -85,6 +88,7 @@ test-suite test Test.Trace.Forward.Protocol.TraceObject.Examples Test.Trace.Forward.Protocol.TraceObject.Item Test.Trace.Forward.Protocol.TraceObject.Tests + Trace.Forward.Forwaring Test.Trace.Forward.Protocol.DataPoint.Codec Test.Trace.Forward.Protocol.DataPoint.Direct @@ -108,6 +112,8 @@ test-suite test , tasty-quickcheck , typed-protocols , text + , ekg-core + , ekg-forward ghc-options: -rtsopts -threaded