{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE OverloadedStrings #-} {-# OPTIONS_GHC -Wno-orphans #-} module System.Metrics.TrackerInstances where import qualified Data.Text as T import Control.Monad.IO.Class import GHC.Int import System.Metrics import System.Metrics.Counter as TC import System.Metrics.Distribution as TD import System.Metrics.Gauge as TG import System.Metrics.Label as TL import System.Metrics.Monad.Class instance TrackerLike Counter where type TrackAction Counter m = m () track metric = getTracker metric >>= liftIO . TC.inc createTracker = createCounter instance TrackerLike Distribution where type TrackAction Distribution m = Double -> m () track metric val = getTracker metric >>= \distr -> liftIO $ TD.add distr val createTracker = createDistribution instance TrackerLike Gauge where type TrackAction Gauge m = Int64 -> m () track metric val = getTracker metric >>= \gauge -> liftIO $ TG.set gauge val createTracker = createGauge instance TrackerLike Label where type TrackAction Label m = T.Text -> m () track metric val = getTracker metric >>= \label -> liftIO $ TL.set label val createTracker = createLabel newtype DistrGauge = DistrGauge (Distribution, Gauge) instance TrackerLike DistrGauge where type TrackAction DistrGauge m = Int64 -> m () track metric val = do DistrGauge (distr, gauge) <- getTracker metric liftIO $ do TG.add gauge val TD.add distr $ fromIntegral val createTracker name store = do d <- createDistribution (name <> "_distr") store g <- createGauge (name <> "_total") store pure $ DistrGauge (d, g)