{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- {- | Module : OpenTelemetry.Trace.Monad Copyright : (c) Ian Duncan, 2021 License : BSD-3 Description : Higher-level tracing API Maintainer : Ian Duncan Stability : experimental Portability : non-portable (GHC extensions) The recommended tracing interface for application developers See OpenTelemetry.Trace for an interface that's more lower-level, but more flexible. -} module OpenTelemetry.Trace.Monad ( inSpan, inSpan', OpenTelemetry.Trace.Monad.inSpan'', -- Interacting with the span in the current context -- , getSpan -- , updateName -- , addAttribute -- , addAttributes -- , getAttributes -- , addEvent -- , NewEvent (..) -- Fundamental monad instances MonadTracer (..), ) where import Control.Monad.IO.Unlift import Control.Monad.Identity (IdentityT) import Control.Monad.Reader (ReaderT) import Control.Monad.Trans (MonadTrans (lift)) import Data.Text (Text) import GHC.Stack import OpenTelemetry.Trace.Core ( Span, SpanArguments (..), Tracer, addAttributesToSpanArguments, callerAttributes, inSpan'', ) -- | This is generally scoped by Monad stack to do different things class (Monad m) => MonadTracer m where getTracer :: m Tracer inSpan :: (MonadUnliftIO m, MonadTracer m, HasCallStack) => Text -> SpanArguments -> m a -> m a inSpan n args m = OpenTelemetry.Trace.Monad.inSpan'' n (addAttributesToSpanArguments callerAttributes args) (const m) inSpan' :: (MonadUnliftIO m, MonadTracer m, HasCallStack) => Text -> SpanArguments -> (Span -> m a) -> m a inSpan' n args f = OpenTelemetry.Trace.Monad.inSpan'' n (addAttributesToSpanArguments callerAttributes args) f inSpan'' :: (MonadUnliftIO m, MonadTracer m, HasCallStack) => Text -> SpanArguments -> (Span -> m a) -> m a inSpan'' n args f = do t <- getTracer OpenTelemetry.Trace.Core.inSpan'' t n args f instance (MonadTracer m) => MonadTracer (IdentityT m) where getTracer = lift getTracer instance {-# OVERLAPPABLE #-} (MonadTracer m) => MonadTracer (ReaderT r m) where getTracer = lift getTracer