packages feed

otel-effectful-1.0.0: src/Effectful/OpenTelemetry/Protocol/HTTP.hs

module Effectful.OpenTelemetry.Protocol.HTTP {-# WARNING in "x-unstable-interface" "This is an unstable interface." #-} where

import Codec.Compression.GZip qualified as GZip
import Control.Monad (void)
import Data.ByteString.Lazy (LazyByteString)
import Data.Maybe (maybeToList)
import Effectful
import Effectful.Error.Static (Error, throwError)
import Effectful.Exception (handle)
import Effectful.HttpClient
    ( HttpClient
    , HttpException
    , RequestBody (..)
    , ResponseTimeout
    , httpNoBody
    , method
    , requestBody
    , requestFromURI_
    , requestHeaders
    , responseTimeout
    )
import Effectful.OpenTelemetry.Protocol.Transport (Compression (..), Encoding)
import Effectful.OpenTelemetry.Protocol.Transport qualified as Transport
import Network.URI (URI)
import Network.URI.Static (uri)
import Prelude

-- | Default OTLP HTTP endpoint URI: @http:\/\/localhost:4318@.
defaultEndpoint :: URI
defaultEndpoint = [uri|http://localhost:4318|]

sendPayload
    :: (HttpClient :> es, Error HttpException :> es)
    => URI
    -> Encoding
    -> Compression
    -> ResponseTimeout
    -> LazyByteString
    -> Eff es ()
sendPayload endpoint encoding compression responseTimeout body =
    void
        . handle @HttpException throwError
        . httpNoBody
        $ (requestFromURI_ endpoint)
            { method = "POST"
            , requestBody = RequestBodyLBS (compress body)
            , requestHeaders =
                Transport.contentType encoding
                    : maybeToList (Transport.contentEncoding compression)
            , responseTimeout
            }
  where
    compress = case compression of
        NoCompression -> id
        GZip -> GZip.compress