{-# LANGUAGE DataKinds, GADTs #-} {-# LANGUAGE OverloadedStrings, StandaloneDeriving #-} import Control.Monad.IO.Class import System.Metrics.Counter as TC(read) import System.Metrics.Gauge as TG(read) import System.Remote.Monitoring import Test.Hspec import System.Metrics.Extensible data TestMetrics ty name where Foo1 :: TestMetrics Counter "foo1" Foo2 :: TestMetrics Counter "foo2" Bar :: TestMetrics Gauge "bar" deriving instance Eq (TestMetrics ty name) deriving instance Ord (TestMetrics ty name) data OtherMetrics ty name where Baz :: OtherMetrics Counter "foo1" Quux :: OtherMetrics Gauge "bar" deriving instance Eq (OtherMetrics ty name) deriving instance Ord (OtherMetrics ty name) main :: IO () main = do ekgServer <- forkServer "localhost" 21000 withMetricsStore ekgServer $ \store -> flip runMetricsT store $ do track Foo1 track Foo1 track Foo2 track Bar 10 track Bar 20 track Baz track Quux 42 liftIO $ hspec $ do describe "Counters are stored as expected" $ do it "Foo1 is incremented twice" $ (getMetricFromStore store Foo1 >>= TC.read) `shouldReturn` 2 it "This does not affect Foo2" $ (getMetricFromStore store Foo2 >>= TC.read) `shouldReturn` 1 it "Metrics from other type are also saved" $ (getMetricFromStore store Baz >>= TC.read) `shouldReturn` 1 describe "Gauges are stored as expected" $ do it "The final value of Bar is kept" $ (getMetricFromStore store Bar >>= TG.read) `shouldReturn` 20 it "Metrics from other type are also saved" $ (getMetricFromStore store Quux >>= TG.read) `shouldReturn` 42