packages feed

hs-opentelemetry-api-0.0.1.0: src/OpenTelemetry/Trace/Monad.hs

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DefaultSignatures #-}
-----------------------------------------------------------------------------
-- |
-- 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 Data.Text (Text)
import OpenTelemetry.Trace.Core
  ( Tracer
  , Span
  , SpanArguments(..)
  , inSpan''
  )
import Control.Monad.IO.Unlift
import GHC.Stack

-- | 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'' callStack n args (const m)

inSpan'
  :: (MonadUnliftIO m, MonadTracer m, HasCallStack)
  => Text
  -> SpanArguments
  -> (Span -> m a)
  -> m a
inSpan' = OpenTelemetry.Trace.Monad.inSpan'' callStack

inSpan''
  :: (MonadUnliftIO m, MonadTracer m, HasCallStack)
  => CallStack
  -> Text
  -> SpanArguments
  -> (Span -> m a)
  -> m a
inSpan'' cs n args f = do
  t <- getTracer
  OpenTelemetry.Trace.Core.inSpan'' t cs n args f