{-# language FlexibleContexts #-} {-# language OverloadedStrings #-} module Main (main) where import Prometheus import Control.Monad import Criterion import Criterion.Main import Data.Foldable (for_) import qualified Data.Text as T import System.Random withMetric m = envWithCleanup (register m) (const unregisterAll) withCounter = withMetric (counter (Info "a" "b")) withGauge = withMetric (gauge (Info "a" "b")) withSummary quantiles = withMetric (summary (Info "a" "b") quantiles) withHistogram buckets = withMetric (histogram (Info "a" "b") buckets) main :: IO () main = defaultMain [ benchCounter , benchGauge , benchSummary , benchHistogram , benchExport ] -- Counter benchmarks benchCounter = withCounter $ \counter -> bgroup "Counter" [ benchIncCounter counter , benchAddCounter counter , benchAddDurationToCounter counter ] benchIncCounter testCounter = bench "incCounter" $ whnfIO (incCounter testCounter) benchAddCounter testCounter = bench "addCounter" $ whnfIO (addCounter testCounter 50) benchAddDurationToCounter testCounter = bench "addDurationToCounter" $ whnfIO (addDurationToCounter testCounter $ return ()) -- Gauge benchmarks benchGauge = withGauge $ \gauge -> bgroup "Gauge" [ benchIncGauge gauge , benchAddGauge gauge , benchSubGauge gauge , benchSetGaugeToDuration gauge ] benchIncGauge testGauge = bench "incGauge" $ whnfIO (incGauge testGauge) benchAddGauge testGauge = bench "addGauge" $ whnfIO (addGauge testGauge 50) benchSubGauge testGauge = bench "subGauge" $ whnfIO (subGauge testGauge 50) benchSetGaugeToDuration testGauge = bench "setGaugeToDuration" $ whnfIO (setGaugeToDuration testGauge $ return ()) -- Summary benchmarks benchSummary = bgroup "Summary" (map benchSummaryWithQuantiles [defaultQuantiles]) benchSummaryWithQuantiles q = withSummary q $ \summary -> bgroup ("Quantiles = " ++ show q) [ benchSummaryObserve summary ] benchSummaryObserve s = bench "observe" $ whnfIO (observe s 42) -- Histogram benchmarks benchHistogram = bgroup "Histogram" (map benchHistogramWithQuantiles [defaultBuckets]) benchHistogramWithQuantiles q = withHistogram q $ \histogram -> bgroup ("Buckets = " ++ show q) [ benchHistogramObserve histogram ] benchHistogramObserve s = bench "observe" $ whnfIO (observe s 42) -- Exporter benchmarks benchExport = bgroup "exportMetricsAsText" [ bgroup "Export counters" (map benchExportCounters [100, 1000, 10000]) , bgroup "Export histograms" (map benchExportHistograms [100, 1000, 10000]) ] benchExportCounters nCounters = envWithCleanup setup teardown ( const benchmark ) where benchmark = bench (show nCounters ++ " counters") (nfIO exportMetricsAsText) setup = replicateM_ nCounters $ do register $ counter (Info (T.pack $ show nCounters) "") teardown _ = unregisterAll benchExportHistograms nHistograms = envWithCleanup setup teardown ( const benchmark ) where benchmark = bench (show nHistograms ++ " histograms") (nfIO exportMetricsAsText) setup = replicateM_ nHistograms $ do register $ histogram (Info (T.pack $ show nHistograms) "") defaultBuckets teardown _ = unregisterAll