| Copyright | (c) Ian Duncan 2026 |
|---|---|
| License | BSD-3 |
| Stability | experimental |
| Safe Haskell | None |
| Language | Haskell2010 |
OpenTelemetry.Metric.Core
Description
Overview
This module defines the Metrics API for recording measurements in your application. Libraries use this API to record metrics; the SDK provides the actual aggregation and export.
Application authors should import OpenTelemetry.Metric from the SDK
package instead, which re-exports everything here plus SDK initialization.
Quick example
import OpenTelemetry.Metric.Core
main :: IO ()
main = do
-- Obtain the global MeterProvider (set up by the SDK)
mp <- getGlobalMeterProvider
meter <- getMeter mp myInstrumentationLibrary
-- Create instruments
requestCounter <- meterCreateCounterInt64 meter "http.requests" "" Nothing defaultAdvisoryParameters
latencyHist <- meterCreateHistogram meter "http.request.duration" "ms" Nothing defaultAdvisoryParameters
-- Record measurements
counterAdd requestCounter 1 [("method", toAttribute GET)]
histogramRecord latencyHist 42.5 [("method", toAttribute GET)]
Instrument types
Synchronous instruments
These are called inline with your application code:
Counter: monotonically increasing sum (e.g. request count, bytes sent). UsecounterAdd counter value attrs.UpDownCounter: sum that can increase or decrease (e.g. active connections, queue depth). UseupDownCounterAdd counter value attrs.Histogram: distribution of values (e.g. request latency, payload size). UsehistogramRecord histogram value attrs.Gauge: point-in-time value (e.g. CPU temperature, memory usage). UsegaugeRecord gauge value attrs.
Asynchronous (observable) instruments
These are read by callbacks during export:
ObservableCounter: monotonic sum read on demand (e.g. CPU time).ObservableUpDownCounter: bidirectional sum read on demand.ObservableGauge: snapshot value read on demand (e.g. disk free space).
Register a callback when creating the instrument:
obsGauge <- meterCreateObservableGaugeDouble meter "system.memory.usage" By Nothing defaultAdvisoryParameters (result -> do memInfo <- getMemoryUsage observeDouble result memInfo [("state", toAttribute "used")] )
No-op behavior
Before the SDK is installed, noopMeterProvider is the global default.
All measurements are silently discarded. This makes it safe for libraries
to instrument unconditionally.
Spec reference
Synopsis
- data MeterProvider = MeterProvider {
- meterProviderGetMeter :: !(InstrumentationLibrary -> IO Meter)
- meterProviderShutdown :: !(Maybe Int -> IO ShutdownResult)
- meterProviderForceFlush :: !(Maybe Int -> IO FlushResult)
- getMeter :: MeterProvider -> InstrumentationLibrary -> IO Meter
- noopMeterProvider :: MeterProvider
- noopMeter :: InstrumentationLibrary -> Meter
- shutdownMeterProvider :: MeterProvider -> Maybe Int -> IO ShutdownResult
- forceFlushMeterProvider :: MeterProvider -> Maybe Int -> IO FlushResult
- getGlobalMeterProvider :: MonadIO m => m MeterProvider
- setGlobalMeterProvider :: MonadIO m => MeterProvider -> m ()
- data Meter = Meter {
- meterInstrumentationScope :: !InstrumentationLibrary
- meterCreateCounterInt64 :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> IO (Counter Int64))
- meterCreateCounterDouble :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> IO (Counter Double))
- meterCreateUpDownCounterInt64 :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> IO (UpDownCounter Int64))
- meterCreateUpDownCounterDouble :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> IO (UpDownCounter Double))
- meterCreateHistogram :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> IO Histogram)
- meterCreateGaugeInt64 :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> IO (Gauge Int64))
- meterCreateGaugeDouble :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> IO (Gauge Double))
- meterCreateObservableCounterInt64 :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> [ObservableResult Int64 -> IO ()] -> IO (ObservableCounter Int64))
- meterCreateObservableCounterDouble :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> [ObservableResult Double -> IO ()] -> IO (ObservableCounter Double))
- meterCreateObservableUpDownCounterInt64 :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> [ObservableResult Int64 -> IO ()] -> IO (ObservableUpDownCounter Int64))
- meterCreateObservableUpDownCounterDouble :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> [ObservableResult Double -> IO ()] -> IO (ObservableUpDownCounter Double))
- meterCreateObservableGaugeInt64 :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> [ObservableResult Int64 -> IO ()] -> IO (ObservableGauge Int64))
- meterCreateObservableGaugeDouble :: !(Text -> Maybe Text -> Maybe Text -> AdvisoryParameters -> [ObservableResult Double -> IO ()] -> IO (ObservableGauge Double))
- data InstrumentKind
- data HistogramAggregation
- data AdvisoryParameters = AdvisoryParameters {}
- defaultAdvisoryParameters :: AdvisoryParameters
- data Counter a = Counter {
- counterAdd :: !(a -> Attributes -> IO ())
- counterEnabled :: !(IO Bool)
- data UpDownCounter a = UpDownCounter {
- upDownCounterAdd :: !(a -> Attributes -> IO ())
- upDownCounterEnabled :: !(IO Bool)
- data Histogram = Histogram {
- histogramRecord :: !(Double -> Attributes -> IO ())
- histogramEnabled :: !(IO Bool)
- data Gauge a = Gauge {
- gaugeRecord :: !(a -> Attributes -> IO ())
- gaugeEnabled :: !(IO Bool)
- newtype ObservableResult a = ObservableResult {
- observe :: a -> Attributes -> IO ()
- newtype ObservableCallbackHandle = ObservableCallbackHandle {}
- data ObservableCounter a = ObservableCounter {}
- data ObservableUpDownCounter a = ObservableUpDownCounter {}
- data ObservableGauge a = ObservableGauge {}
- validateInstrumentName :: Text -> Maybe Text
- validateInstrumentUnit :: Text -> Maybe Text
Provider
data MeterProvider Source #
Entry point for metrics API (spec: global default SHOULD exist).
Since: 0.0.1.0
Constructors
| MeterProvider | |
Fields
| |
getMeter :: MeterProvider -> InstrumentationLibrary -> IO Meter Source #
Preferred accessor for obtaining a Meter (spec: Get a Meter).
Since: 0.0.1.0
noopMeterProvider :: MeterProvider Source #
No-op provider: safe for libraries; all measurements are discarded.
Since: 0.0.1.0
noopMeter :: InstrumentationLibrary -> Meter Source #
A Meter that records no telemetry (used by noopMeterProvider).
Since: 0.0.1.0
shutdownMeterProvider Source #
Arguments
| :: MeterProvider | |
| -> Maybe Int | Optional timeout in microseconds. |
| -> IO ShutdownResult |
Since: 0.0.1.0
forceFlushMeterProvider Source #
Arguments
| :: MeterProvider | |
| -> Maybe Int | Optional timeout in microseconds. |
| -> IO FlushResult |
Since: 0.0.1.0
getGlobalMeterProvider :: MonadIO m => m MeterProvider Source #
Since: 0.0.1.0
setGlobalMeterProvider :: MonadIO m => MeterProvider -> m () Source #
Since: 0.0.1.0
Meter
Creates instruments for a single instrumentation scope.
| All instrument factory functions take: name, optional unit, optional description, advisory parameters. Observable factories additionally take initial callbacks.
Since: 0.0.1.0
Constructors
Instruments
data InstrumentKind Source #
Instrument kinds from the metrics API specification.
Since: 0.0.1.0
Constructors
| KindCounter | |
| KindAsyncCounter | |
| KindUpDownCounter | |
| KindAsyncUpDownCounter | |
| KindHistogram | |
| KindGauge | |
| KindAsyncGauge |
Instances
data HistogramAggregation Source #
Histogram aggregation chosen for an instrument (explicit bounds vs exponential).
Since: 0.0.1.0
Constructors
| HistogramAggregationExplicit !(Vector Double) | |
| HistogramAggregationExponential !Int32 | Exponential histogram scale (OTel mapping index uses |
Instances
| Generic HistogramAggregation Source # | |||||
Defined in OpenTelemetry.Internal.Metric.Types Associated Types
Methods from :: HistogramAggregation -> Rep HistogramAggregation x # to :: Rep HistogramAggregation x -> HistogramAggregation # | |||||
| Show HistogramAggregation Source # | |||||
Defined in OpenTelemetry.Internal.Metric.Types Methods showsPrec :: Int -> HistogramAggregation -> ShowS # show :: HistogramAggregation -> String # showList :: [HistogramAggregation] -> ShowS # | |||||
| Eq HistogramAggregation Source # | |||||
Defined in OpenTelemetry.Internal.Metric.Types Methods (==) :: HistogramAggregation -> HistogramAggregation -> Bool # (/=) :: HistogramAggregation -> HistogramAggregation -> Bool # | |||||
| Hashable HistogramAggregation Source # | |||||
Defined in OpenTelemetry.Internal.Metric.Types | |||||
| type Rep HistogramAggregation Source # | |||||
Defined in OpenTelemetry.Internal.Metric.Types type Rep HistogramAggregation = D1 ('MetaData "HistogramAggregation" "OpenTelemetry.Internal.Metric.Types" "hs-opentelemetry-api-1.0.0.0-inplace" 'False) (C1 ('MetaCons "HistogramAggregationExplicit" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Vector Double))) :+: C1 ('MetaCons "HistogramAggregationExponential" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Int32))) | |||||
data AdvisoryParameters Source #
Advisory parameters (spec: implementations MAY ignore; SDK SHOULD honor where defined).
Since: 0.0.1.0
Constructors
| AdvisoryParameters | |
Fields
| |
Instances
| Generic AdvisoryParameters Source # | |||||
Defined in OpenTelemetry.Internal.Metric.Types Associated Types
Methods from :: AdvisoryParameters -> Rep AdvisoryParameters x # to :: Rep AdvisoryParameters x -> AdvisoryParameters # | |||||
| Show AdvisoryParameters Source # | |||||
Defined in OpenTelemetry.Internal.Metric.Types Methods showsPrec :: Int -> AdvisoryParameters -> ShowS # show :: AdvisoryParameters -> String # showList :: [AdvisoryParameters] -> ShowS # | |||||
| Eq AdvisoryParameters Source # | |||||
Defined in OpenTelemetry.Internal.Metric.Types Methods (==) :: AdvisoryParameters -> AdvisoryParameters -> Bool # (/=) :: AdvisoryParameters -> AdvisoryParameters -> Bool # | |||||
| type Rep AdvisoryParameters Source # | |||||
Defined in OpenTelemetry.Internal.Metric.Types type Rep AdvisoryParameters = D1 ('MetaData "AdvisoryParameters" "OpenTelemetry.Internal.Metric.Types" "hs-opentelemetry-api-1.0.0.0-inplace" 'False) (C1 ('MetaCons "AdvisoryParameters" 'PrefixI 'True) (S1 ('MetaSel ('Just "advisoryExplicitBucketBoundaries") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe [Double])) :*: (S1 ('MetaSel ('Just "advisoryAttributeKeys") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe [Text])) :*: S1 ('MetaSel ('Just "advisoryHistogramAggregation") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe HistogramAggregation))))) | |||||
defaultAdvisoryParameters :: AdvisoryParameters Source #
Since: 0.0.1.0
Constructors
| Counter | |
Fields
| |
data UpDownCounter a Source #
Synchronous additive instrument that may increase or decrease.
Since: 0.0.1.0
Constructors
| UpDownCounter | |
Fields
| |
Synchronous histogram (records Double measurements).
Since: 0.0.1.0
Constructors
| Histogram | |
Fields
| |
Synchronous gauge (last value wins per collect cycle semantics in SDK).
Since: 0.0.1.0
Constructors
| Gauge | |
Fields
| |
newtype ObservableResult a Source #
Result handle passed to observable callbacks (spec: observe measurements at one logical instant).
Since: 0.0.1.0
Constructors
| ObservableResult | |
Fields
| |
newtype ObservableCallbackHandle Source #
Handle to unregister a callback registered after instrument creation.
Since: 0.0.1.0
Constructors
| ObservableCallbackHandle | |
Fields
| |
data ObservableCounter a Source #
Asynchronous counter: monotonic cumulative values observed per collection.
Since: 0.0.1.0
Constructors
| ObservableCounter | |
Fields
| |
data ObservableUpDownCounter a Source #
Asynchronous up-down counter.
Since: 0.0.1.0
Constructors
| ObservableUpDownCounter | |
Fields
| |
data ObservableGauge a Source #
Asynchronous gauge.
Since: 0.0.1.0
Constructors
| ObservableGauge | |
Fields
| |