module Network.Metric.Sink.Graphite (
Sink(..)
, open
, Group
, Bucket
, Metric(..)
) where
import Data.Time.Clock.POSIX (POSIXTime, getPOSIXTime)
import Network.Socket (SocketType(..))
import Network.Metric.Internal
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as BL
data Graphite = Graphite Host Handle deriving (Show)
instance Sink Graphite where
push (Graphite host hd) m = do
time <- getPOSIXTime
mapM_ (hPush hd . enc time) (measure m)
where
enc t (Counter g b v) = put host g b v t
enc t (Timer g b v) = put host g b v t
enc t (Gauge g b v) = put host g b v t
close (Graphite _ hd) = hClose hd
open :: Host -> HostName -> PortNumber -> IO AnySink
open host = fOpen (Graphite host) Stream
put :: Encodable a
=> Host
-> Group
-> Bucket
-> a
-> POSIXTime
-> BL.ByteString
put host group bucket value time =
BL.fromChunks [key host group bucket, encode value, timestamp]
where
timestamp = BS.pack $ show (truncate time :: Integer)