packages feed

hs-opentelemetry-api-1.0.0.0: src/OpenTelemetry/Debug/MetricExport.hs

{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}

{- |
Module      :  OpenTelemetry.Debug.MetricExport
Copyright   :  (c) Ian Duncan, 2026
License     :  BSD-3
Description :  Human-readable rendering of 'ResourceMetricsExport' batches for tests and debugging.
Stability   :  experimental

This is not a stable interchange format.
-}
module OpenTelemetry.Debug.MetricExport (
  renderResourceMetricsExportDebug,
) where

import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Data.Text.Lazy.Builder (Builder, fromText, toLazyText)
import Data.Text.Lazy.Builder.Int (decimal)
import qualified Data.Vector as V
import OpenTelemetry.Exporter.Metric (
  MetricExport (..),
  ResourceMetricsExport (..),
  ScopeMetricsExport (..),
 )


{- | Multi-line text summary (not Prometheus or OTLP format).

@since 0.0.1.0
-}
renderResourceMetricsExportDebug :: [ResourceMetricsExport] -> Text
renderResourceMetricsExportDebug rs =
  T.intercalate "\n---\n" (fmap renderResource rs)


renderResource :: ResourceMetricsExport -> Text
renderResource ResourceMetricsExport {..} =
  T.intercalate "\n" $
    "ResourceMetricsExport"
      : fmap renderScope (V.toList resourceMetricsScopes)


renderScope :: ScopeMetricsExport -> Text
renderScope ScopeMetricsExport {..} =
  T.intercalate "\n" $
    "  ScopeMetricsExport"
      : fmap (\m -> T.append "    " (renderMetric m)) (V.toList scopeMetricsExports)


renderMetric :: MetricExport -> Text
renderMetric = TL.toStrict . toLazyText . renderMetricB


renderMetricB :: MetricExport -> Builder
renderMetricB = \case
  MetricExportSum n d u _ m i _ pts ->
    "Sum "
      <> fromText n
      <> " "
      <> fromText d
      <> " "
      <> fromText u
      <> " monotonic="
      <> showBool m
      <> " isInt="
      <> showBool i
      <> " nPts="
      <> decimal (V.length pts)
  MetricExportHistogram n d u _ _ pts ->
    "Histogram "
      <> fromText n
      <> " "
      <> fromText d
      <> " "
      <> fromText u
      <> " nPts="
      <> decimal (V.length pts)
  MetricExportExponentialHistogram n d u _ _ pts ->
    "ExponentialHistogram "
      <> fromText n
      <> " "
      <> fromText d
      <> " "
      <> fromText u
      <> " nPts="
      <> decimal (V.length pts)
  MetricExportGauge n d u _ i pts ->
    "Gauge "
      <> fromText n
      <> " "
      <> fromText d
      <> " "
      <> fromText u
      <> " isInt="
      <> showBool i
      <> " nPts="
      <> decimal (V.length pts)


showBool :: Bool -> Builder
showBool True = "True"
showBool False = "False"