| Safe Haskell | None |
|---|---|
| Language | GHC2024 |
Arbiter.Otel
Description
OpenTelemetry for arbiter: traces, metrics and logs.
Spans and trace-context propagation are built in. This module is the SDK side.
runWorkerPools installs the exporters and instruments the pools. The With variants
take a handle the caller installed itself.
import Arbiter.Hasql qualified as ArbH import Arbiter.Otel qualified as Otel import Arbiter.Worker qualified as Worker env <- ArbH.createHasqlEnv ... ArbH.runHasqlDb env $ Otel.runWorkerPools [Worker.namedWorkerPool emailCfg]
Synopsis
- data Telemetry = Telemetry {}
- data ArbiterMeters
- withTelemetry :: (Telemetry -> IO a) -> IO a
- withTelemetryIf :: Bool -> (Telemetry -> IO a) -> IO a
- withTelemetryFromEnv :: (Telemetry -> IO a) -> IO a
- withExternalTelemetry :: Maybe MeterProvider -> Maybe LoggerProvider -> (Telemetry -> IO a) -> IO a
- telemetryLogConfig :: Telemetry -> LogConfig -> LogConfig
- instrumentPool :: forall (m :: Type -> Type). MonadUnliftIO m => Telemetry -> NamedWorkerPool m -> NamedWorkerPool m
- instrumentPools :: forall (m :: Type -> Type). MonadUnliftIO m => Telemetry -> [NamedWorkerPool m] -> [NamedWorkerPool m]
- instrumentConfig :: forall (m :: Type -> Type) payload. (HasKind payload, KnownSymbol (TableForPayload payload (RegistryOf m)), MonadUnliftIO m) => Telemetry -> WorkerConfig m payload -> WorkerConfig m payload
- runWorkerPools :: (MonadArbiter m, RegistryTables (RegistryOf m)) => [NamedWorkerPool m] -> m ()
- runWorkerPoolsWith :: (MonadArbiter m, RegistryTables (RegistryOf m)) => Telemetry -> LogConfig -> [NamedWorkerPool m] -> m ()
- runSelectedWorkerPools :: (MonadArbiter m, RegistryTables (RegistryOf m)) => [Text] -> [NamedWorkerPool m] -> m ()
- runSelectedWorkerPoolsWith :: (MonadArbiter m, RegistryTables (RegistryOf m)) => Telemetry -> LogConfig -> [Text] -> [NamedWorkerPool m] -> m ()
- withGauges :: (MonadArbiter m, RegistryTables (RegistryOf m)) => Telemetry -> LogConfig -> m b -> m b
- startGauges :: MonadArbiter m => Telemetry -> LogConfig -> (forall a. m a -> IO a) -> Text -> [(Text, [Text])] -> NominalDiffTime -> IO (IO ())
- data MetricName
- = JobsClaimed
- | JobsProcessed
- | JobsRetried
- | AdmissionAdmitted
- | MaintenanceRows
- | HandlerDuration
- | QueueDepth
- | QueueDepthByKind
- | QueueOldestReadyAge
- | QueueOldestInFlightAge
- | Workers
- | AdmissionKeys
- | AdmissionLimit
- | AdmissionInFlight
- | AdmissionBusiestKey
- | AdmissionTokens
- | PgTableDeadTuples
- | PgTableLiveTuples
- | PgTableVacuumAge
- | PgTableSize
- | PgTableScans
- | PgTableBlocks
- | PgTableXidAge
- | PgDbConnections
- | PgDbBackends
- | PgDbOldestTransactionAge
- | PgDbOldestQueryAge
- | DbReachable
- | GaugesAge
- metricName :: MetricName -> Text
- arbiterMetricNames :: [Text]
Setup
A running telemetry handle: instruments, provider, and resolved settings.
Constructors
| Telemetry | |
Fields
| |
data ArbiterMetersSource #
The job, admission and maintenance instruments.
withTelemetry :: (Telemetry -> IO a) -> IO aSource #
Bracketed OpenTelemetry init and shutdown. Every signal is the SDK's, resolved from
its own OTEL_ variables.
withTelemetryFromEnv is the gated form.
withTelemetryIf :: Bool -> (Telemetry -> IO a) -> IO aSource #
withTelemetry when the flag is set. An inert handle when the flag is off.
withTelemetryFromEnv :: (Telemetry -> IO a) -> IO aSource #
withTelemetry, or an inert handle when OTEL_SDK_DISABLED is true.
withExternalTelemetry :: Maybe MeterProvider -> Maybe LoggerProvider -> (Telemetry -> IO a) -> IO aSource #
Run an action with application-owned providers. Missing providers disable their applicable signals.
telemetryLogConfig :: Telemetry -> LogConfig -> LogConfigSource #
Also send the config's logs to this handle's destination. A config that discards its logs still exports them.
Instrumenting a pool
instrumentPool :: forall (m :: Type -> Type). MonadUnliftIO m => Telemetry -> NamedWorkerPool m -> NamedWorkerPool mSource #
Give a pool lifecycle metrics, maintenance metrics, and the telemetry log destination. The pool's registry queue name labels its metrics. Apply it once per pool.
instrumentPools :: forall (m :: Type -> Type). MonadUnliftIO m => Telemetry -> [NamedWorkerPool m] -> [NamedWorkerPool m]Source #
instrumentPool over a pool list.
instrumentConfig :: forall (m :: Type -> Type) payload. (HasKind payload, KnownSymbol (TableForPayload payload (RegistryOf m)), MonadUnliftIO m) => Telemetry -> WorkerConfig m payload -> WorkerConfig m payloadSource #
instrumentPool over a bare config, labelled by the payload's registry queue.
Running pools
runWorkerPools :: (MonadArbiter m, RegistryTables (RegistryOf m)) => [NamedWorkerPool m] -> m ()Source #
runWorkerPools with the SDK installed from the environment, the
pools instrumented and the gauges running. Take the handle yourself with
runWorkerPoolsWith when something else needs it.
runWorkerPoolsWith :: (MonadArbiter m, RegistryTables (RegistryOf m)) => Telemetry -> LogConfig -> [NamedWorkerPool m] -> m ()Source #
runWorkerPools over a handle the caller installed itself, with the gauge loop's
base log config.
runSelectedWorkerPools :: (MonadArbiter m, RegistryTables (RegistryOf m)) => [Text] -> [NamedWorkerPool m] -> m ()Source #
runWorkerPools over an explicit queue list.
runSelectedWorkerPoolsWith :: (MonadArbiter m, RegistryTables (RegistryOf m)) => Telemetry -> LogConfig -> [Text] -> [NamedWorkerPool m] -> m ()Source #
runSelectedWorkerPools over a handle the caller installed itself.
Gauges
withGauges :: (MonadArbiter m, RegistryTables (RegistryOf m)) => Telemetry -> LogConfig -> m b -> m bSource #
Run the registry's depth and health gauges alongside action. Nothing is scanned
when the handle has metrics off.
startGauges :: MonadArbiter m => Telemetry -> LogConfig -> (forall a. m a -> IO a) -> Text -> [(Text, [Text])] -> NominalDiffTime -> IO (IO ())Source #
Arguments
| :: MonadArbiter m | |
| => Telemetry | |
| -> LogConfig | Base log config for the loop. |
| -> (forall a. m a -> IO a) | Runs a database action. |
| -> Text | |
| -> [(Text, [Text])] | Each queue table and its payload kind labels. |
| -> NominalDiffTime | Refresh interval. The minimum is one second. |
| -> IO (IO ()) |
Register gauge instruments and return their refresh loop. Run the loop on its own thread. It runs until it is stopped. A stopped loop leaves the last readings in place. With metrics off, the loop returns at once.
Metric names
data MetricNameSource #
Every instrument the library registers. A job's kind attribute is absent when its
label is not declared.
Constructors
| JobsClaimed | Counter, no unit. Attributes: |
| JobsProcessed | Counter, no unit. Attributes: |
| JobsRetried | Counter, no unit. Attributes: |
| AdmissionAdmitted | Counter, no unit. Attributes: |
| MaintenanceRows | Counter, no unit. Attributes: |
| HandlerDuration | Histogram, |
| QueueDepth | Gauge, |
| QueueDepthByKind | Gauge, |
| QueueOldestReadyAge | Gauge, |
| QueueOldestInFlightAge | Gauge, |
| Workers | Gauge, |
| AdmissionKeys | Gauge, |
| AdmissionLimit | Gauge, |
| AdmissionInFlight | Gauge, |
| AdmissionBusiestKey | Gauge, |
| AdmissionTokens | Gauge, |
| PgTableDeadTuples | Gauge, |
| PgTableLiveTuples | Gauge, |
| PgTableVacuumAge | Gauge, |
| PgTableSize | Gauge, |
| PgTableScans | Counter, |
| PgTableBlocks | Counter, |
| PgTableXidAge | Gauge, |
| PgDbConnections | Gauge, |
| PgDbBackends | Gauge, |
| PgDbOldestTransactionAge | Gauge, |
| PgDbOldestQueryAge | Gauge, |
| DbReachable | Gauge, |
| GaugesAge | Gauge, |
Instances
| Eq MetricName Source # | |
Defined in Arbiter.Otel.MetricNames | |
| Bounded MetricName Source # | |
Defined in Arbiter.Otel.MetricNames | |
| Enum MetricName Source # | |
Defined in Arbiter.Otel.MetricNames Methods succ :: MetricName -> MetricName# pred :: MetricName -> MetricName# toEnum :: Int -> MetricName# fromEnum :: MetricName -> Int# enumFrom :: MetricName -> [MetricName]# enumFromThen :: MetricName -> MetricName -> [MetricName]# enumFromTo :: MetricName -> MetricName -> [MetricName]# enumFromThenTo :: MetricName -> MetricName -> MetricName -> [MetricName]# | |
| Show MetricName Source # | |
Defined in Arbiter.Otel.MetricNames Methods showsPrec :: Int -> MetricName -> ShowS# show :: MetricName -> String# showList :: [MetricName] -> ShowS# | |
metricName :: MetricName -> TextSource #
The exported name of a metric.
arbiterMetricNames :: [Text]Source #
Every metric name arbiter exports.