\subsection{Cardano.BM.Data.Transformers}
\label{code:Cardano.BM.Data.Transformers}
%if style == newcode
\begin{code}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Cardano.BM.Data.Transformers
( liftCounting
, liftFolding
, setHostname
)
where
import Data.Text (Text)
import Cardano.BM.Data.Aggregated (Measurable (..))
import Cardano.BM.Data.LogItem (LOContent (..), LOMeta (..),
LogObject (..), LoggerName)
import Cardano.BM.Data.Tracer (Tracer (..), traceWith)
import Cardano.BM.Data.Trace
import Control.Tracer.Transformers
\end{code}
\subsubsection{Transformer for counting events}
\label{code:liftCounting}
\index{liftCounting}
Lift a 'Counting' tracer into a 'Trace' of 'PureI' messages.
\begin{code}
liftCounting
:: forall m a
. LOMeta -> LoggerName -> Text -> Trace m a
-> Tracer m (Counting (LoggerName, LogObject a))
liftCounting :: LOMeta
-> LoggerName
-> LoggerName
-> Trace m a
-> Tracer m (Counting (LoggerName, LogObject a))
liftCounting LOMeta
meta LoggerName
name LoggerName
desc Trace m a
tr = (Counting (LoggerName, LogObject a) -> m ())
-> Tracer m (Counting (LoggerName, LogObject a))
forall (m :: * -> *) a. (a -> m ()) -> Tracer m a
Tracer (Trace m a -> Counting (LoggerName, LogObject a) -> m ()
traceIncrement Trace m a
tr)
where
traceIncrement :: Trace m a -> Counting (LoggerName, LogObject a) -> m ()
traceIncrement :: Trace m a -> Counting (LoggerName, LogObject a) -> m ()
traceIncrement Trace m a
t (Counting Int
n) =
Trace m a -> (LoggerName, LogObject a) -> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Trace m a
t ((LoggerName, LogObject a) -> m ())
-> (LoggerName, LogObject a) -> m ()
forall a b. (a -> b) -> a -> b
$ (LoggerName
name, LoggerName -> LOMeta -> LOContent a -> LogObject a
forall a. LoggerName -> LOMeta -> LOContent a -> LogObject a
LogObject LoggerName
name LOMeta
meta (LOContent a -> LogObject a)
-> (Integer -> LOContent a) -> Integer -> LogObject a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LoggerName -> Measurable -> LOContent a
forall a. LoggerName -> Measurable -> LOContent a
LogValue LoggerName
desc (Measurable -> LOContent a)
-> (Integer -> Measurable) -> Integer -> LOContent a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Measurable
PureI (Integer -> LogObject a) -> Integer -> LogObject a
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
\end{code}
\subsubsection{Transformer for state folding}
\label{code:liftFolding}
\index{liftFolding}
Lift a 'Trace' tracer into a 'Trace' of 'PureI' messages,
thereby specialising it to 'Integral'.
\begin{code}
liftFolding
:: forall m f a
. (Integral f)
=> LOMeta -> LoggerName -> Text -> Trace m a
-> Tracer m (Folding (LoggerName, LogObject a) f)
liftFolding :: LOMeta
-> LoggerName
-> LoggerName
-> Trace m a
-> Tracer m (Folding (LoggerName, LogObject a) f)
liftFolding LOMeta
meta LoggerName
name LoggerName
desc Trace m a
tr = (Folding (LoggerName, LogObject a) f -> m ())
-> Tracer m (Folding (LoggerName, LogObject a) f)
forall (m :: * -> *) a. (a -> m ()) -> Tracer m a
Tracer (Trace m a -> Folding (LoggerName, LogObject a) f -> m ()
traceIncrement Trace m a
tr)
where
traceIncrement :: Trace m a -> Folding (LoggerName, LogObject a) f -> m ()
traceIncrement :: Trace m a -> Folding (LoggerName, LogObject a) f -> m ()
traceIncrement Trace m a
t (Folding f
f) =
Trace m a -> (LoggerName, LogObject a) -> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Trace m a
t ((LoggerName, LogObject a) -> m ())
-> (LoggerName, LogObject a) -> m ()
forall a b. (a -> b) -> a -> b
$ (LoggerName
name, LoggerName -> LOMeta -> LOContent a -> LogObject a
forall a. LoggerName -> LOMeta -> LOContent a -> LogObject a
LogObject LoggerName
name LOMeta
meta (LOContent a -> LogObject a)
-> (Integer -> LOContent a) -> Integer -> LogObject a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LoggerName -> Measurable -> LOContent a
forall a. LoggerName -> Measurable -> LOContent a
LogValue LoggerName
desc (Measurable -> LOContent a)
-> (Integer -> Measurable) -> Integer -> LOContent a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Measurable
PureI (Integer -> LogObject a) -> Integer -> LogObject a
forall a b. (a -> b) -> a -> b
$ f -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral f
f)
\end{code}
\subsubsection{Transformer for setting hostname annotation}
\label{code:setHostname}
\index{setHostname}
The hostname annotation of the |LogObject| can be altered.
\begin{code}
setHostname :: Text -> Trace m a -> Trace m a
setHostname :: LoggerName -> Trace m a -> Trace m a
setHostname LoggerName
hn Trace m a
tr = ((LoggerName, LogObject a) -> m ()) -> Trace m a
forall (m :: * -> *) a. (a -> m ()) -> Tracer m a
Tracer (((LoggerName, LogObject a) -> m ()) -> Trace m a)
-> ((LoggerName, LogObject a) -> m ()) -> Trace m a
forall a b. (a -> b) -> a -> b
$ \(LoggerName
ctx, lo :: LogObject a
lo@(LogObject LoggerName
_ln LOMeta
meta LOContent a
_lc)) ->
Trace m a -> (LoggerName, LogObject a) -> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Trace m a
tr (LoggerName
ctx, LogObject a
lo { loMeta :: LOMeta
loMeta = LOMeta
meta { hostname :: LoggerName
hostname = LoggerName
hn }})
\end{code}