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 ) ]