ekg 0.4.0.7 → 0.4.0.8
raw patch · 3 files changed
+13/−95 lines, 3 filesdep +ekg-jsondep ~aesonPVP ok
version bump matches the API change (PVP)
Dependencies added: ekg-json
Dependency ranges changed: aeson
API changes (from Hackage documentation)
Files
- CHANGES.md +4/−0
- System/Remote/Json.hs +7/−94
- ekg.cabal +2/−1
CHANGES.md view
@@ -1,3 +1,7 @@+## 0.4.0.8 (2015-07-32)++ * Move the JSON encoding into a separate ekg-json package.+ ## 0.4.0.7 (2015-07-07) * Support aeson-0.9.
System/Remote/Json.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE OverloadedStrings #-}- module System.Remote.Json ( encodeAll@@ -7,102 +5,17 @@ ) where import qualified Data.Aeson.Encode as A-import qualified Data.Aeson.Types as A import qualified Data.ByteString.Lazy as L-import qualified Data.HashMap.Strict as M-import Data.Int (Int64)-import qualified Data.Text as T-import Prelude hiding (read) import System.Metrics-import qualified System.Metrics.Distribution as Distribution----------------------------------------------------------------------------- * JSON serialization--data MetricType =- CounterType- | GaugeType- | LabelType- | DistributionType--metricType :: MetricType -> T.Text-metricType CounterType = "c"-metricType GaugeType = "g"-metricType LabelType = "l"-metricType DistributionType = "d"+import qualified System.Metrics.Json as Json --- | Encode metrics as nested JSON objects. Each "." in the metric--- name introduces a new level of nesting. For example, the metrics--- @[("foo.bar", 10), ("foo.baz", "label")]@ are encoded as------ > {--- > "foo": {--- > "bar": {--- > "type:", "c",--- > "val": 10--- > },--- > "baz": {--- > "type": "l",--- > "val": "label"--- > }--- > }--- > }---+-- | Encode metrics as nested JSON objects. See 'Json.sampleToJson'+-- for a description of the encoding. encodeAll :: Sample -> L.ByteString-encodeAll metrics =- A.encode $ buildOne metrics $ A.emptyObject- where- buildOne :: M.HashMap T.Text Value -> A.Value -> A.Value- buildOne m o = M.foldlWithKey' build o m-- build :: A.Value -> T.Text -> Value -> A.Value- build m name val = go m (T.splitOn "." name) val-- go :: A.Value -> [T.Text] -> Value -> A.Value- go (A.Object m) [str] val = A.Object $ M.insert str metric m- where metric = buildOneM val- go (A.Object m) (str:rest) val = case M.lookup str m of- Nothing -> A.Object $ M.insert str (go A.emptyObject rest val) m- Just m' -> A.Object $ M.insert str (go m' rest val) m- go v _ _ = typeMismatch "Object" v--buildOneM :: Value -> A.Value-buildOneM (Counter n) = goOne n CounterType-buildOneM (Gauge n) = goOne n GaugeType-buildOneM (Label l) = goOne l LabelType-buildOneM (Distribution l) = goDistribution l--goDistribution :: Distribution.Stats -> A.Value-goDistribution stats = A.object [- ("mean", A.toJSON $! Distribution.mean stats),- ("variance", A.toJSON $! Distribution.variance stats),- ("count", A.toJSON $! Distribution.count stats),- ("sum", A.toJSON $! Distribution.sum stats),- ("min", A.toJSON $! Distribution.min stats),- ("max", A.toJSON $! Distribution.max stats),- ("type", A.toJSON (metricType DistributionType))]--goOne :: A.ToJSON a => a -> MetricType -> A.Value-goOne val ty = A.object [- ("val", A.toJSON val), ("type", A.toJSON (metricType ty))]-{-# SPECIALIZE goOne :: Int64 -> MetricType -> A.Value #-}-{-# SPECIALIZE goOne :: T.Text -> MetricType -> A.Value #-}+encodeAll = A.encode . Json.sampleToJson +-- | Encode metric a JSON object. See 'Json.valueToJson'+-- for a description of the encoding. encodeOne :: Value -> L.ByteString-encodeOne = A.encode . buildOneM--typeMismatch :: String -- ^ The expected type- -> A.Value -- ^ The actual value encountered- -> a-typeMismatch expected actual =- error $ "when expecting a " ++ expected ++ ", encountered " ++ name ++- " instead"- where- name = case actual of- A.Object _ -> "Object"- A.Array _ -> "Array"- A.String _ -> "String"- A.Number _ -> "Number"- A.Bool _ -> "Boolean"- A.Null -> "Null"+encodeOne = A.encode . Json.valueToJson
ekg.cabal view
@@ -1,5 +1,5 @@ name: ekg-version: 0.4.0.7+version: 0.4.0.8 synopsis: Remote monitoring of processes description: This library lets you remotely monitor a running process over HTTP.@@ -41,6 +41,7 @@ base >= 4.5 && < 4.9, bytestring < 1.0, ekg-core >= 0.1 && < 0.2,+ ekg-json >= 0.1 && < 0.2, filepath < 1.5, network < 2.7, snap-core < 0.10,