-- | Initialization of a 'TracerProvider' with modified 'TracerProviderOptions'
module OpenTelemetry.Trace.Setup
  ( withTracerProvider
  ) where

import Prelude

import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad.IO.Unlift (MonadUnliftIO(..))
import OpenTelemetry.Trace
  ( TracerProvider
  , TracerProviderOptions
  , createTracerProvider
  , getTracerProviderInitializationOptions
  , setGlobalTracerProvider
  )
import qualified OpenTelemetry.Trace as Trace
import UnliftIO.Exception (bracket)

withTracerProvider
  :: MonadUnliftIO m
  => (TracerProviderOptions -> TracerProviderOptions)
  -> (TracerProvider -> m a)
  -> m a
withTracerProvider :: forall (m :: * -> *) a.
MonadUnliftIO m =>
(TracerProviderOptions -> TracerProviderOptions)
-> (TracerProvider -> m a) -> m a
withTracerProvider TracerProviderOptions -> TracerProviderOptions
setup =
  forall (m :: * -> *) a b c.
MonadUnliftIO m =>
m a -> (a -> m b) -> (a -> m c) -> m c
bracket (forall (m :: * -> *).
MonadIO m =>
(TracerProviderOptions -> TracerProviderOptions)
-> m TracerProvider
initializeGlobalTracerProvider TracerProviderOptions -> TracerProviderOptions
setup) forall (m :: * -> *). MonadIO m => TracerProvider -> m ()
shutdownTracerProvider

initializeGlobalTracerProvider
  :: MonadIO m
  => (TracerProviderOptions -> TracerProviderOptions)
  -> m TracerProvider
initializeGlobalTracerProvider :: forall (m :: * -> *).
MonadIO m =>
(TracerProviderOptions -> TracerProviderOptions)
-> m TracerProvider
initializeGlobalTracerProvider TracerProviderOptions -> TracerProviderOptions
setup = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ do
  TracerProvider
t <- forall (m :: * -> *).
MonadIO m =>
(TracerProviderOptions -> TracerProviderOptions)
-> m TracerProvider
initializeTracerProvider TracerProviderOptions -> TracerProviderOptions
setup
  TracerProvider
t forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall (m :: * -> *). MonadIO m => TracerProvider -> m ()
setGlobalTracerProvider TracerProvider
t

initializeTracerProvider
  :: MonadIO m
  => (TracerProviderOptions -> TracerProviderOptions)
  -> m TracerProvider
initializeTracerProvider :: forall (m :: * -> *).
MonadIO m =>
(TracerProviderOptions -> TracerProviderOptions)
-> m TracerProvider
initializeTracerProvider TracerProviderOptions -> TracerProviderOptions
setup = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ do
  ([Processor]
processors, TracerProviderOptions
opts) <- IO ([Processor], TracerProviderOptions)
getTracerProviderInitializationOptions
  forall (m :: * -> *).
MonadIO m =>
[Processor] -> TracerProviderOptions -> m TracerProvider
createTracerProvider [Processor]
processors forall a b. (a -> b) -> a -> b
$ TracerProviderOptions -> TracerProviderOptions
setup TracerProviderOptions
opts

shutdownTracerProvider :: MonadIO m => TracerProvider -> m ()
shutdownTracerProvider :: forall (m :: * -> *). MonadIO m => TracerProvider -> m ()
shutdownTracerProvider = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *). MonadIO m => TracerProvider -> m ()
Trace.shutdownTracerProvider