module Network.Metric.Sink.Graphite (
open
, Sink(push, close)
, Group
, Bucket
, Metric(..)
) where
import Control.Monad (liftM)
import Network.Socket (SocketType(..))
import Data.Time.Clock.POSIX (getPOSIXTime)
import Network.Metric.Internal
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as BL
data Graphite = Graphite Handle deriving (Show)
instance Sink Graphite where
push (Graphite h) m = enc m >>= hPush h
where
enc (Counter g b v) = put g b v
enc (Timer g b v) = put g b v
enc (Gauge g b v) = put g b v
close (Graphite h) = hClose h
open :: String -> String -> IO MetricSink
open = fOpen Graphite Stream
put :: Encodable a => Group -> Bucket -> a -> IO BL.ByteString
put group bucket value = liftM bstr getPOSIXTime
where
timestamp n = BS.pack $ show (truncate n :: Integer)
bstr n = BL.fromChunks [key group bucket, encode value, timestamp n]