{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE OverloadedStrings          #-}

module Avers.Metrics where

import           Control.Concurrent
import           Control.Monad.State

import           Data.Text (Text)

import           Network.BSD

import           Database.InfluxDB
import           Database.InfluxDB.TH

import           Avers.Types


data Point = Point
    { pointMachine   :: String
    , pointComponent :: Text
    , pointValue     :: Double
    }


reportPoint :: Text -> Double -> Avers ()
reportPoint series value = do
    ac <- gets config
    case influxConfig ac of
        Nothing -> return ()
        Just cfg -> void $ liftIO $ forkIO $ do
            h <- getHostName
            postWithPrecision cfg "rmx" SecondsPrecision $ withSeries series $ do
                writePoints $ Point h "api" value


deriveSeriesData defaultOptions
  { fieldLabelModifier = stripPrefixLower "point" }
  ''Point