{-# LANGUAGE OverloadedStrings #-} module Librato.Metrics where import Data.Aeson import Data.ByteString (ByteString) import Data.Monoid ((<>)) import Data.Text (Text) import Data.Vector (Vector) import Librato.Internal import Librato.Types import Network.HTTP.Types.URI metrics :: ByteString metrics = "metrics" metric :: ByteString -> ByteString metric name = "metrics/" <> segment name data ListMetricsRequest = ListMetricsRequest { lmreqName :: Text , lmreqTag :: [Text] } data Metric = GaugeMetric | CounterMetric data ListMetricsResponse = ListMetricsResponse { lmrespQuery :: PaginationInfo , lmrespMetrics :: Vector Metric } data Measurement = Measurement { mName :: Text , mValue :: Double , mSource :: Maybe Text , mMeasureTime :: Maybe Int } deriving (Show) --data Gauge = Gauge -- { gName -- , gValue -- , gSource -- , gMeasureTime -- , gCount -- , gSum -- , gMax -- , gMin -- , gSumSquares -- } type Gauge = Measurement type Counter = Measurement instance ToJSON Measurement where toJSON m = object [ "name" .= mName m , "value" .= mValue m , "source" .= mSource m , "measure_time" .= mMeasureTime m ] listMetrics :: ListMetricsRequest -> PaginationParameters -> Librato Value listMetrics _ _ = getResponse (get metrics) >>= decodeResponse submitMetrics :: Vector Gauge -> Vector Counter -> Librato () submitMetrics gauges counters = do getResponse (post metrics . jsonBody json) return () where json = object ["gauges" .= gauges, "counters" .= counters] --updateMetrics :: -> Librato (Maybe (JobId ())) --updateMetrics = put metrics --deleteMetrics :: -> Librato (Maybe (JobId ())) --deleteMetrics = delete metrics --getMetric :: MetricName -> Librato (Maybe Metric) --getMetric name = get (metric name) --createMetric :: -> Librato (Maybe Metric) --createMetric name = put (metric name) --updateMetric :: -> Librato Bool --updateMetric name = put (metric name) --deleteMetric :: MetricName -> Librato Bool --deleteMetric name = delete (metric name)