{-# language GeneralizedNewtypeDeriving #-}
module Prometheus.Metric (
Metric (..)
, Sample (..)
, SampleGroup (..)
, SampleType (..)
) where
import Prometheus.Info
import Prometheus.Label
import Control.DeepSeq
import qualified Data.ByteString as BS
import Data.Text (Text)
-- | The type of a sample. This corresponds to the 5 types of metrics supported
-- by Prometheus.
data SampleType
= CounterType
| GaugeType
| SummaryType
| HistogramType
| UntypedType
instance Show SampleType where
show CounterType = "counter"
show GaugeType = "gauge"
show SummaryType = "summary"
show HistogramType = "histogram"
show UntypedType = "untyped"
-- | A single value recorded at a moment in time. The sample type contains the
-- name of the sample, a list of labels and their values, and the value encoded
-- as a ByteString.
data Sample = Sample Text LabelPairs BS.ByteString
deriving (Show)
-- | A Sample group is a list of samples that is tagged with meta data
-- including the name, help string, and type of the sample.
data SampleGroup = SampleGroup Info SampleType [Sample]
deriving (Show)
-- | A metric represents a single value that is being monitored. It is comprised
-- of a handle value and a collect method. The handle value is typically a new
-- type wrapped value that provides access to the internal state of the metric.
-- The collect method samples the current value of the metric.
newtype Metric s =
Metric
{ -- | 'construct' is an 'IO' action that creates a new instance of a metric.
-- For example, in a counter, this 'IO' action would create a mutable reference
-- to maintain the state of the counter.
--
-- 'construct' returns two things:
--
-- 1. The state of the metric itself, which can be used to modify the
-- metric. A counter would return state pointing to the mutable
-- reference.
-- 2. An 'IO' action that samples the metric and returns 'SampleGroup's.
-- This is the data that will be stored by Prometheus.
construct :: IO (s, IO [SampleGroup])
}
instance NFData a => NFData (Metric a) where
rnf (Metric a) = a `seq` ()