diff --git a/agent/src/Lib/External/Metrics/Top.hs b/agent/src/Lib/External/Metrics/Top.hs index 115421fd2..41d99048b 100644 --- a/agent/src/Lib/External/Metrics/Top.hs +++ b/agent/src/Lib/External/Metrics/Top.hs @@ -18,15 +18,14 @@ data TopMetrics = TopMetrics { metricMemPercentageUsed :: Maybe Percentage , metricMemFree :: Maybe MebiBytes , metricMemUsed :: Maybe MebiBytes - , metricSwapTotal :: Maybe MebiBytes , metricSwapUsed :: Maybe MebiBytes - , metricCpuIdle :: Maybe Percentage , metricCpuUserSpace :: Maybe Percentage , metricWait :: Maybe Percentage , metricCpuPercentageUsed :: Maybe Percentage - } deriving (Eq, Show) + } + deriving (Eq, Show) getTopMetrics :: MonadIO m => S9ErrT m TopMetrics getTopMetrics = fmap parseTop runTop @@ -51,8 +50,8 @@ parseTop t = TopMetrics { metricMemPercentageUsed = getMemPercentageUsed <$> mem where topLines = lines t cpu = getCpuAggregates topLines - mem = getMemAggregates memHeader topLines - swapS = getMemAggregates swapHeader topLines + mem = getMemAggregates topLines + swapS = getSwapAggregates topLines memHeader :: Text memHeader = "MiB Mem" @@ -64,7 +63,8 @@ data TopMemAggregates = TopMemAggregates { memTotal :: Double , memFree :: Double , memUsed :: Double - } deriving (Eq, Show) + } + deriving (Eq, Show) cpuHeader :: Text cpuHeader = "%Cpu(s)" @@ -78,13 +78,24 @@ data TopCpuAggregates = TopCpuAggregates , cpuHi :: Percentage , cpuSi :: Percentage , cpuSt :: Percentage - } deriving (Eq, Show) + } + deriving (Eq, Show) -getMemAggregates :: Text -> [Text] -> Maybe TopMemAggregates -getMemAggregates header topRes = do - memLine <- getLineByHeader header topRes +getMemAggregates :: [Text] -> Maybe TopMemAggregates +getMemAggregates topRes = do + memLine <- getLineByHeader memHeader topRes + swapLine <- getLineByHeader swapHeader topRes let stats = HM.fromList $ getStats readMaybe memLine memTotal <- HM.lookup "total" stats + memFree <- HM.lookup "avail" (HM.fromList $ getStats readMaybe swapLine) + memUsed <- HM.lookup "used" stats + pure TopMemAggregates { .. } + +getSwapAggregates :: [Text] -> Maybe TopMemAggregates +getSwapAggregates topRes = do + swapLine <- getLineByHeader swapHeader topRes + let stats = HM.fromList $ getStats readMaybe swapLine + memTotal <- HM.lookup "total" stats memFree <- HM.lookup "free" stats memUsed <- HM.lookup "used" stats pure TopMemAggregates { .. } diff --git a/agent/src/Lib/External/Util.hs b/agent/src/Lib/External/Util.hs index 17a8ce12b..c4cc91223 100644 --- a/agent/src/Lib/External/Util.hs +++ b/agent/src/Lib/External/Util.hs @@ -13,5 +13,5 @@ truncateToS :: Int -> Double -> Double truncateToS n x = fromIntegral (floor (x * t) :: Integer) / t where t = 10 ^ n parseToPair :: (Text -> Maybe a) -> [Text] -> Maybe (Text, a) -parseToPair parse [k, v] = ((k, ) <$> parse v) <|> ((v, ) <$> parse k) -parseToPair _ _ = Nothing +parseToPair parse (k : v : _) = ((k, ) <$> parse v) <|> ((v, ) <$> parse k) +parseToPair _ _ = Nothing