module Control.Monad.Metrics.Internal where
import Control.Monad.Reader (asks)
import Data.IORef
import Data.Map (Map)
import Data.Text (Text)
import Lens.Micro
import System.Metrics (Store)
import System.Metrics.Counter (Counter)
import System.Metrics.Distribution (Distribution)
import System.Metrics.Gauge (Gauge)
import System.Metrics.Label (Label)
data Metrics = Metrics
{ _metricsCounters :: IORef (Map Text Counter)
, _metricsGauges :: IORef (Map Text Gauge)
, _metricsDistributions :: IORef (Map Text Distribution)
, _metricsLabels :: IORef (Map Text Label)
, _metricsStore :: Store
}
metricsCounters :: Lens' Metrics (IORef (Map Text Counter))
metricsCounters f (Metrics c g d l s) = fmap (\c' -> Metrics c' g d l s) (f c)
metricsGauges :: Lens' Metrics (IORef (Map Text Gauge))
metricsGauges f (Metrics c g d l s) = fmap (\g' -> Metrics c g' d l s) (f g)
metricsDistributions :: Lens' Metrics (IORef (Map Text Distribution))
metricsDistributions f (Metrics c g d l s) = fmap (\d' -> Metrics c g d' l s) (f d)
metricsLabels :: Lens' Metrics (IORef (Map Text Label))
metricsLabels f (Metrics c g d l s) = fmap (\l' -> Metrics c g d l' s) (f l)
metricsStore :: Lens' Metrics Store
metricsStore f (Metrics c g d l s) = fmap (Metrics c g d l) (f s)
data Resolution
= Nanoseconds
| Microseconds
| Milliseconds
| Seconds
| Minutes
| Hours
| Days
deriving (Eq, Show, Ord, Enum)