module Network.DogStatsd (
dogStatsdClient
, increment
, decrement
, count
, gauge
, timing
, histogram
) where
import Network.Statsd (Stat, Type(..), fmtDatagram)
import Network.Statsd.UdpClient(UdpClient, fromURI, send)
import Control.Monad
import Data.Maybe
import Data.List
import Data.Time.Units
import Text.Printf
import Network.URI
type Name = String
type Value = String
type Tags = [(Name, Value)]
dogStatsdClient :: String -> IO UdpClient
dogStatsdClient = fromURI . fromJust . parseURI
increment :: UdpClient -> Stat -> Tags -> IO ()
increment client stat = count client stat 1
decrement :: UdpClient -> Stat -> Tags -> IO ()
decrement client stat = count client stat (1)
count :: UdpClient -> Stat -> Int -> Tags -> IO ()
count client stat value tags = void . send client $ fmtDogStatsdDatagram stat value Count tags
gauge :: UdpClient -> Stat -> Int -> Tags -> IO ()
gauge client stat value tags = void . send client $ fmtDogStatsdDatagram stat value Gauge tags
timing :: UdpClient -> Stat -> Millisecond -> Tags -> IO ()
timing client stat value tags = void . send client $ fmtDogStatsdDatagram stat (fromIntegral value) Timing tags
histogram :: UdpClient -> Stat -> Int -> Tags -> IO ()
histogram client stat value tags = void . send client $ fmtDogStatsdDatagram stat value Histogram tags
fmtTag :: (Name, Value) -> String
fmtTag (a, "") = a
fmtTag (a, b) = a ++ ":" ++ b
fmtDogStatsdDatagram :: Stat -> Int -> Type -> Tags -> String
fmtDogStatsdDatagram stat value statType [] = fmtDatagram stat value statType
fmtDogStatsdDatagram stat value statType tags =
let statsdDatagram = fmtDatagram stat value statType
tagSuffix = intercalate "," $ fmtTag <$> tags
in printf "%s|#%s" statsdDatagram tagSuffix