module Network.Monitoring.Riemann.Event.Monoid where

import Data.Monoid (Endo(Endo), appEndo)
import Data.Time.Clock.POSIX (getPOSIXTime)
import Network.HostName (getHostName)
import Network.Monitoring.Riemann.Event (Service)
import qualified Network.Monitoring.Riemann.Event as E
import Network.Monitoring.Riemann.Proto.Attribute (Attribute)
import qualified Network.Monitoring.Riemann.Proto.Event as PE
import Text.ProtocolBuffers.Basic (Int64)

type Event = PE.Event

append :: a -> Endo a -> a
append :: a -> Endo a -> a
append = (Endo a -> a -> a) -> a -> Endo a -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Endo a -> a -> a
forall a. Endo a -> a -> a
appEndo

ok :: Service -> Endo Event -> Event
ok :: Service -> Endo Event -> Event
ok Service
s = Event -> Endo Event -> Event
forall a. a -> Endo a -> a
append (Event -> Endo Event -> Event) -> Event -> Endo Event -> Event
forall a b. (a -> b) -> a -> b
$ Service -> Event
E.ok Service
s

warn :: Service -> Endo Event -> Event
warn :: Service -> Endo Event -> Event
warn Service
s = Event -> Endo Event -> Event
forall a. a -> Endo a -> a
append (Event -> Endo Event -> Event) -> Event -> Endo Event -> Event
forall a b. (a -> b) -> a -> b
$ Service -> Event
E.warn Service
s

failure :: Service -> Endo Event -> Event
failure :: Service -> Endo Event -> Event
failure Service
s = Event -> Endo Event -> Event
forall a. a -> Endo a -> a
append (Event -> Endo Event -> Event) -> Event -> Endo Event -> Event
forall a b. (a -> b) -> a -> b
$ Service -> Event
E.warn Service
s

desc :: String -> Endo Event
desc :: Service -> Endo Event
desc = (Event -> Event) -> Endo Event
forall a. (a -> a) -> Endo a
Endo ((Event -> Event) -> Endo Event)
-> (Service -> Event -> Event) -> Service -> Endo Event
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Service -> Event -> Event
E.description

ttl :: Float -> Endo Event
ttl :: Float -> Endo Event
ttl = (Event -> Event) -> Endo Event
forall a. (a -> a) -> Endo a
Endo ((Event -> Event) -> Endo Event)
-> (Float -> Event -> Event) -> Float -> Endo Event
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Event -> Event
E.ttl

metric :: (E.Metric a) => a -> Endo Event
metric :: a -> Endo Event
metric = (Event -> Event) -> Endo Event
forall a. (a -> a) -> Endo a
Endo ((Event -> Event) -> Endo Event)
-> (a -> Event -> Event) -> a -> Endo Event
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Event -> Event
forall a. Metric a => a -> Event -> Event
E.metric

timestamp :: Int64 -> Endo Event
timestamp :: Int64 -> Endo Event
timestamp Int64
t = (Event -> Event) -> Endo Event
forall a. (a -> a) -> Endo a
Endo ((Event -> Event) -> Endo Event) -> (Event -> Event) -> Endo Event
forall a b. (a -> b) -> a -> b
$ \Event
e -> Event
e {time :: Maybe Int64
PE.time = Int64 -> Maybe Int64
forall a. a -> Maybe a
Just Int64
t}

attributes :: [Attribute] -> Endo Event
attributes :: [Attribute] -> Endo Event
attributes = (Event -> Event) -> Endo Event
forall a. (a -> a) -> Endo a
Endo ((Event -> Event) -> Endo Event)
-> ([Attribute] -> Event -> Event) -> [Attribute] -> Endo Event
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Attribute] -> Event -> Event
E.attributes

tags :: [String] -> Endo Event
tags :: [Service] -> Endo Event
tags = (Event -> Event) -> Endo Event
forall a. (a -> a) -> Endo a
Endo ((Event -> Event) -> Endo Event)
-> ([Service] -> Event -> Event) -> [Service] -> Endo Event
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Service] -> Event -> Event
E.tags

timeAndHost :: IO (Endo Event)
timeAndHost :: IO (Endo Event)
timeAndHost = do
  Int64
now <- POSIXTime -> Int64
forall a b. (RealFrac a, Integral b) => a -> b
round (POSIXTime -> Int64) -> IO POSIXTime -> IO Int64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO POSIXTime
getPOSIXTime
  Service
hostname <- IO Service
getHostName
  Endo Event -> IO (Endo Event)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Endo Event -> IO (Endo Event))
-> ((Event -> Event) -> Endo Event)
-> (Event -> Event)
-> IO (Endo Event)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Event -> Event) -> Endo Event
forall a. (a -> a) -> Endo a
Endo ((Event -> Event) -> IO (Endo Event))
-> (Event -> Event) -> IO (Endo Event)
forall a b. (a -> b) -> a -> b
$ Int64 -> Service -> Event -> Event
E.addTimeAndHost Int64
now Service
hostname

attribute :: String -> Maybe String -> Attribute
attribute :: Service -> Maybe Service -> Attribute
attribute = Service -> Maybe Service -> Attribute
E.attribute