ridley-extras 0.1.2.0 → 0.1.3.0
raw patch · 3 files changed
+263/−4 lines, 3 filesdep ~ekg-prometheus-adapterPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: ekg-prometheus-adapter
API changes (from Hackage documentation)
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: FreeGauges :: !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> FreeGauges
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: FreeReport :: !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> FreeReport
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_available_mb] :: FreeReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_available_mb_g] :: FreeGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_buff_cache_mb] :: FreeReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_buff_cache_mb_g] :: FreeGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_free_mb] :: FreeReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_free_mb_g] :: FreeGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_shared_mb] :: FreeReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_shared_mb_g] :: FreeGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_total_mb] :: FreeReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_total_mb_g] :: FreeGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_used_mb] :: FreeReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_mem_used_mb_g] :: FreeGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_swap_free_mb] :: FreeReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_swap_free_mb_g] :: FreeGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_swap_total_mb] :: FreeReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_swap_total_mb_g] :: FreeGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_swap_used_mb] :: FreeReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: [free_swap_used_mb_g] :: FreeGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: data FreeGauges
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: data FreeReport
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: emptyFreeReport :: FreeReport
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: getFreeStats :: IO FreeReport
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: instance GHC.Classes.Eq System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory.FreeReport
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: instance GHC.Show.Show System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory.FreeReport
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: systemPhysicalMemory :: MonadIO m => RidleyOptions -> RegistryT m RidleyMetricHandler
+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory: updateFreeStats :: FreeGauges -> Bool -> IO ()
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: VmStatGauges :: !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> !Gauge -> VmStatGauges
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: VmStatReport :: !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> !Word64 -> VmStatReport
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_active_memory_mb] :: VmStatReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_active_memory_mb_g] :: VmStatGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_buffer_memory_mb] :: VmStatReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_buffer_memory_mb_g] :: VmStatGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_free_memory_mb] :: VmStatReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_free_memory_mb_g] :: VmStatGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_free_swap_mb] :: VmStatReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_free_swap_mb_g] :: VmStatGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_inactive_memory_mb] :: VmStatReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_inactive_memory_mb_g] :: VmStatGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_swap_cache_mb] :: VmStatReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_swap_cache_mb_g] :: VmStatGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_total_memory_mb] :: VmStatReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_total_memory_mb_g] :: VmStatGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_total_swap_mb] :: VmStatReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_total_swap_mb_g] :: VmStatGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_used_memory_mb] :: VmStatReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_used_memory_mb_g] :: VmStatGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_used_swap_mb] :: VmStatReport -> !Word64
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: [vmstat_used_swap_mb_g] :: VmStatGauges -> !Gauge
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: data VmStatGauges
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: data VmStatReport
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: emptyVmStatReport :: VmStatReport
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: getVmStats :: IO VmStatReport
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: instance GHC.Classes.Eq System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory.VmStatReport
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: instance GHC.Show.Show System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory.VmStatReport
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: systemVirtualMemory :: MonadIO m => RidleyOptions -> RegistryT m RidleyMetricHandler
+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory: updateVmStat :: VmStatGauges -> Bool -> IO ()
Files
- ridley-extras.cabal +7/−4
- src/System/Metrics/Prometheus/Ridley/Metrics/PhysicalMemory.hs +120/−0
- src/System/Metrics/Prometheus/Ridley/Metrics/VirtualMemory.hs +136/−0
ridley-extras.cabal view
@@ -1,5 +1,5 @@ name: ridley-extras-version: 0.1.2.0+version: 0.1.3.0 synopsis: Handy metrics that don't belong to ridley. description: See README.md homepage: https://github.com/iconnect/ridley/ridley-extras#readme@@ -7,7 +7,7 @@ license-file: LICENSE author: Alfredo Di Napoli maintainer: chrisd@irisconnect.co.uk-copyright: 2017 Alfredo Di Napoli & IRIS Connect Engineering Team+copyright: 2017-2022 Alfredo Di Napoli & IRIS Connect Engineering Team category: Web build-type: Simple extra-source-files: README.md@@ -20,13 +20,16 @@ library hs-source-dirs: src- exposed-modules: System.Metrics.Prometheus.Ridley.Metrics.FD+ exposed-modules:+ System.Metrics.Prometheus.Ridley.Metrics.FD+ System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory+ System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory build-depends: base >= 4.7 && < 5, text, prometheus < 3, shelly < 1.9.0.0, microlens,- ekg-prometheus-adapter < 0.2.0.0,+ ekg-prometheus-adapter < 0.3.0.0, mtl, transformers, ridley >= 0.3.3.0 && < 0.4.0.0
+ src/System/Metrics/Prometheus/Ridley/Metrics/PhysicalMemory.hs view
@@ -0,0 +1,120 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TypeApplications #-}+module System.Metrics.Prometheus.Ridley.Metrics.PhysicalMemory where++import Control.Monad.IO.Class+import Data.Maybe (fromMaybe, mapMaybe)+import Data.Monoid+import Data.Word+import qualified Data.Text as T+import Lens.Micro+import Shelly+import qualified System.Metrics.Prometheus.Metric.Gauge as P+import qualified System.Metrics.Prometheus.RegistryT as P+import System.Metrics.Prometheus.Ridley.Types+import System.Posix.Types (ProcessID)+import System.Remote.Monitoring.Prometheus (labels)+import Text.Read (readMaybe)++{- Calling 'free' will report+[service-runner@hermes-devel ~]$ free -k+ total used free shared buff/cache available+Mem: 962 377 251 36 333 377+Swap: 4095 0 4095+-}++--------------------------------------------------------------------------------+getFreeStats :: IO FreeReport+getFreeStats = do+ rawOutput <- shelly $ silently $ escaping False $+ mapMaybe (readMaybe @Word64 . T.unpack) . T.words . T.strip <$> run "free" ["-m" ,"|" , "tail", "-n", "-2" , "|", "awk", "-F", "\" \"", "'{printf \"%s %s %s %s %s %s %s\", $2, $3, $4, $5, $6, $7, $8}'"]+ case rawOutput of+ [ free_mem_total_mb+ , free_mem_used_mb+ , free_mem_free_mb+ , free_mem_shared_mb+ , free_mem_buff_cache_mb+ , free_mem_available_mb+ , free_swap_total_mb+ , free_swap_used_mb+ , free_swap_free_mb+ ] -> pure $ FreeReport{..}+ _ -> pure emptyFreeReport++--------------------------------------------------------------------------------+updateFreeStats :: FreeGauges -> Bool -> IO ()+updateFreeStats FreeGauges{..} _ = do+#ifdef darwin_HOST_OS+ let FreeReport{..} = emptyFreeReport-- "free" is not available on Darwin.+#else+ FreeReport{..} <- getFreeStats+#endif+ P.set (realToFrac free_mem_total_mb ) free_mem_total_mb_g+ P.set (realToFrac free_mem_used_mb ) free_mem_used_mb_g+ P.set (realToFrac free_mem_free_mb ) free_mem_free_mb_g+ P.set (realToFrac free_mem_shared_mb ) free_mem_shared_mb_g+ P.set (realToFrac free_mem_buff_cache_mb ) free_mem_buff_cache_mb_g+ P.set (realToFrac free_mem_available_mb ) free_mem_available_mb_g+ P.set (realToFrac free_swap_total_mb ) free_swap_total_mb_g+ P.set (realToFrac free_swap_used_mb ) free_swap_used_mb_g+ P.set (realToFrac free_swap_free_mb ) free_swap_free_mb_g++data FreeReport =+ FreeReport {+ free_mem_total_mb :: !Word64+ , free_mem_used_mb :: !Word64+ , free_mem_free_mb :: !Word64+ , free_mem_shared_mb :: !Word64+ , free_mem_buff_cache_mb :: !Word64+ , free_mem_available_mb :: !Word64+ , free_swap_total_mb :: !Word64+ , free_swap_used_mb :: !Word64+ , free_swap_free_mb :: !Word64+ } deriving (Show, Eq)++emptyFreeReport :: FreeReport+emptyFreeReport = FreeReport+ { free_mem_total_mb = 0+ , free_mem_used_mb = 0+ , free_mem_free_mb = 0+ , free_mem_shared_mb = 0+ , free_mem_buff_cache_mb = 0+ , free_mem_available_mb = 0+ , free_swap_total_mb = 0+ , free_swap_used_mb = 0+ , free_swap_free_mb = 0+ }+++data FreeGauges =+ FreeGauges {+ free_mem_total_mb_g :: !P.Gauge+ , free_mem_used_mb_g :: !P.Gauge+ , free_mem_free_mb_g :: !P.Gauge+ , free_mem_shared_mb_g :: !P.Gauge+ , free_mem_buff_cache_mb_g :: !P.Gauge+ , free_mem_available_mb_g :: !P.Gauge+ , free_swap_total_mb_g :: !P.Gauge+ , free_swap_used_mb_g :: !P.Gauge+ , free_swap_free_mb_g :: !P.Gauge+ }++--------------------------------------------------------------------------------+-- | Returns the physical memory total and free as sampled from 'free'.+systemPhysicalMemory :: MonadIO m+ => RidleyOptions+ -> P.RegistryT m RidleyMetricHandler+systemPhysicalMemory opts = do+ let popts = opts ^. prometheusOptions+ gauges <- FreeGauges <$> P.registerGauge "free_mem_total_mb" (popts ^. labels)+ <*> P.registerGauge "free_mem_used_mb" (popts ^. labels)+ <*> P.registerGauge "free_mem_free_mb" (popts ^. labels)+ <*> P.registerGauge "free_mem_shared_mb" (popts ^. labels)+ <*> P.registerGauge "free_mem_buff_cache_mb" (popts ^. labels)+ <*> P.registerGauge "free_mem_available_mb" (popts ^. labels)+ <*> P.registerGauge "free_swap_total_mb" (popts ^. labels)+ <*> P.registerGauge "free_swap_used_mb" (popts ^. labels)+ <*> P.registerGauge "free_swap_free_mb" (popts ^. labels)+ return $ mkRidleyMetricHandler "ridley-physical-memory-statistics" gauges updateFreeStats False
+ src/System/Metrics/Prometheus/Ridley/Metrics/VirtualMemory.hs view
@@ -0,0 +1,136 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TypeApplications #-}+module System.Metrics.Prometheus.Ridley.Metrics.VirtualMemory where++import Control.Monad.IO.Class+import Data.Maybe (fromMaybe, mapMaybe)+import Data.Monoid+import Data.Word+import qualified Data.Text as T+import Lens.Micro+import Shelly+import qualified System.Metrics.Prometheus.Metric.Gauge as P+import qualified System.Metrics.Prometheus.RegistryT as P+import System.Metrics.Prometheus.Ridley.Types+import System.Posix.Types (ProcessID)+import System.Remote.Monitoring.Prometheus (labels)+import Text.Read (readMaybe)++{- Calling 'vmstat' will report++[centos@atlas-eu ~]$ vmstat -S M -s+ 130701440 M total memory+ 52971728 M used memory+ 92670416 M active memory+ 33348008 M inactive memory+ 852768 M free memory+ 0 M buffer memory+ 76876944 M swap cache+ 0 M total swap+ 0 M used swap+ 0 M free swap+ ...+-}++--------------------------------------------------------------------------------+getVmStats :: IO VmStatReport+getVmStats = do+ rawOutput <- shelly $ silently $ escaping False $+ mapMaybe (readMaybe @Word64 . T.unpack) . T.words . T.strip+ <$> run "vmstat" ["-S", "M", "-s" ,"|" , "head", "-n", "10" , "|" , "awk", "-F", "\" \"" , "'{print $1}'" ]+ case rawOutput of+ [ vmstat_total_memory_mb+ , vmstat_used_memory_mb+ , vmstat_active_memory_mb+ , vmstat_inactive_memory_mb+ , vmstat_free_memory_mb+ , vmstat_buffer_memory_mb+ , vmstat_swap_cache_mb+ , vmstat_total_swap_mb+ , vmstat_used_swap_mb+ , vmstat_free_swap_mb+ ] -> pure $ VmStatReport{..}+ _ -> pure emptyVmStatReport++--------------------------------------------------------------------------------+updateVmStat :: VmStatGauges -> Bool -> IO ()+updateVmStat VmStatGauges{..} _ = do+#ifdef darwin_HOST_OS+ let VmStatReport{..} = emptyVmStatReport-- "vmstat" is not available on Darwin.+#else+ VmStatReport{..} <- getVmStats+#endif+ P.set (realToFrac vmstat_total_memory_mb ) vmstat_total_memory_mb_g+ P.set (realToFrac vmstat_used_memory_mb ) vmstat_used_memory_mb_g+ P.set (realToFrac vmstat_active_memory_mb ) vmstat_active_memory_mb_g+ P.set (realToFrac vmstat_inactive_memory_mb ) vmstat_inactive_memory_mb_g+ P.set (realToFrac vmstat_free_memory_mb ) vmstat_free_memory_mb_g+ P.set (realToFrac vmstat_buffer_memory_mb ) vmstat_buffer_memory_mb_g+ P.set (realToFrac vmstat_swap_cache_mb ) vmstat_swap_cache_mb_g+ P.set (realToFrac vmstat_total_swap_mb ) vmstat_total_swap_mb_g+ P.set (realToFrac vmstat_used_swap_mb ) vmstat_used_swap_mb_g+ P.set (realToFrac vmstat_free_swap_mb ) vmstat_free_swap_mb_g++data VmStatReport =+ VmStatReport {+ vmstat_total_memory_mb :: !Word64+ , vmstat_used_memory_mb :: !Word64+ , vmstat_active_memory_mb :: !Word64+ , vmstat_inactive_memory_mb :: !Word64+ , vmstat_free_memory_mb :: !Word64+ , vmstat_buffer_memory_mb :: !Word64+ , vmstat_swap_cache_mb :: !Word64+ , vmstat_total_swap_mb :: !Word64+ , vmstat_used_swap_mb :: !Word64+ , vmstat_free_swap_mb :: !Word64+ } deriving (Show, Eq)++emptyVmStatReport :: VmStatReport+emptyVmStatReport = VmStatReport+ { vmstat_total_memory_mb = 0+ , vmstat_used_memory_mb = 0+ , vmstat_active_memory_mb = 0+ , vmstat_inactive_memory_mb = 0+ , vmstat_free_memory_mb = 0+ , vmstat_buffer_memory_mb = 0+ , vmstat_swap_cache_mb = 0+ , vmstat_total_swap_mb = 0+ , vmstat_used_swap_mb = 0+ , vmstat_free_swap_mb = 0+ }+++data VmStatGauges =+ VmStatGauges {+ vmstat_total_memory_mb_g :: !P.Gauge+ , vmstat_used_memory_mb_g :: !P.Gauge+ , vmstat_active_memory_mb_g :: !P.Gauge+ , vmstat_inactive_memory_mb_g :: !P.Gauge+ , vmstat_free_memory_mb_g :: !P.Gauge+ , vmstat_buffer_memory_mb_g :: !P.Gauge+ , vmstat_swap_cache_mb_g :: !P.Gauge+ , vmstat_total_swap_mb_g :: !P.Gauge+ , vmstat_used_swap_mb_g :: !P.Gauge+ , vmstat_free_swap_mb_g :: !P.Gauge+ }++--------------------------------------------------------------------------------+-- | Returns the virtual memory total and free as sampled from 'vmstat'.+systemVirtualMemory :: MonadIO m+ => RidleyOptions+ -> P.RegistryT m RidleyMetricHandler+systemVirtualMemory opts = do+ let popts = opts ^. prometheusOptions+ gauges <- VmStatGauges <$> P.registerGauge "vmstat_total_memory_mb" (popts ^. labels)+ <*> P.registerGauge "vmstat_used_memory_mb" (popts ^. labels)+ <*> P.registerGauge "vmstat_active_memory_mb" (popts ^. labels)+ <*> P.registerGauge "vmstat_inactive_memory_mb" (popts ^. labels)+ <*> P.registerGauge "vmstat_free_memory_mb" (popts ^. labels)+ <*> P.registerGauge "vmstat_buffer_memory_mb" (popts ^. labels)+ <*> P.registerGauge "vmstat_swap_cache_mb" (popts ^. labels)+ <*> P.registerGauge "vmstat_total_swap_mb" (popts ^. labels)+ <*> P.registerGauge "vmstat_used_swap_mb" (popts ^. labels)+ <*> P.registerGauge "vmstat_free_swap_mb" (popts ^. labels)+ return $ mkRidleyMetricHandler "ridley-virtual-memory-statistics" gauges updateVmStat False