{-# LANGUAGE RecordWildCards, OverloadedStrings #-}
module Main where
import Control.Monad
import Control.Concurrent
import Criterion
import Criterion.Main
import Prometheus
import System.Mem
data Metrics = Metrics
{ aCounter :: Counter
, aGauge :: Gauge
, aHistogram :: Histogram
}
main :: IO ()
main = do
(noopMetrics, _) <-
buildRegistry $ do
aCounter <- register "noop_counter" "" mempty counter
aGauge <- register "noop_gauge" "" mempty gauge
aHistogram <- register "noop_histo" "" mempty (histogram (linearBuckets 1 1 10))
return Metrics {..}
(metrics, retainedRegistry) <-
buildRegistry $ do
aCounter <- register "counter" "" mempty counter
aGauge <- register "gauge" "" mempty gauge
aHistogram <- register "histo" "" mempty (histogram (linearBuckets 1 1 10))
return Metrics {..}
performGC
threadDelay 10000
putStrLn "Running benchmarks:"
defaultMainWith defaultConfig $
[ makeBenchmarks "noop" noopMetrics
, makeBenchmarks "registered" metrics
]
seq retainedRegistry (return ())
makeBenchmarks groupLabel Metrics {..} =
bgroup
groupLabel
[ bench "incCounter" (nfIO (replicateM_ n $ incCounter aCounter))
, bench "incGauge" (nfIO (replicateM_ n $ incGauge aGauge))
, bench "observe" (nfIO (replicateM_ n $ observe 9 aHistogram))
]
where
n = 10000