module System.Metrics.DistributedProcess
    ( registerLocalNodeMetrics
    ) where

import Control.Concurrent.MVar          (newEmptyMVar, putMVar, takeMVar)
import Control.Distributed.Process      (NodeStats (..), getLocalNodeStats,
                                         liftIO)
import Control.Distributed.Process.Node (LocalNode, runProcess)
import System.Metrics                   (Store, Value (..), registerGroup)

import qualified Data.HashMap.Strict as HM
import qualified Data.Text           as T

registerLocalNodeMetrics :: LocalNode -> Store -> IO ()
registerLocalNodeMetrics node = registerGroup stats sample
  where
    sample :: IO NodeStats
    sample = do
      s <- newEmptyMVar
      runProcess node
        (getLocalNodeStats >>= liftIO . putMVar s)
      takeMVar s

    stats :: HM.HashMap T.Text (NodeStats -> Value)
    stats = HM.fromList
      [ ( T.pack "dp.node.reg_names"
        , Gauge . fromIntegral . nodeStatsRegisteredNames
        )
      , ( T.pack "dp.node.monitors"
        , Gauge . fromIntegral . nodeStatsMonitors
        )
      , ( T.pack "dp.node.links"
        , Gauge . fromIntegral . nodeStatsLinks
        )
      , ( T.pack "dp.node.processes"
        , Gauge . fromIntegral . nodeStatsProcesses
        )
      ]