influxdb-1.0.0: src/Database/InfluxDB/Write/UDP.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
module Database.InfluxDB.Write.UDP
( -- * Writers
write
, writeBatch
, writeByteString
-- * Writer parameters
, WriteParams
, writeParams
, socket
, sockAddr
, Types.precision
) where
import Control.Lens
import Network.Socket (SockAddr, Socket)
import Network.Socket.ByteString (sendManyTo)
import qualified Data.ByteString.Lazy as BL
import Database.InfluxDB.Line
import Database.InfluxDB.Types as Types
-- | The full set of parameters for the UDP writer.
data WriteParams = WriteParams
{ _socket :: !Socket
, _sockAddr :: !SockAddr
, _precision :: !(Precision 'WriteRequest)
}
-- | Smart constructor for 'WriteParams'
--
-- Default parameters:
--
-- ['L.precision'] 'Nanosecond'
writeParams :: Socket -> SockAddr -> WriteParams
writeParams _socket _sockAddr = WriteParams
{ _precision = Nanosecond
, ..
}
-- | Write a 'Line'
write
:: Timestamp time
=> WriteParams
-> Line time
-> IO ()
write p@WriteParams {_precision} =
writeByteString p . encodeLine (roundTo _precision)
-- | Write 'Line's in a batch
--
-- This is more efficient than 'write'.
writeBatch
:: (Timestamp time, Traversable f)
=> WriteParams
-> f (Line time)
-> IO ()
writeBatch p@WriteParams {_precision} =
writeByteString p . encodeLines (roundTo _precision)
-- | Write a raw 'L.ByteString'
writeByteString :: WriteParams -> BL.ByteString -> IO ()
writeByteString WriteParams {..} payload =
sendManyTo _socket (BL.toChunks payload) _sockAddr
makeLensesWith (lensRules & generateSignatures .~ False) ''WriteParams
-- | Open UDP socket
socket :: Lens' WriteParams Socket
-- | UDP endopoint of the database
sockAddr :: Lens' WriteParams SockAddr
precision :: Lens' WriteParams (Precision 'WriteRequest)
-- | Timestamp precision.
--
-- In the UDP API, all timestamps are sent in nanosecond but you can specify
-- lower precision. The writer just rounds timestamps to the specified
-- precision.
instance HasPrecision 'WriteRequest WriteParams where
precision = Database.InfluxDB.Write.UDP.precision