packages feed

hs-opentelemetry-exporter-handle-0.0.1.1: src/OpenTelemetry/Exporter/Handle.hs

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module OpenTelemetry.Exporter.Handle (
  makeHandleExporter,
  -- $
  stdoutExporter',
  stderrExporter',
  -- $
  defaultFormatter,
) where

import Data.IORef
import qualified Data.Text.Lazy as L
import qualified Data.Text.Lazy.IO as L
import OpenTelemetry.Exporter
import OpenTelemetry.Trace.Core
import System.IO (Handle, hFlush, stderr, stdout)


makeHandleExporter :: Handle -> (ImmutableSpan -> IO L.Text) -> Exporter ImmutableSpan
makeHandleExporter h f =
  Exporter
    { exporterExport = \fs -> do
        mapM_ (mapM_ (\s -> f s >>= L.hPutStrLn h >> hFlush h)) fs
        pure Success
    , exporterShutdown = hFlush h
    }


stdoutExporter' :: (ImmutableSpan -> IO L.Text) -> Exporter ImmutableSpan
stdoutExporter' = makeHandleExporter stdout


stderrExporter' :: (ImmutableSpan -> IO L.Text) -> Exporter ImmutableSpan
stderrExporter' = makeHandleExporter stderr


defaultFormatter :: ImmutableSpan -> L.Text
defaultFormatter ImmutableSpan {..} =
  L.intercalate
    " "
    [ L.pack $ show $ traceId spanContext
    , L.pack $ show $ spanId spanContext
    , L.pack $ show spanStart
    , L.fromStrict spanName
    ]