module Prometheus.Registry (
register
, registerIO
, unsafeRegister
, unsafeRegisterIO
, collectMetrics
, unregisterAll
) where
import Prometheus.Metric
import Control.Applicative ((<$>))
import System.IO.Unsafe (unsafePerformIO)
import qualified Control.Concurrent.STM as STM
data RegisteredMetric = forall s. MkRegisteredMetric (Metric s)
type Registry = [RegisteredMetric]
globalRegistry :: STM.TVar Registry
globalRegistry = unsafePerformIO $ STM.newTVarIO []
register :: Metric s -> IO (Metric s)
register metric = do
let addToRegistry = (MkRegisteredMetric metric :)
STM.atomically $ STM.modifyTVar' globalRegistry addToRegistry
return metric
registerIO :: IO (Metric s) -> IO (Metric s)
registerIO metricGen = metricGen >>= register
unsafeRegister :: Metric s -> Metric s
unsafeRegister = unsafePerformIO . register
unsafeRegisterIO :: IO (Metric s) -> Metric s
unsafeRegisterIO = unsafePerformIO . registerIO
unregisterAll :: IO ()
unregisterAll = STM.atomically $ STM.writeTVar globalRegistry []
collectMetrics :: IO [SampleGroup]
collectMetrics = do
registry <- STM.atomically $ STM.readTVar globalRegistry
concat <$> mapM collectRegistered registry
collectRegistered :: RegisteredMetric -> IO [SampleGroup]
collectRegistered (MkRegisteredMetric metric) = collect metric