{-# LANGUAGE OverloadedStrings #-}

module OpenTelemetry.Lightstep.Exporter where

import Control.Concurrent.Async
import Control.Concurrent.STM
import Control.Monad.IO.Class
import Data.Aeson
import qualified Data.HashMap.Strict as HM
import Data.Scientific
import qualified Data.Text as T
import Network.HTTP.Client
import Network.HTTP.Client.TLS
import Network.HTTP.Types
import OpenTelemetry.Common
import OpenTelemetry.Exporter
import OpenTelemetry.Lightstep.Config
import OpenTelemetry.SpanContext
import OpenTelemetry.ZipkinExporter
import Text.Printf

createLightstepSpanExporter :: MonadIO m => LightstepConfig -> m (Exporter Span)
createLightstepSpanExporter cfg@(LightstepConfig {..}) = liftIO do
  let zcfg =
        ZipkinConfig
          { zEndpoint = printf "https://%s:%d/api/v2/spans" lsHostName (fromIntegral lsPort :: Int),
            zServiceName = lsServiceName,
            zGlobalTags =
              [ ("lightstep.component", lsServiceName),
                ("lightstep.access_token", lsToken)
              ],
            zSpanQueueSize = lsSpanQueueSize,
            zGracefulShutdownTimeoutSeconds = lsGracefulShutdownTimeoutSeconds
          }
  createZipkinSpanExporter zcfg