hs-opentelemetry-api-0.1.0.0: src/OpenTelemetry/Trace/Monad.hs
{-# 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