{-# LANGUAGE DataKinds #-}
module OpenTelemetry.Registry (
registerSpanExporterFactory,
registerSpanExporterFactoryIfAbsent,
lookupSpanExporterFactory,
registeredSpanExporterFactories,
registerMetricExporterFactory,
registerMetricExporterFactoryIfAbsent,
lookupMetricExporterFactory,
registeredMetricExporterFactories,
registerLogRecordExporterFactory,
registerLogRecordExporterFactoryIfAbsent,
lookupLogRecordExporterFactory,
registeredLogRecordExporterFactories,
registerTextMapPropagator,
registerTextMapPropagatorIfAbsent,
lookupRegisteredTextMapPropagator,
registeredTextMapPropagators,
ResourceDetector,
registerResourceDetector,
registerResourceDetectorIfAbsent,
lookupResourceDetector,
registeredResourceDetectors,
) where
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as H
import Data.IORef (IORef, atomicModifyIORef', newIORef, readIORef)
import Data.Text (Text)
import OpenTelemetry.Internal.Log.Types (LogRecordExporter)
import OpenTelemetry.Internal.Metric.Export (MetricExporter)
import OpenTelemetry.Internal.Trace.Types (SpanExporter)
import OpenTelemetry.Propagator (TextMapPropagator)
import OpenTelemetry.Resource (Resource)
import System.IO.Unsafe (unsafePerformIO)
insertRegistry :: IORef (HashMap Text v) -> Text -> v -> IO ()
insertRegistry :: forall v. IORef (HashMap Text v) -> Text -> v -> IO ()
insertRegistry IORef (HashMap Text v)
ref Text
name v
val =
IORef (HashMap Text v)
-> (HashMap Text v -> (HashMap Text v, ())) -> IO ()
forall a b. IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORef' IORef (HashMap Text v)
ref ((HashMap Text v -> (HashMap Text v, ())) -> IO ())
-> (HashMap Text v -> (HashMap Text v, ())) -> IO ()
forall a b. (a -> b) -> a -> b
$ \HashMap Text v
m -> (Text -> v -> HashMap Text v -> HashMap Text v
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
H.insert Text
name v
val HashMap Text v
m, ())
{-# INLINE insertRegistry #-}
insertRegistryIfAbsent :: IORef (HashMap Text v) -> Text -> v -> IO Bool
insertRegistryIfAbsent :: forall v. IORef (HashMap Text v) -> Text -> v -> IO Bool
insertRegistryIfAbsent IORef (HashMap Text v)
ref Text
name v
val =
IORef (HashMap Text v)
-> (HashMap Text v -> (HashMap Text v, Bool)) -> IO Bool
forall a b. IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORef' IORef (HashMap Text v)
ref ((HashMap Text v -> (HashMap Text v, Bool)) -> IO Bool)
-> (HashMap Text v -> (HashMap Text v, Bool)) -> IO Bool
forall a b. (a -> b) -> a -> b
$ \HashMap Text v
m ->
if Text -> HashMap Text v -> Bool
forall k a. (Eq k, Hashable k) => k -> HashMap k a -> Bool
H.member Text
name HashMap Text v
m
then (HashMap Text v
m, Bool
False)
else (Text -> v -> HashMap Text v -> HashMap Text v
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
H.insert Text
name v
val HashMap Text v
m, Bool
True)
{-# INLINE insertRegistryIfAbsent #-}
lookupRegistry :: IORef (HashMap Text v) -> Text -> IO (Maybe v)
lookupRegistry :: forall v. IORef (HashMap Text v) -> Text -> IO (Maybe v)
lookupRegistry IORef (HashMap Text v)
ref Text
name = Text -> HashMap Text v -> Maybe v
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
H.lookup Text
name (HashMap Text v -> Maybe v) -> IO (HashMap Text v) -> IO (Maybe v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IORef (HashMap Text v) -> IO (HashMap Text v)
forall a. IORef a -> IO a
readIORef IORef (HashMap Text v)
ref
{-# INLINE lookupRegistry #-}
readRegistry :: IORef (HashMap Text v) -> IO (HashMap Text v)
readRegistry :: forall v. IORef (HashMap Text v) -> IO (HashMap Text v)
readRegistry = IORef (HashMap Text v) -> IO (HashMap Text v)
forall a. IORef a -> IO a
readIORef
{-# INLINE readRegistry #-}
spanExporterRegistry :: IORef (HashMap Text (IO SpanExporter))
spanExporterRegistry :: IORef (HashMap Text (IO SpanExporter))
spanExporterRegistry = IO (IORef (HashMap Text (IO SpanExporter)))
-> IORef (HashMap Text (IO SpanExporter))
forall a. IO a -> a
unsafePerformIO (IO (IORef (HashMap Text (IO SpanExporter)))
-> IORef (HashMap Text (IO SpanExporter)))
-> IO (IORef (HashMap Text (IO SpanExporter)))
-> IORef (HashMap Text (IO SpanExporter))
forall a b. (a -> b) -> a -> b
$ HashMap Text (IO SpanExporter)
-> IO (IORef (HashMap Text (IO SpanExporter)))
forall a. a -> IO (IORef a)
newIORef HashMap Text (IO SpanExporter)
forall k v. HashMap k v
H.empty
{-# NOINLINE spanExporterRegistry #-}
registerSpanExporterFactory :: Text -> IO SpanExporter -> IO ()
registerSpanExporterFactory :: Text -> IO SpanExporter -> IO ()
registerSpanExporterFactory = IORef (HashMap Text (IO SpanExporter))
-> Text -> IO SpanExporter -> IO ()
forall v. IORef (HashMap Text v) -> Text -> v -> IO ()
insertRegistry IORef (HashMap Text (IO SpanExporter))
spanExporterRegistry
registerSpanExporterFactoryIfAbsent :: Text -> IO SpanExporter -> IO Bool
registerSpanExporterFactoryIfAbsent :: Text -> IO SpanExporter -> IO Bool
registerSpanExporterFactoryIfAbsent = IORef (HashMap Text (IO SpanExporter))
-> Text -> IO SpanExporter -> IO Bool
forall v. IORef (HashMap Text v) -> Text -> v -> IO Bool
insertRegistryIfAbsent IORef (HashMap Text (IO SpanExporter))
spanExporterRegistry
lookupSpanExporterFactory :: Text -> IO (Maybe (IO SpanExporter))
lookupSpanExporterFactory :: Text -> IO (Maybe (IO SpanExporter))
lookupSpanExporterFactory = IORef (HashMap Text (IO SpanExporter))
-> Text -> IO (Maybe (IO SpanExporter))
forall v. IORef (HashMap Text v) -> Text -> IO (Maybe v)
lookupRegistry IORef (HashMap Text (IO SpanExporter))
spanExporterRegistry
registeredSpanExporterFactories :: IO (HashMap Text (IO SpanExporter))
registeredSpanExporterFactories :: IO (HashMap Text (IO SpanExporter))
registeredSpanExporterFactories = IORef (HashMap Text (IO SpanExporter))
-> IO (HashMap Text (IO SpanExporter))
forall v. IORef (HashMap Text v) -> IO (HashMap Text v)
readRegistry IORef (HashMap Text (IO SpanExporter))
spanExporterRegistry
metricExporterRegistry :: IORef (HashMap Text (IO MetricExporter))
metricExporterRegistry :: IORef (HashMap Text (IO MetricExporter))
metricExporterRegistry = IO (IORef (HashMap Text (IO MetricExporter)))
-> IORef (HashMap Text (IO MetricExporter))
forall a. IO a -> a
unsafePerformIO (IO (IORef (HashMap Text (IO MetricExporter)))
-> IORef (HashMap Text (IO MetricExporter)))
-> IO (IORef (HashMap Text (IO MetricExporter)))
-> IORef (HashMap Text (IO MetricExporter))
forall a b. (a -> b) -> a -> b
$ HashMap Text (IO MetricExporter)
-> IO (IORef (HashMap Text (IO MetricExporter)))
forall a. a -> IO (IORef a)
newIORef HashMap Text (IO MetricExporter)
forall k v. HashMap k v
H.empty
{-# NOINLINE metricExporterRegistry #-}
registerMetricExporterFactory :: Text -> IO MetricExporter -> IO ()
registerMetricExporterFactory :: Text -> IO MetricExporter -> IO ()
registerMetricExporterFactory = IORef (HashMap Text (IO MetricExporter))
-> Text -> IO MetricExporter -> IO ()
forall v. IORef (HashMap Text v) -> Text -> v -> IO ()
insertRegistry IORef (HashMap Text (IO MetricExporter))
metricExporterRegistry
registerMetricExporterFactoryIfAbsent :: Text -> IO MetricExporter -> IO Bool
registerMetricExporterFactoryIfAbsent :: Text -> IO MetricExporter -> IO Bool
registerMetricExporterFactoryIfAbsent = IORef (HashMap Text (IO MetricExporter))
-> Text -> IO MetricExporter -> IO Bool
forall v. IORef (HashMap Text v) -> Text -> v -> IO Bool
insertRegistryIfAbsent IORef (HashMap Text (IO MetricExporter))
metricExporterRegistry
lookupMetricExporterFactory :: Text -> IO (Maybe (IO MetricExporter))
lookupMetricExporterFactory :: Text -> IO (Maybe (IO MetricExporter))
lookupMetricExporterFactory = IORef (HashMap Text (IO MetricExporter))
-> Text -> IO (Maybe (IO MetricExporter))
forall v. IORef (HashMap Text v) -> Text -> IO (Maybe v)
lookupRegistry IORef (HashMap Text (IO MetricExporter))
metricExporterRegistry
registeredMetricExporterFactories :: IO (HashMap Text (IO MetricExporter))
registeredMetricExporterFactories :: IO (HashMap Text (IO MetricExporter))
registeredMetricExporterFactories = IORef (HashMap Text (IO MetricExporter))
-> IO (HashMap Text (IO MetricExporter))
forall v. IORef (HashMap Text v) -> IO (HashMap Text v)
readRegistry IORef (HashMap Text (IO MetricExporter))
metricExporterRegistry
logRecordExporterRegistry :: IORef (HashMap Text (IO LogRecordExporter))
logRecordExporterRegistry :: IORef (HashMap Text (IO LogRecordExporter))
logRecordExporterRegistry = IO (IORef (HashMap Text (IO LogRecordExporter)))
-> IORef (HashMap Text (IO LogRecordExporter))
forall a. IO a -> a
unsafePerformIO (IO (IORef (HashMap Text (IO LogRecordExporter)))
-> IORef (HashMap Text (IO LogRecordExporter)))
-> IO (IORef (HashMap Text (IO LogRecordExporter)))
-> IORef (HashMap Text (IO LogRecordExporter))
forall a b. (a -> b) -> a -> b
$ HashMap Text (IO LogRecordExporter)
-> IO (IORef (HashMap Text (IO LogRecordExporter)))
forall a. a -> IO (IORef a)
newIORef HashMap Text (IO LogRecordExporter)
forall k v. HashMap k v
H.empty
{-# NOINLINE logRecordExporterRegistry #-}
registerLogRecordExporterFactory :: Text -> IO LogRecordExporter -> IO ()
registerLogRecordExporterFactory :: Text -> IO LogRecordExporter -> IO ()
registerLogRecordExporterFactory = IORef (HashMap Text (IO LogRecordExporter))
-> Text -> IO LogRecordExporter -> IO ()
forall v. IORef (HashMap Text v) -> Text -> v -> IO ()
insertRegistry IORef (HashMap Text (IO LogRecordExporter))
logRecordExporterRegistry
registerLogRecordExporterFactoryIfAbsent :: Text -> IO LogRecordExporter -> IO Bool
registerLogRecordExporterFactoryIfAbsent :: Text -> IO LogRecordExporter -> IO Bool
registerLogRecordExporterFactoryIfAbsent = IORef (HashMap Text (IO LogRecordExporter))
-> Text -> IO LogRecordExporter -> IO Bool
forall v. IORef (HashMap Text v) -> Text -> v -> IO Bool
insertRegistryIfAbsent IORef (HashMap Text (IO LogRecordExporter))
logRecordExporterRegistry
lookupLogRecordExporterFactory :: Text -> IO (Maybe (IO LogRecordExporter))
lookupLogRecordExporterFactory :: Text -> IO (Maybe (IO LogRecordExporter))
lookupLogRecordExporterFactory = IORef (HashMap Text (IO LogRecordExporter))
-> Text -> IO (Maybe (IO LogRecordExporter))
forall v. IORef (HashMap Text v) -> Text -> IO (Maybe v)
lookupRegistry IORef (HashMap Text (IO LogRecordExporter))
logRecordExporterRegistry
registeredLogRecordExporterFactories :: IO (HashMap Text (IO LogRecordExporter))
registeredLogRecordExporterFactories :: IO (HashMap Text (IO LogRecordExporter))
registeredLogRecordExporterFactories = IORef (HashMap Text (IO LogRecordExporter))
-> IO (HashMap Text (IO LogRecordExporter))
forall v. IORef (HashMap Text v) -> IO (HashMap Text v)
readRegistry IORef (HashMap Text (IO LogRecordExporter))
logRecordExporterRegistry
propagatorRegistry :: IORef (HashMap Text TextMapPropagator)
propagatorRegistry :: IORef (HashMap Text TextMapPropagator)
propagatorRegistry = IO (IORef (HashMap Text TextMapPropagator))
-> IORef (HashMap Text TextMapPropagator)
forall a. IO a -> a
unsafePerformIO (IO (IORef (HashMap Text TextMapPropagator))
-> IORef (HashMap Text TextMapPropagator))
-> IO (IORef (HashMap Text TextMapPropagator))
-> IORef (HashMap Text TextMapPropagator)
forall a b. (a -> b) -> a -> b
$ HashMap Text TextMapPropagator
-> IO (IORef (HashMap Text TextMapPropagator))
forall a. a -> IO (IORef a)
newIORef HashMap Text TextMapPropagator
forall k v. HashMap k v
H.empty
{-# NOINLINE propagatorRegistry #-}
registerTextMapPropagator :: Text -> TextMapPropagator -> IO ()
registerTextMapPropagator :: Text -> TextMapPropagator -> IO ()
registerTextMapPropagator = IORef (HashMap Text TextMapPropagator)
-> Text -> TextMapPropagator -> IO ()
forall v. IORef (HashMap Text v) -> Text -> v -> IO ()
insertRegistry IORef (HashMap Text TextMapPropagator)
propagatorRegistry
registerTextMapPropagatorIfAbsent :: Text -> TextMapPropagator -> IO Bool
registerTextMapPropagatorIfAbsent :: Text -> TextMapPropagator -> IO Bool
registerTextMapPropagatorIfAbsent = IORef (HashMap Text TextMapPropagator)
-> Text -> TextMapPropagator -> IO Bool
forall v. IORef (HashMap Text v) -> Text -> v -> IO Bool
insertRegistryIfAbsent IORef (HashMap Text TextMapPropagator)
propagatorRegistry
lookupRegisteredTextMapPropagator :: Text -> IO (Maybe TextMapPropagator)
lookupRegisteredTextMapPropagator :: Text -> IO (Maybe TextMapPropagator)
lookupRegisteredTextMapPropagator = IORef (HashMap Text TextMapPropagator)
-> Text -> IO (Maybe TextMapPropagator)
forall v. IORef (HashMap Text v) -> Text -> IO (Maybe v)
lookupRegistry IORef (HashMap Text TextMapPropagator)
propagatorRegistry
registeredTextMapPropagators :: IO (HashMap Text TextMapPropagator)
registeredTextMapPropagators :: IO (HashMap Text TextMapPropagator)
registeredTextMapPropagators = IORef (HashMap Text TextMapPropagator)
-> IO (HashMap Text TextMapPropagator)
forall v. IORef (HashMap Text v) -> IO (HashMap Text v)
readRegistry IORef (HashMap Text TextMapPropagator)
propagatorRegistry
type ResourceDetector = IO Resource
resourceDetectorRegistry :: IORef (HashMap Text ResourceDetector)
resourceDetectorRegistry :: IORef (HashMap Text ResourceDetector)
resourceDetectorRegistry = IO (IORef (HashMap Text ResourceDetector))
-> IORef (HashMap Text ResourceDetector)
forall a. IO a -> a
unsafePerformIO (IO (IORef (HashMap Text ResourceDetector))
-> IORef (HashMap Text ResourceDetector))
-> IO (IORef (HashMap Text ResourceDetector))
-> IORef (HashMap Text ResourceDetector)
forall a b. (a -> b) -> a -> b
$ HashMap Text ResourceDetector
-> IO (IORef (HashMap Text ResourceDetector))
forall a. a -> IO (IORef a)
newIORef HashMap Text ResourceDetector
forall k v. HashMap k v
H.empty
{-# NOINLINE resourceDetectorRegistry #-}
registerResourceDetector :: Text -> ResourceDetector -> IO ()
registerResourceDetector :: Text -> ResourceDetector -> IO ()
registerResourceDetector = IORef (HashMap Text ResourceDetector)
-> Text -> ResourceDetector -> IO ()
forall v. IORef (HashMap Text v) -> Text -> v -> IO ()
insertRegistry IORef (HashMap Text ResourceDetector)
resourceDetectorRegistry
registerResourceDetectorIfAbsent :: Text -> ResourceDetector -> IO Bool
registerResourceDetectorIfAbsent :: Text -> ResourceDetector -> IO Bool
registerResourceDetectorIfAbsent = IORef (HashMap Text ResourceDetector)
-> Text -> ResourceDetector -> IO Bool
forall v. IORef (HashMap Text v) -> Text -> v -> IO Bool
insertRegistryIfAbsent IORef (HashMap Text ResourceDetector)
resourceDetectorRegistry
lookupResourceDetector :: Text -> IO (Maybe ResourceDetector)
lookupResourceDetector :: Text -> IO (Maybe ResourceDetector)
lookupResourceDetector = IORef (HashMap Text ResourceDetector)
-> Text -> IO (Maybe ResourceDetector)
forall v. IORef (HashMap Text v) -> Text -> IO (Maybe v)
lookupRegistry IORef (HashMap Text ResourceDetector)
resourceDetectorRegistry
registeredResourceDetectors :: IO (HashMap Text ResourceDetector)
registeredResourceDetectors :: IO (HashMap Text ResourceDetector)
registeredResourceDetectors = IORef (HashMap Text ResourceDetector)
-> IO (HashMap Text ResourceDetector)
forall v. IORef (HashMap Text v) -> IO (HashMap Text v)
readRegistry IORef (HashMap Text ResourceDetector)
resourceDetectorRegistry